diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/class.wp-dependencies.php --- a/wp/wp-includes/class.wp-dependencies.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/class.wp-dependencies.php Tue Dec 15 13:49:49 2020 +0100 @@ -25,26 +25,26 @@ public $registered = array(); /** - * An array of queued _WP_Dependency handle objects. + * An array of handles of queued objects. * * @since 2.6.8 - * @var array + * @var string[] */ public $queue = array(); /** - * An array of _WP_Dependency handle objects to queue. + * An array of handles of objects to queue. * * @since 2.6.0 - * @var array + * @var string[] */ public $to_do = array(); /** - * An array of _WP_Dependency handle objects already queued. + * An array of handles of objects already queued. * * @since 2.6.0 - * @var array + * @var string[] */ public $done = array(); @@ -76,6 +76,14 @@ public $group = 0; /** + * Cached lookup array of flattened queued items and dependencies. + * + * @since 5.4.0 + * @var array + */ + private $all_queued_deps; + + /** * Processes the items and dependencies. * * Processes the items passed to it or the queue, and their dependencies. @@ -83,9 +91,11 @@ * @since 2.6.0 * @since 2.8.0 Added the `$group` parameter. * - * @param mixed $handles Optional. Items to be processed: Process queue (false), process item (string), process items (array of strings). - * @param mixed $group Group level: level (int), no groups (false). - * @return array Handles of items that have been processed. + * @param string|string[]|false $handles Optional. Items to be processed: queue (false), + * single item (string), or multiple items (array of strings). + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * @return string[] Array of handles of items that have been processed. */ public function do_items( $handles = false, $group = false ) { /* @@ -118,11 +128,14 @@ * Processes a dependency. * * @since 2.6.0 + * @since 5.5.0 Added the `$group` parameter. * - * @param string $handle Name of the item. Should be unique. + * @param string $handle Name of the item. Should be unique. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. * @return bool True on success, false if not set. */ - public function do_item( $handle ) { + public function do_item( $handle, $group = false ) { return isset( $this->registered[ $handle ] ); } @@ -136,13 +149,16 @@ * @since 2.6.0 Moved from `WP_Scripts`. * @since 2.8.0 Added the `$group` parameter. * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @param bool $recursion Internal flag that function is calling itself. - * @param int|false $group Group level: (int) level, (false) no groups. + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + * @param bool $recursion Optional. Internal flag that function is calling itself. + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { - if ( ! $handles = (array) $handles ) { + $handles = (array) $handles; + if ( ! $handles ) { return false; } @@ -151,14 +167,14 @@ $handle = $handle_parts[0]; $queued = in_array( $handle, $this->to_do, true ); - if ( in_array( $handle, $this->done, true ) ) { // Already done + if ( in_array( $handle, $this->done, true ) ) { // Already done. continue; } $moved = $this->set_group( $handle, $recursion, $group ); $new_group = $this->groups[ $handle ]; - if ( $queued && ! $moved ) { // already queued and in the right group + if ( $queued && ! $moved ) { // Already queued and in the right group. continue; } @@ -202,14 +218,18 @@ * @since 2.6.0 Moved from `WP_Scripts`. * * @param string $handle Name of the item. Should be unique. - * @param string|bool $src Full URL of the item, or path of the item relative to the WordPress root directory. - * If source is set to false, item is an alias of other items it depends on. - * @param string[] $deps Optional. An array of registered item handles this item depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying item version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. + * @param string|bool $src Full URL of the item, or path of the item relative + * to the WordPress root directory. If source is set to false, + * item is an alias of other items it depends on. + * @param string[] $deps Optional. An array of registered item handles this item depends on. + * Default empty array. + * @param string|bool|null $ver Optional. String specifying item version number, if it has one, + * which is added to the URL as a query string for cache busting purposes. + * If version is set to false, a version number is automatically added + * equal to current installed WordPress version. * If set to null, no version is added. - * @param mixed $args Optional. Custom property of the item. NOT the class property $args. Examples: $media, $in_footer. + * @param mixed $args Optional. Custom property of the item. NOT the class property $args. + * Examples: $media, $in_footer. * @return bool Whether the item has been registered. True on success, false on failure. */ public function add( $handle, $src, $deps = array(), $ver = false, $args = null ) { @@ -269,8 +289,7 @@ * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @return void + * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function remove( $handles ) { foreach ( (array) $handles as $handle ) { @@ -289,13 +308,18 @@ * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). + * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function enqueue( $handles ) { foreach ( (array) $handles as $handle ) { $handle = explode( '?', $handle ); - if ( ! in_array( $handle[0], $this->queue ) && isset( $this->registered[ $handle[0] ] ) ) { + + if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) { $this->queue[] = $handle[0]; + + // Reset all dependencies so they must be recalculated in recurse_deps(). + $this->all_queued_deps = null; + if ( isset( $handle[1] ) ) { $this->args[ $handle[0] ] = $handle[1]; } @@ -312,13 +336,17 @@ * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). + * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function dequeue( $handles ) { foreach ( (array) $handles as $handle ) { $handle = explode( '?', $handle ); - $key = array_search( $handle[0], $this->queue ); + $key = array_search( $handle[0], $this->queue, true ); + if ( false !== $key ) { + // Reset all dependencies so they must be recalculated in recurse_deps(). + $this->all_queued_deps = null; + unset( $this->queue[ $key ] ); unset( $this->args[ $handle[0] ] ); } @@ -326,7 +354,7 @@ } /** - * Recursively search the passed dependency tree for $handle + * Recursively search the passed dependency tree for $handle. * * @since 4.0.0 * @@ -335,19 +363,31 @@ * @return bool Whether the handle is found after recursively searching the dependency tree. */ protected function recurse_deps( $queue, $handle ) { - foreach ( $queue as $queued ) { - if ( ! isset( $this->registered[ $queued ] ) ) { - continue; - } - - if ( in_array( $handle, $this->registered[ $queued ]->deps ) ) { - return true; - } elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) { - return true; - } + if ( isset( $this->all_queued_deps ) ) { + return isset( $this->all_queued_deps[ $handle ] ); } - return false; + $all_deps = array_fill_keys( $queue, true ); + $queues = array(); + $done = array(); + + while ( $queue ) { + foreach ( $queue as $queued ) { + if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) { + $deps = $this->registered[ $queued ]->deps; + if ( $deps ) { + $all_deps += array_fill_keys( $deps, true ); + array_push( $queues, $deps ); + } + $done[ $queued ] = true; + } + } + $queue = array_pop( $queues ); + } + + $this->all_queued_deps = $all_deps; + + return isset( $this->all_queued_deps[ $handle ] ); } /** @@ -357,13 +397,13 @@ * @since 2.6.0 Moved from `WP_Scripts`. * * @param string $handle Name of the item. Should be unique. - * @param string $list Property name of list array. + * @param string $list Optional. Property name of list array. Default 'registered'. * @return bool|_WP_Dependency Found, or object Item data. */ public function query( $handle, $list = 'registered' ) { switch ( $list ) { case 'registered': - case 'scripts': // back compat + case 'scripts': // Back compat. if ( isset( $this->registered[ $handle ] ) ) { return $this->registered[ $handle ]; } @@ -371,18 +411,18 @@ case 'enqueued': case 'queue': - if ( in_array( $handle, $this->queue ) ) { + if ( in_array( $handle, $this->queue, true ) ) { return true; } return $this->recurse_deps( $this->queue, $handle ); case 'to_do': - case 'to_print': // back compat - return in_array( $handle, $this->to_do ); + case 'to_print': // Back compat. + return in_array( $handle, $this->to_do, true ); case 'done': - case 'printed': // back compat - return in_array( $handle, $this->done ); + case 'printed': // Back compat. + return in_array( $handle, $this->done, true ); } return false; } @@ -392,10 +432,10 @@ * * @since 2.8.0 * - * @param string $handle Name of the item. Should be unique. - * @param bool $recursion Internal flag that calling function was called recursively. - * @param mixed $group Group level. - * @return bool Not already in the group or a lower group + * @param string $handle Name of the item. Should be unique. + * @param bool $recursion Internal flag that calling function was called recursively. + * @param int|false $group Group level: level (int), no groups (false). + * @return bool Not already in the group or a lower group. */ public function set_group( $handle, $recursion, $group ) { $group = (int) $group;