From 3b282310016312336072895d455d4084c184f9b2 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Wed, 27 Jul 2016 16:26:22 +0000 Subject: [PATCH] Customize: Prevent customize-preview-widgets JS errors in preview if a sidebar is registered with empty before_widget/after_widget params. Selective refresh will not be available for widgets when they lack these params, so previewing will fallback to full page refreshes. Sidebars registered as such should be rare so this accounts for an edge case. Fixes #37478. git-svn-id: https://develop.svn.wordpress.org/trunk@38166 602fd350-edb4-49c9-b593-d223f7449a82 --- .../js/customize-preview-widgets.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/wp-includes/js/customize-preview-widgets.js b/src/wp-includes/js/customize-preview-widgets.js index 6702bffe7d..47972784f9 100644 --- a/src/wp-includes/js/customize-preview-widgets.js +++ b/src/wp-includes/js/customize-preview-widgets.js @@ -376,6 +376,11 @@ wp.customize.widgetsPreview = wp.customize.WidgetCustomizerPreview = (function( sidebarPartial.params.sidebarArgs.after_widget ); + // Handle rare case where before_widget and after_widget are empty. + if ( ! widgetContainerElement[0] ) { + return; + } + widgetContainerElement.attr( 'data-customize-partial-id', widgetPartial.id ); widgetContainerElement.attr( 'data-customize-partial-type', 'widget' ); widgetContainerElement.attr( 'data-customize-widget-id', widgetId ); @@ -521,21 +526,18 @@ wp.customize.widgetsPreview = wp.customize.WidgetCustomizerPreview = (function( widgetClasses; emptyWidget = $( widgetTpl ); - widgetSelector = emptyWidget.prop( 'tagName' ); - widgetClasses = emptyWidget.prop( 'className' ); - - // Remove class names that incorporate the string formatting placeholders %1$s and %2$s. - widgetClasses = widgetClasses.replace( /\S*%[12]\$s\S*/g, '' ); - widgetClasses = widgetClasses.replace( /^\s+|\s+$/g, '' ); + widgetSelector = emptyWidget.prop( 'tagName' ) || ''; + widgetClasses = emptyWidget.prop( 'className' ) || ''; // Prevent a rare case when before_widget, before_title, after_title and after_widget is empty. if ( ! widgetClasses ) { return; } - if ( widgetClasses ) { - widgetSelector += '.' + widgetClasses.split( /\s+/ ).join( '.' ); - } + // Remove class names that incorporate the string formatting placeholders %1$s and %2$s. + widgetClasses = widgetClasses.replace( /\S*%[12]\$s\S*/g, '' ); + widgetClasses = widgetClasses.replace( /^\s+|\s+$/g, '' ); + widgetSelector += '.' + widgetClasses.split( /\s+/ ).join( '.' ); self.widgetSelectors.push( widgetSelector ); }); };