WordPress.org

Make WordPress Core

Ticket #39693: 39693.8.diff

File 39693.8.diff, 22.5 KB (added by obenland, 9 months ago)
  • src/wp-includes/theme.php

     
    679679function switch_theme( $stylesheet ) {
    680680        global $wp_theme_directories, $wp_customize, $sidebars_widgets;
    681681
    682         $_sidebars_widgets = null;
    683         if ( 'wp_ajax_customize_save' === current_action() ) {
    684                 $_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) );
    685         } elseif ( is_array( $sidebars_widgets ) ) {
    686                 $_sidebars_widgets = $sidebars_widgets;
    687         }
    688 
    689         if ( is_array( $_sidebars_widgets ) ) {
    690                 set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $_sidebars_widgets ) );
    691         }
    692 
    693682        $nav_menu_locations = get_theme_mod( 'nav_menu_locations' );
    694683        add_option( 'theme_switch_menu_locations', $nav_menu_locations );
    695684
     
    716705
    717706        update_option( 'current_theme', $new_name );
    718707
     708        $_sidebars_widgets = null;
     709        if ( 'wp_ajax_customize_save' === current_action() ) {
     710                $old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' );
     711                if ( $old_sidebars_widgets_data_setting ) {
     712                        $_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting );
     713                }
     714        } elseif ( is_array( $sidebars_widgets ) ) {
     715                $_sidebars_widgets = $sidebars_widgets;
     716        }
     717
     718        if ( is_array( $_sidebars_widgets ) ) {
     719                set_theme_mod( 'sidebars_widgets', array(
     720                        'time' => time(),
     721                        'data' => $_sidebars_widgets,
     722                ) );
     723        }
     724
    719725        // Migrate from the old mods_{name} option to theme_mods_{slug}.
    720726        if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {
    721727                $default_theme_mods = (array) get_option( 'mods_' . $new_name );
  • src/wp-includes/widgets.php

     
    919919 * @since 2.2.0
    920920 * @access private
    921921 *
     922 * @global array $_wp_sidebars_widgets
    922923 * @param array $sidebars_widgets Sidebar widgets and their settings.
    923924 */
    924925function wp_set_sidebars_widgets( $sidebars_widgets ) {
    925         if ( !isset( $sidebars_widgets['array_version'] ) )
     926        global $_wp_sidebars_widgets;
     927
     928        // Clear cached value used in wp_get_sidebars_widgets().
     929        $_wp_sidebars_widgets = null;
     930
     931        if ( ! isset( $sidebars_widgets['array_version'] ) ) {
    926932                $sidebars_widgets['array_version'] = 3;
     933        }
     934
    927935        update_option( 'sidebars_widgets', $sidebars_widgets );
    928936}
    929937
     
    11131121 *
    11141122 * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value
    11151123 *                                   of 'customize' defers updates for the Customizer.
    1116  * @return array|void
     1124 * @return array Updated sidebars widgets.
    11171125 */
    11181126function retrieve_widgets( $theme_changed = false ) {
    11191127        global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
    11201128
    1121         $registered_sidebar_keys = array_keys( $wp_registered_sidebars );
    1122         $orphaned = 0;
     1129        $registered_sidebars_keys = array_keys( $wp_registered_sidebars );
     1130        $registered_widgets_ids   = array_keys( $wp_registered_widgets );
     1131        $old_sidebars_widgets     = get_theme_mod( 'sidebars_widgets' );
    11231132
    1124         $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );
    11251133        if ( is_array( $old_sidebars_widgets ) ) {
    11261134                // time() that sidebars were stored is in $old_sidebars_widgets['time']
    1127                 $_sidebars_widgets = $old_sidebars_widgets['data'];
     1135                $sidebars_widgets = $old_sidebars_widgets['data'];
    11281136
    11291137                if ( 'customize' !== $theme_changed ) {
    11301138                        remove_theme_mod( 'sidebars_widgets' );
    11311139                }
     1140        } else {
     1141                if ( empty( $sidebars_widgets ) ) {
     1142                        return array();
     1143                }
    11321144
    1133                 foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
    1134                         if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) {
    1135                                 continue;
    1136                         }
     1145                unset( $sidebars_widgets['array_version'] );
    11371146
    1138                         if ( !in_array( $sidebar, $registered_sidebar_keys ) ) {
    1139                                 $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $widgets;
    1140                                 unset( $_sidebars_widgets[$sidebar] );
    1141                         }
     1147                $sidebars_widgets_keys = array_keys( $sidebars_widgets );
     1148                sort( $sidebars_widgets_keys );
     1149                sort( $registered_sidebars_keys );
     1150
     1151                if ( $sidebars_widgets_keys === $registered_sidebars_keys ) {
     1152                        $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );
     1153
     1154                        return $sidebars_widgets;
    11421155                }
    1143         } else {
    1144                 if ( empty( $sidebars_widgets ) )
    1145                         return;
     1156        }
    11461157
    1147                 unset( $sidebars_widgets['array_version'] );
     1158        // Discard invalid, theme-specific widgets from sidebars.
     1159        $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );
     1160        $sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets );
    11481161
    1149                 $old = array_keys($sidebars_widgets);
    1150                 sort($old);
    1151                 sort($registered_sidebar_keys);
    1152 
    1153                 if ( $old == $registered_sidebar_keys )
    1154                         return;
    1155 
    1156                 $_sidebars_widgets = array(
    1157                         'wp_inactive_widgets' => !empty( $sidebars_widgets['wp_inactive_widgets'] ) ? $sidebars_widgets['wp_inactive_widgets'] : array()
    1158                 );
    1159 
    1160                 unset( $sidebars_widgets['wp_inactive_widgets'] );
    1161 
    1162                 foreach ( $wp_registered_sidebars as $id => $settings ) {
    1163                         if ( $theme_changed ) {
    1164                                 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
    1165                         } else {
    1166                                 // no theme change, grab only sidebars that are currently registered
    1167                                 if ( isset( $sidebars_widgets[$id] ) ) {
    1168                                         $_sidebars_widgets[$id] = $sidebars_widgets[$id];
    1169                                         unset( $sidebars_widgets[$id] );
    1170                                 }
    1171                         }
     1162        // Find hidden/lost multi-widget instances.
     1163        $shown_widgets = call_user_func_array( 'array_merge', $sidebars_widgets );
     1164        $lost_widgets  = array_diff( $registered_widgets_ids, $shown_widgets );
     1165
     1166        foreach ( $lost_widgets as $key => $widget_id ) {
     1167                $number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id );
     1168
     1169                // Only keep active and default widgets.
     1170                if ( is_numeric( $number ) && (int) $number < 2 ) {
     1171                        unset( $lost_widgets[ $key ] );
    11721172                }
     1173        }
     1174        $sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] );
     1175
     1176        if ( 'customize' !== $theme_changed ) {
     1177                wp_set_sidebars_widgets( $sidebars_widgets );
     1178        }
     1179
     1180        return $sidebars_widgets;
     1181}
     1182
     1183/**
     1184 * Compares a list of sidebars with their widgets against a whitelist.
     1185 *
     1186 * @since 4.9.0
     1187 *
     1188 * @param array $old_sidebars_widgets List of sidebars and their widget instance IDs.
     1189 * @return array Mapped sidebars widgets.
     1190 */
     1191function wp_map_sidebars_widgets( $old_sidebars_widgets ) {
     1192        global $wp_registered_sidebars;
     1193
     1194        $new_sidebars_widgets = array(
     1195                'wp_inactive_widgets' => array(),
     1196        );
     1197
     1198        // Short-circuit if there are no sidebars to map.
     1199        if ( ! is_array( $old_sidebars_widgets ) || empty( $old_sidebars_widgets ) ) {
     1200                return $new_sidebars_widgets;
     1201        }
    11731202
    1174                 foreach ( $sidebars_widgets as $val ) {
    1175                         if ( is_array($val) && ! empty( $val ) )
    1176                                 $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
     1203        foreach ( $old_sidebars_widgets as $sidebar => $widgets ) {
     1204                if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) {
     1205                        $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets );
     1206                        unset( $old_sidebars_widgets[ $sidebar ] );
    11771207                }
    11781208        }
    11791209
    1180         // discard invalid, theme-specific widgets from sidebars
    1181         $shown_widgets = array();
     1210        // If old and new theme have just one sidebar, map it and we're done.
     1211        if ( 1 === count( $old_sidebars_widgets ) && 1 === count( $wp_registered_sidebars ) ) {
     1212                $new_sidebars_widgets[ key( $wp_registered_sidebars ) ] = array_pop( $old_sidebars_widgets );
     1213
     1214                return $new_sidebars_widgets;
     1215        }
    11821216
    1183         foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
    1184                 if ( !is_array($widgets) )
    1185                         continue;
     1217        // Map locations with the same slug.
     1218        $old_sidebars = array_keys( $old_sidebars_widgets );
    11861219
    1187                 $_widgets = array();
    1188                 foreach ( $widgets as $widget ) {
    1189                         if ( isset($wp_registered_widgets[$widget]) )
    1190                                 $_widgets[] = $widget;
     1220        foreach ( $wp_registered_sidebars as $sidebar => $name ) {
     1221                if ( in_array( $sidebar, $old_sidebars, true ) ) {
     1222                        $new_sidebars_widgets[ $sidebar ] = $old_sidebars_widgets[ $sidebar ];
     1223                        unset( $old_sidebars_widgets[ $sidebar ] );
     1224                } else {
     1225                        $new_sidebars_widgets[ $sidebar ] = array();
    11911226                }
     1227        }
    11921228
    1193                 $_sidebars_widgets[$sidebar] = $_widgets;
    1194                 $shown_widgets = array_merge($shown_widgets, $_widgets);
     1229        // If there are no old sidebars left, then we're done.
     1230        if ( empty( $old_sidebars_widgets ) ) {
     1231                return $new_sidebars_widgets;
    11951232        }
    11961233
    1197         $sidebars_widgets = $_sidebars_widgets;
    1198         unset($_sidebars_widgets, $_widgets);
     1234        /*
     1235         * If old and new theme both have sidebars that contain phrases
     1236         * from within the same group, make an educated guess and map it.
     1237         */
     1238        $common_slug_groups = array(
     1239                array( 'sidebar', 'primary', 'main', 'right' ),
     1240                array( 'second', 'left' ),
     1241                array( 'sidebar-2', 'footer', 'bottom' ),
     1242                array( 'header', 'top' ),
     1243        );
     1244
     1245        // Go through each group...
     1246        foreach ( $common_slug_groups as $slug_group ) {
    11991247
    1200         // find hidden/lost multi-widget instances
    1201         $lost_widgets = array();
    1202         foreach ( $wp_registered_widgets as $key => $val ) {
    1203                 if ( in_array($key, $shown_widgets, true) )
    1204                         continue;
     1248                // ...and see if any of these slugs...
     1249                foreach ( $slug_group as $slug ) {
    12051250
    1206                 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);
     1251                        // ...and any of the new sidebars...
     1252                        foreach ( $wp_registered_sidebars as $new_sidebar => $args ) {
     1253
     1254                                // ...actually match!
     1255                                if ( false === stripos( $new_sidebar, $slug ) && false === stripos( $slug, $new_sidebar ) ) {
     1256                                        continue;
     1257                                }
    12071258
    1208                 if ( 2 > (int) $number )
    1209                         continue;
     1259                                // Then see if any of the old sidebars...
     1260                                foreach ( $old_sidebars_widgets as $sidebar => $widgets ) {
    12101261
    1211                 $lost_widgets[] = $key;
     1262                                        // ...and any slug in the same group...
     1263                                        foreach ( $slug_group as $slug ) {
     1264
     1265                                                // ... have a match as well.
     1266                                                if ( false === stripos( $sidebar, $slug ) && false === stripos( $slug, $sidebar ) ) {
     1267                                                        continue;
     1268                                                }
     1269
     1270                                                // Make sure this sidebar wasn't mapped and removed previously.
     1271                                                if ( ! empty( $old_sidebars_widgets[ $sidebar ] ) ) {
     1272
     1273                                                        // We have a match that can be mapped!
     1274                                                        $new_sidebars_widgets[ $new_sidebar ] = array_merge( $new_sidebars_widgets[ $new_sidebar ], $old_sidebars_widgets[ $sidebar ] );
     1275
     1276                                                        // Remove the mapped sidebar so it can't be mapped again.
     1277                                                        unset( $old_sidebars_widgets[ $sidebar ] );
     1278
     1279                                                        // Go back and check the next new sidebar.
     1280                                                        continue 3;
     1281                                                }
     1282                                        } // endforeach ( $slug_group as $slug )
     1283                                } // endforeach ( $old_sidebars_widgets as $sidebar => $menu_id )
     1284                        } // endforeach foreach ( $wp_registered_sidebars as $new_sidebar => $name )
     1285                } // endforeach ( $slug_group as $slug )
     1286        } // endforeach ( $common_slug_groups as $slug_group )
     1287
     1288        foreach ( $old_sidebars_widgets as $widgets ) {
     1289                if ( is_array( $widgets ) && ! empty( $widgets ) ) {
     1290                        $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets );
     1291                }
    12121292        }
    12131293
    1214         $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
    1215         if ( 'customize' !== $theme_changed ) {
    1216                 wp_set_sidebars_widgets( $sidebars_widgets );
     1294        return $new_sidebars_widgets;
     1295}
     1296
     1297/**
     1298 * Compares a list of sidebars with their widgets against a whitelist.
     1299 *
     1300 * @since 4.9.0
     1301 *
     1302 * @param array $sidebars_widgets List of sidebars and their widget instance IDs.
     1303 * @param array $whitelist        List of widget IDs to compare against.
     1304 * @return array Sidebars with whitelisted widgets.
     1305 */
     1306function _wp_remove_unregistered_widgets( $sidebars_widgets, $whitelist ) {
     1307        foreach ( $sidebars_widgets as $sidebar => $widgets ) {
     1308                if ( is_array( $widgets ) ) {
     1309                        $sidebars_widgets[ $sidebar ] = array_intersect( $widgets, $whitelist );
     1310                }
    12171311        }
    12181312
    12191313        return $sidebars_widgets;
  • tests/phpunit/tests/widgets.php

     
    726726
    727727                $_wp_sidebars_widgets = array();
    728728                $this->assertInternalType( 'array', $result );
    729                 $this->assertNotEmpty( $result );
     729                $this->assertEquals( $result, $sidebars_widgets );
    730730
    731731                foreach ( $sidebars_widgets as $widgets ) {
    732732                        $this->assertInternalType( 'array', $widgets );
     
    734734
    735735                $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
    736736                $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
    737                 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );
    738737
    739738                // Unregistered widget should be filtered out.
    740739                $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
    741740
    742                 // 6 default widgets - 1 active text widget = 5.
    743                 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] );
     741                // 6 default widgets - 1 active text widget + 1 orphaned widget = 6.
     742                $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
     743
    744744                $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] );
    745745                $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] );
     746                $this->assertContains( 'archives-2',        $sidebars_widgets['wp_inactive_widgets'] );
    746747                $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] );
    747748                $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] );
    748749                $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
     
    775776                $result = retrieve_widgets( true );
    776777
    777778                // $sidebars_widgets matches registered sidebars.
    778                 $this->assertNull( $result );
     779                $this->assertInternalType( 'array', $result );
     780                $this->assertEquals( $result, $sidebars_widgets );
    779781
    780782                foreach ( $sidebars_widgets as $widgets ) {
    781783                        $this->assertInternalType( 'array', $widgets );
     
    784786                $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
    785787                $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
    786788
    787                 // No widget validity check when $sidebars_widgets matches registered sidebars.
    788                 $this->assertContains( 'custom_widget-1', $sidebars_widgets['sidebar-3'] );
     789                // Invalid widget removed, even when $sidebars_widgets matches registered sidebars.
     790                $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
    789791
    790792                // No lost widgets when $sidebars_widgets matches registered sidebars.
    791793                $this->assertEmpty( $sidebars_widgets['wp_inactive_widgets'] );
     
    814816
    815817                $_wp_sidebars_widgets = array();
    816818                $this->assertInternalType( 'array', $result );
    817                 $this->assertNotEmpty( $result );
     819                $this->assertEquals( $result, $sidebars_widgets );
    818820
    819821                foreach ( $sidebars_widgets as $widgets ) {
    820822                        $this->assertInternalType( 'array', $widgets );
     
    857859
    858860                $_wp_sidebars_widgets = array();
    859861                $this->assertInternalType( 'array', $result );
    860                 $this->assertNotEmpty( $result );
     862                $this->assertEquals( $result, $sidebars_widgets );
    861863
    862864                foreach ( $sidebars_widgets as $widgets ) {
    863865                        $this->assertInternalType( 'array', $widgets );
    864866                }
    865867
    866                 /*
    867                  * Only returns intersection of registered sidebars and saved sidebars,
    868                  * so neither fantasy-sidebar nor sidebar-3 will make the cut.
    869                  */
     868                // This sidebar is not registered anymore.
    870869                $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets );
    871                 $this->assertArrayNotHasKey( 'sidebar-3', $sidebars_widgets );
     870                $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets );
    872871
    873                 // archives-2 ends up as an orphan because of the above behavior.
    874                 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );
    875872                $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
    876873                $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
    877874
    878875                // 6 default widgets - 1 active text widget = 5.
    879                 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] );
     876                $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
    880877
    881878                $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] );
    882879                $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] );
     880                // archives-2 ends up as inactive because fantasy sidebar doesn't exist.
     881                $this->assertContains( 'archives-2',        $sidebars_widgets['wp_inactive_widgets'] );
    883882                $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] );
    884883                $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] );
    885884                $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
     
    915914
    916915                $_wp_sidebars_widgets = array();
    917916                $this->assertInternalType( 'array', $result );
    918                 $this->assertNotEmpty( $result );
     917                $this->assertEquals( $result, $sidebars_widgets );
    919918
    920919                foreach ( $sidebars_widgets as $widgets ) {
    921920                        $this->assertInternalType( 'array', $widgets );
     
    923922
    924923                $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
    925924                $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
    926                 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );
    927925                $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets );
    928926                $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
    929                 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] );
     927                $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
    930928
    931929                $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] );
    932930                $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] );
     931                $this->assertContains( 'archives-2',        $sidebars_widgets['wp_inactive_widgets'] );
    933932                $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] );
    934933                $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] );
    935934                $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
     
    940939                // Sidebar_widgets option was not updated.
    941940                $this->assertNotEquals( $sidebars_widgets, wp_get_sidebars_widgets() );
    942941        }
     942
     943        function test_retreive_widgets_with_single_widget() {
     944                global $sidebars_widgets;
     945
     946                wp_widgets_init();
     947
     948                // Register single-dimension widget.
     949                wp_register_sidebar_widget( 'single', 'Single', '__return_false', array(), array() );
     950                wp_register_widget_control( 'single', 'Single', '__return_false', array(), array() );
     951
     952                $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'wp_inactive_widgets' ) );
     953
     954                $sidebars_widgets = array(
     955                        'sidebar-1' => array( 'tag_cloud-1' ),
     956                        'wp_inactive_widgets' => array(),
     957                );
     958
     959                // Theme changed.
     960                $result = retrieve_widgets( true );
     961
     962                $this->assertContains( 'single', $result['wp_inactive_widgets'] );
     963        }
     964
     965        /**
     966         * Test _wp_remove_unregistered_widgets.
     967         *
     968         * @covers _wp_remove_unregistered_widgets()
     969         */
     970        public function test__wp_remove_unregistered_widgets() {
     971                $widgets = array(
     972                        'sidebar-1' => array( 'tag_cloud-1' ),
     973                        'sidebar-2' => array( 'text-1' ),
     974                        'fantasy'   => array( 'archives-2' ),
     975                        'wp_inactive_widgets' => array(),
     976                        'array_version' => 3,
     977                );
     978
     979                $whitelist = array( 'tag_cloud-1', 'text-1' );
     980
     981                $filtered_widgets = _wp_remove_unregistered_widgets( $widgets, $whitelist );
     982
     983                $this->assertInternalType( 'array', $filtered_widgets );
     984                $this->assertArrayHasKey( 'fantasy', $filtered_widgets );
     985                $this->assertEmpty( $filtered_widgets['fantasy'] );
     986                $this->assertArrayHasKey( 'array_version', $filtered_widgets );
     987                $this->assertEquals( 3, $filtered_widgets['array_version'] );
     988                $this->assertInternalType( 'integer', $filtered_widgets['array_version'] );
     989        }
     990
     991        /**
     992         * wp_map_sidebars_widgets Tests.
     993         */
     994
     995        /**
     996         * Two themes with one sidebar each should just map, switching to a theme not previously-active.
     997         *
     998         * @covers wp_map_sidebars_widgets()
     999         */
     1000        public function test_one_sidebar_each() {
     1001                $this->register_sidebars( array( 'primary' ) );
     1002                $prev_theme_sidebars = array(
     1003                        'unique-slug' => 1,
     1004                );
     1005
     1006                $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
     1007
     1008                $expected_sidebars = array(
     1009                        'primary' => 1,
     1010                        'wp_inactive_widgets' => array(),
     1011                );
     1012                $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
     1013        }
     1014
     1015        /**
     1016         * Sidebars with the same name should map, switching to a theme not previously-active.
     1017         *
     1018         * @covers wp_map_sidebars_widgets()
     1019         */
     1020        public function test_sidebars_with_same_slug() {
     1021                $this->register_sidebars( array( 'primary', 'secondary' ) );
     1022                $prev_theme_sidebars = array(
     1023                        'primary' => 1,
     1024                        'secondary' => 2,
     1025                        'wp_inactive_widgets' => array(),
     1026                );
     1027
     1028                $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
     1029
     1030                $this->assertEquals( $prev_theme_sidebars, $new_next_theme_sidebars );
     1031        }
     1032
     1033        /**
     1034         * Make educated guesses on theme sidebars.
     1035         *
     1036         * @covers wp_map_sidebars_widgets()
     1037         */
     1038        public function test_sidebar_guessing() {
     1039                $this->register_sidebars( array( 'primary', 'secondary' ) );
     1040
     1041                $prev_theme_sidebars = array(
     1042                        'header' => array(),
     1043                        'footer' => array(),
     1044                );
     1045
     1046                $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
     1047
     1048                $expected_sidebars = array(
     1049                        'primary' => array(),
     1050                        'secondary' => array(),
     1051                        'wp_inactive_widgets' => array(),
     1052                );
     1053                $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
     1054        }
     1055
     1056        /**
     1057         * Make sure two sidebars that fall in the same group don't get the same menu assigned.
     1058         *
     1059         * @covers wp_map_sidebars_widgets()
     1060         */
     1061        public function test_sidebar_guessing_one_menu_per_group() {
     1062                $this->register_sidebars( array( 'primary' ) );
     1063                $prev_theme_sidebars = array(
     1064                        'top-menu' => array(),
     1065                        'secondary' => array(),
     1066                );
     1067
     1068                $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
     1069
     1070                $expected_sidebars = array(
     1071                        'main' => array(),
     1072                        'wp_inactive_widgets' => array(),
     1073                );
     1074                $this->assertEqualSets( $expected_sidebars, $new_next_theme_sidebars );
     1075        }
     1076
     1077        /**
     1078         * Make sure two sidebars that fall in the same group get menus assigned from the same group.
     1079         *
     1080         * @covers wp_map_sidebars_widgets()
     1081         */
     1082        public function test_sidebar_guessing_one_menu_per_sidebar() {
     1083                $this->register_sidebars( array( 'primary', 'main' ) );
     1084
     1085                $prev_theme_sidebars = array(
     1086                        'navigation-menu' => array(),
     1087                        'top-menu' => array(),
     1088                );
     1089
     1090                $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
     1091
     1092                $expected_sidebars = array(
     1093                        'main' => array(),
     1094                        'primary' => array(),
     1095                        'wp_inactive_widgets' => array(),
     1096                );
     1097                $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
     1098        }
    9431099}