Make WordPress Core


Ignore:
Timestamp:
03/21/2016 09:58:02 PM (10 years ago)
Author:
westonruter
Message:

Customize: Require opt-in for selective refresh of widgets.

  • Introduces customize-selective-refresh-widgets theme support feature and adds to themes.
  • Introduces customize_selective_refresh arg for WP_Widget::$widget_options and adds to all core widgets.
  • Remove selective_refresh from being a component that can be removed via customize_loaded_components filter.
  • Add WP_Customize_Widgets::get_selective_refreshable_widgets() and WP_Customize_Widgets::is_widget_selective_refreshable().
  • Fix default selector for Partial instances.
  • Implement and improve Masronry sidebar refresh logic in Twenty Thirteen and Twenty Fourteen, including preservation of initial widget position after refresh.
  • Re-initialize ME.js when refreshing Twenty_Fourteen_Ephemera_Widget.

See #27355.
Fixes #35855.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/customize/widgets.php

    r36611 r37040  
    2525                require_once( ABSPATH . WPINC . '/class-wp-customize-manager.php' );
    2626
     27                add_theme_support( 'customize-selective-refresh-widgets' );
    2728                $user_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
    2829                wp_set_current_user( $user_id );
     
    4849        }
    4950
     51        function clean_up_global_scope() {
     52                global $wp_widget_factory, $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;
     53
     54                $wp_registered_sidebars = array();
     55                $wp_registered_widgets = array();
     56                $wp_registered_widget_controls = array();
     57                $wp_registered_widget_updates = array();
     58                $wp_widget_factory->widgets = array();
     59
     60                parent::clean_up_global_scope();
     61        }
     62
    5063        function tearDown() {
    5164                $this->manager = null;
     
    7689                $this->assertInstanceOf( 'WP_Customize_Widgets', $this->manager->widgets );
    7790                $this->assertEquals( $this->manager, $this->manager->widgets->manager );
     91        }
     92
     93        /**
     94         * Tests WP_Customize_Widgets::get_selective_refreshable_widgets().
     95         *
     96         * @see WP_Customize_Widgets::get_selective_refreshable_widgets()
     97         */
     98        function test_get_selective_refreshable_widgets_when_theme_supports() {
     99                global $wp_widget_factory;
     100                add_action( 'widgets_init', array( $this, 'override_search_widget_customize_selective_refresh' ), 90 );
     101                add_theme_support( 'customize-selective-refresh-widgets' );
     102                $this->do_customize_boot_actions();
     103
     104                $selective_refreshable_widgets = $this->manager->widgets->get_selective_refreshable_widgets();
     105                $this->assertInternalType( 'array', $selective_refreshable_widgets );
     106                $this->assertEquals( count( $wp_widget_factory->widgets ), count( $selective_refreshable_widgets ) );
     107                $this->assertArrayHasKey( 'text', $selective_refreshable_widgets );
     108                $this->assertTrue( $selective_refreshable_widgets['text'] );
     109                $this->assertArrayHasKey( 'search', $selective_refreshable_widgets );
     110                $this->assertFalse( $selective_refreshable_widgets['search'] );
     111        }
     112
     113        /**
     114         * Tests WP_Customize_Widgets::get_selective_refreshable_widgets().
     115         *
     116         * @see WP_Customize_Widgets::get_selective_refreshable_widgets()
     117         */
     118        function test_get_selective_refreshable_widgets_when_no_theme_supports() {
     119                add_action( 'widgets_init', array( $this, 'override_search_widget_customize_selective_refresh' ), 90 );
     120                remove_theme_support( 'customize-selective-refresh-widgets' );
     121                $this->do_customize_boot_actions();
     122                $selective_refreshable_widgets = $this->manager->widgets->get_selective_refreshable_widgets();
     123                $this->assertEmpty( $selective_refreshable_widgets );
     124        }
     125
     126        /**
     127         * Hook into widgets_init to override the search widget's customize_selective_refresh widget option.
     128         *
     129         * @see Tests_WP_Customize_Widgets::test_get_selective_refreshable_widgets_when_theme_supports()
     130         * @see Tests_WP_Customize_Widgets::test_get_selective_refreshable_widgets_when_no_theme_supports()
     131         */
     132        function override_search_widget_customize_selective_refresh() {
     133                global $wp_widget_factory;
     134                $wp_widget_factory->widgets['WP_Widget_Search']->widget_options['customize_selective_refresh'] = false;
     135        }
     136
     137        /**
     138         * Tests WP_Customize_Widgets::is_widget_selective_refreshable().
     139         *
     140         * @see WP_Customize_Widgets::is_widget_selective_refreshable()
     141         */
     142        function test_is_widget_selective_refreshable() {
     143                add_action( 'widgets_init', array( $this, 'override_search_widget_customize_selective_refresh' ), 90 );
     144                add_theme_support( 'customize-selective-refresh-widgets' );
     145                $this->do_customize_boot_actions();
     146                $this->assertFalse( $this->manager->widgets->is_widget_selective_refreshable( 'search' ) );
     147                $this->assertTrue( $this->manager->widgets->is_widget_selective_refreshable( 'text' ) );
     148                remove_theme_support( 'customize-selective-refresh-widgets' );
     149                $this->assertFalse( $this->manager->widgets->is_widget_selective_refreshable( 'text' ) );
    78150        }
    79151
     
    117189         */
    118190        function test_get_setting_args() {
     191                add_theme_support( 'customize-selective-refresh-widgets' );
     192                $this->do_customize_boot_actions();
    119193
    120194                add_filter( 'widget_customizer_setting_args', array( $this, 'filter_widget_customizer_setting_args' ), 10, 2 );
     195
     196                $default_args = array(
     197                        'type' => 'option',
     198                        'capability' => 'edit_theme_options',
     199                        'transport' => 'refresh',
     200                        'default' => array(),
     201                        'sanitize_callback' => array( $this->manager->widgets, 'sanitize_widget_instance' ),
     202                        'sanitize_js_callback' => array( $this->manager->widgets, 'sanitize_widget_js_instance' ),
     203                );
     204                $args = $this->manager->widgets->get_setting_args( 'widget_foo[2]' );
     205                foreach ( $default_args as $key => $default_value ) {
     206                        $this->assertEquals( $default_value, $args[ $key ] );
     207                }
     208                $this->assertEquals( 'WIDGET_FOO[2]', $args['uppercase_id_set_by_filter'] );
    121209
    122210                $default_args = array(
     
    128216                        'sanitize_js_callback' => array( $this->manager->widgets, 'sanitize_widget_js_instance' ),
    129217                );
    130 
    131                 $args = $this->manager->widgets->get_setting_args( 'widget_foo[2]' );
     218                $args = $this->manager->widgets->get_setting_args( 'widget_search[2]' );
    132219                foreach ( $default_args as $key => $default_value ) {
    133220                        $this->assertEquals( $default_value, $args[ $key ] );
    134221                }
    135                 $this->assertEquals( 'WIDGET_FOO[2]', $args['uppercase_id_set_by_filter'] );
     222
     223                remove_theme_support( 'customize-selective-refresh-widgets' );
     224                $args = $this->manager->widgets->get_setting_args( 'widget_search[2]' );
     225                $this->assertEquals( 'refresh', $args['transport'] );
     226                add_theme_support( 'customize-selective-refresh-widgets' );
    136227
    137228                $override_args = array(
     
    369460                $this->assertTrue( $args['container_inclusive'] );
    370461                $this->assertFalse( $args['fallback_refresh'] );
     462
     463                remove_theme_support( 'customize-selective-refresh-widgets' );
     464                $args = apply_filters( 'customize_dynamic_partial_args', false, 'widget[search-2]' );
     465                $this->assertFalse( $args );
    371466        }
    372467
     
    376471         * @see WP_Customize_Widgets::selective_refresh_init()
    377472         */
    378         function test_selective_refresh_init() {
     473        function test_selective_refresh_init_with_theme_support() {
     474                add_theme_support( 'customize-selective-refresh-widgets' );
    379475                $this->manager->widgets->selective_refresh_init();
    380                 $this->assertEquals( 10, has_action( 'wp_enqueue_scripts', array( $this->manager->widgets, 'customize_preview_enqueue_deps' ) ) );
    381476                $this->assertEquals( 10, has_action( 'dynamic_sidebar_before', array( $this->manager->widgets, 'start_dynamic_sidebar' ) ) );
    382477                $this->assertEquals( 10, has_action( 'dynamic_sidebar_after', array( $this->manager->widgets, 'end_dynamic_sidebar' ) ) );
     
    386481
    387482        /**
    388          * Test WP_Customize_Widgets::customize_preview_enqueue_deps().
    389          *
    390          * @see WP_Customize_Widgets::customize_preview_enqueue_deps()
    391          */
    392         function test_customize_preview_enqueue_deps() {
    393                 $this->manager->widgets->customize_preview_enqueue_deps();
     483         * Test WP_Customize_Widgets::selective_refresh_init().
     484         *
     485         * @see WP_Customize_Widgets::selective_refresh_init()
     486         */
     487        function test_selective_refresh_init_without_theme_support() {
     488                remove_theme_support( 'customize-selective-refresh-widgets' );
     489                $this->manager->widgets->selective_refresh_init();
     490                $this->assertFalse( has_action( 'dynamic_sidebar_before', array( $this->manager->widgets, 'start_dynamic_sidebar' ) ) );
     491                $this->assertFalse( has_action( 'dynamic_sidebar_after', array( $this->manager->widgets, 'end_dynamic_sidebar' ) ) );
     492                $this->assertFalse( has_filter( 'dynamic_sidebar_params', array( $this->manager->widgets, 'filter_dynamic_sidebar_params' ) ) );
     493                $this->assertFalse( has_filter( 'wp_kses_allowed_html', array( $this->manager->widgets, 'filter_wp_kses_allowed_data_attributes' ) ) );
     494        }
     495
     496        /**
     497         * Test WP_Customize_Widgets::customize_preview_enqueue().
     498         *
     499         * @see WP_Customize_Widgets::customize_preview_enqueue()
     500         */
     501        function test_customize_preview_enqueue() {
     502                $this->manager->widgets->customize_preview_enqueue();
    394503                $this->assertTrue( wp_script_is( 'customize-preview-widgets', 'enqueued' ) );
    395504                $this->assertTrue( wp_style_is( 'customize-preview', 'enqueued' ) );
     
    459568         */
    460569        function test_render_widget_partial() {
     570                add_theme_support( 'customize-selective-refresh-widgets' );
     571                $this->do_customize_boot_actions();
    461572                $this->manager->widgets->selective_refresh_init();
    462573
Note: See TracChangeset for help on using the changeset viewer.