Theme Customizer: Add CORS checks to the initial check for customize support. Prevents flash of customize links on large pages. see #20582, #19910.

Add wp_customize_support_script(), to quickly alter the body class based on whether customize is supported.


git-svn-id: http://core.svn.wordpress.org/trunk@20893 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
koopersmith 2012-05-25 00:15:12 +00:00
parent bff286c100
commit d8abece877
2 changed files with 43 additions and 7 deletions

View File

@ -97,15 +97,10 @@ $admin_body_class .= ' no-customize-support';
<body class="wp-admin no-js <?php echo apply_filters( 'admin_body_class', '' ) . " $admin_body_class"; ?>">
<script type="text/javascript">
document.body.className = document.body.className.replace('no-js','js');
<?php
// If the customize loader is enqueued, then add the 'customize-support' class early.
// This prevents a flash of unstyled content.
if ( wp_script_is( 'customize-loader', 'queue' ) ) : ?>
if ( window.postMessage )
document.body.className = document.body.className.replace('no-customize-support','customize-support');
<?php endif; ?>
</script>
<?php wp_customize_support_script(); ?>
<div id="wpwrap">
<?php require(ABSPATH . 'wp-admin/menu-header.php'); ?>
<div id="wpcontent">

View File

@ -1618,3 +1618,44 @@ add_action( 'admin_enqueue_scripts', '_wp_customize_loader_settings' );
function wp_customize_url( $stylesheet ) {
return esc_url( admin_url( 'customize.php' ) . '?theme=' . $stylesheet );
}
/**
* Prints a script to check whether or not the customizer is supported,
* and apply either the no-customize-support or customize-support class
* to the body.
*
* This function MUST be called inside the body tag.
*
* Ideally, call this function immediately after the body tag is opened.
* This prevents a flash of unstyled content.
*
* It is also recommended that you add the "no-customize-support" class
* to the body tag by default.
*
* @since 3.4.0
*/
function wp_customize_support_script() {
if ( ! wp_script_is( 'customize-loader', 'queue' ) )
return;
$admin_origin = parse_url( admin_url() );
$home_origin = parse_url( home_url() );
$cross_domain = ( strtolower( $admin_origin[ 'host' ] ) != strtolower( $home_origin[ 'host' ] ) );
?>
<script type="text/javascript">
(function() {
var request, b = document.body, c = 'className', cs = 'customize-support', rcs = new RegExp('(^|\\s+)(no-)?'+cs+'(\\s+|$)');
<?php if ( $cross_domain ): ?>
request = (function(){ var xhr = new XMLHttpRequest(); return ('withCredentials' in xhr); })();
<?php else: ?>
request = true;
<?php endif; ?>
b[c] = b[c].replace( rcs, '' );
b[c] += ( window.postMessage && request ? ' ' : ' no-' ) + cs;
}());
</script>
<?php
}