Make WordPress Core


Ignore:
Timestamp:
03/21/2016 09:58:02 PM (9 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.