From f4ef187c2cbf471ce8730bc4aba02c45a3fedd2b Mon Sep 17 00:00:00 2001 From: Dominik Schilling Date: Sun, 6 Mar 2016 19:50:27 +0000 Subject: [PATCH] Dependencies: Improve group processing of script dependencies. This is a follow-up to [36604]. When processing dependencies `$this->group` will be the minimum of the script's registered group and all preceding siblings. This is wrong because only a scripts ancestors in the dependency chain should affect where it is loaded. Effectively `$this->group` introduced a form of global state which potentially corrupted the group of dependencies. Sorting covers up this problem. The issue in #35873 was that script were not moving their dependencies to a lower group when necessary. The fix: * In `WP_Dependencies::all_deps()` pass the new `$group` value to `WP_Dependencies::all_deps()`. Previously the wrong value was passed because the parent script could have moved with `WP_Scripts::set_group()`. * In `WP_Scripts::all_deps()` pass the `$group` parameter to `WP_Dependencies::all_deps()` so it doesn't always use `false` for `$group`. Same for `WP_Styles::all_deps()`. Props stephenharris, gitlost. Fixes #35956. Built from https://develop.svn.wordpress.org/trunk@36871 git-svn-id: http://core.svn.wordpress.org/trunk@36838 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class.wp-dependencies.php | 16 +++++++--------- wp-includes/class.wp-scripts.php | 2 +- wp-includes/class.wp-styles.php | 2 +- wp-includes/version.php | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/wp-includes/class.wp-dependencies.php b/wp-includes/class.wp-dependencies.php index 11068f970a..5a1a9286e7 100644 --- a/wp-includes/class.wp-dependencies.php +++ b/wp-includes/class.wp-dependencies.php @@ -77,6 +77,7 @@ class WP_Dependencies { * * @access public * @since 2.8.0 + * @deprecated 4.5.0 * @var int */ public $group = 0; @@ -161,7 +162,8 @@ class WP_Dependencies { if ( in_array($handle, $this->done, true) ) // Already done continue; - $moved = $this->set_group( $handle, $recursion, $group ); + $moved = $this->set_group( $handle, $recursion, $group ); + $new_group = $this->groups[ $handle ]; if ( $queued && !$moved ) // already queued and in the right group continue; @@ -171,7 +173,7 @@ class WP_Dependencies { $keep_going = false; // Item doesn't exist. elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) ) $keep_going = false; // Item requires dependencies that don't exist. - elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $group ) ) + elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $new_group ) ) $keep_going = false; // Item requires dependencies that don't exist. if ( ! $keep_going ) { // Either item or its dependencies don't exist. @@ -397,16 +399,12 @@ class WP_Dependencies { public function set_group( $handle, $recursion, $group ) { $group = (int) $group; - if ( $recursion ) { - $group = min( $this->group, $group ); + if ( isset( $this->groups[ $handle ] ) && $this->groups[ $handle ] <= $group ) { + return false; } - $this->group = $group; + $this->groups[ $handle ] = $group; - if ( isset($this->groups[$handle]) && $this->groups[$handle] <= $group ) - return false; - - $this->groups[$handle] = $group; return true; } diff --git a/wp-includes/class.wp-scripts.php b/wp-includes/class.wp-scripts.php index 0b3f922ed0..655c07f23d 100644 --- a/wp-includes/class.wp-scripts.php +++ b/wp-includes/class.wp-scripts.php @@ -509,7 +509,7 @@ class WP_Scripts extends WP_Dependencies { * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { - $r = parent::all_deps( $handles, $recursion ); + $r = parent::all_deps( $handles, $recursion, $group ); if ( ! $recursion ) { /** * Filter the list of script dependencies left to print. diff --git a/wp-includes/class.wp-styles.php b/wp-includes/class.wp-styles.php index 788e8a3fa9..a175058baa 100644 --- a/wp-includes/class.wp-styles.php +++ b/wp-includes/class.wp-styles.php @@ -310,7 +310,7 @@ class WP_Styles extends WP_Dependencies { * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { - $r = parent::all_deps( $handles, $recursion ); + $r = parent::all_deps( $handles, $recursion, $group ); if ( ! $recursion ) { /** * Filter the array of enqueued styles before processing for output. diff --git a/wp-includes/version.php b/wp-includes/version.php index 08a2b015b5..8abd2d8477 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.5-beta2-36870'; +$wp_version = '4.5-beta2-36871'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.