Ticket #46469: recurse-deps-fixed.diff
File recurse-deps-fixed.diff, 3.3 KB (added by , 6 years ago) |
---|
-
src/wp-includes/class.wp-dependencies.php
76 76 public $group = 0; 77 77 78 78 /** 79 * Cached lookup array of flattened queued items and dependencies. 80 * 81 * @var array 82 */ 83 private $all_queued_deps; 84 85 /** 79 86 * Processes the items and dependencies. 80 87 * 81 88 * Processes the items passed to it or the queue, and their dependencies. … … 294 302 public function enqueue( $handles ) { 295 303 foreach ( (array) $handles as $handle ) { 296 304 $handle = explode( '?', $handle ); 297 if ( ! in_array( $handle[0], $this->queue ) && isset( $this->registered[ $handle[0] ] ) ) {305 if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) { 298 306 $this->queue[] = $handle[0]; 307 308 // Reset all dependencies so it must be recalculated in recurse_deps(). 309 $this->all_queued_deps = null; 310 299 311 if ( isset( $handle[1] ) ) { 300 312 $this->args[ $handle[0] ] = $handle[1]; 301 313 } … … 317 329 public function dequeue( $handles ) { 318 330 foreach ( (array) $handles as $handle ) { 319 331 $handle = explode( '?', $handle ); 320 $key = array_search( $handle[0], $this->queue );332 $key = array_search( $handle[0], $this->queue, true ); 321 333 if ( false !== $key ) { 334 // Reset all dependencies so it must be recalculated in recurse_deps(). 335 $this->all_queued_deps = null; 322 336 unset( $this->queue[ $key ] ); 323 337 unset( $this->args[ $handle[0] ] ); 324 338 } … … 335 349 * @return bool Whether the handle is found after recursively searching the dependency tree. 336 350 */ 337 351 protected function recurse_deps( $queue, $handle ) { 338 foreach ( $queue as $queued ) { 339 if ( ! isset( $this->registered[ $queued ] ) ) { 340 continue; 341 } 352 if ( isset( $this->all_queued_deps ) ) { 353 return isset( $this->all_queued_deps[ $handle ] ); 354 } 342 355 343 if ( in_array( $handle, $this->registered[ $queued ]->deps ) ) { 344 return true; 345 } elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) { 346 return true; 356 $all_deps = array_fill_keys( $queue, true ); 357 $queues = array(); 358 $done = array(); 359 while ( $queue ) { 360 foreach ( $queue as $handle ) { 361 if ( ! isset( $done[ $handle ] ) && isset( $this->registered[ $handle ] ) ) { 362 $deps = $this->registered[ $handle ]->deps; 363 if ( $deps ) { 364 $all_deps += array_fill_keys( $deps, true ); 365 array_push( $queues, $deps ); 366 } 367 $done[ $handle ] = true; 368 } 347 369 } 370 $queue = array_pop( $queues ); 348 371 } 372 $this->all_queued_deps = $all_deps; 349 373 350 return false;374 return isset( $this->all_queued_deps[ $handle ] ); 351 375 } 352 376 353 377 /** … … 371 395 372 396 case 'enqueued': 373 397 case 'queue': 374 if ( in_array( $handle, $this->queue ) ) {398 if ( in_array( $handle, $this->queue, true ) ) { 375 399 return true; 376 400 } 401 377 402 return $this->recurse_deps( $this->queue, $handle ); 378 379 403 case 'to_do': 380 404 case 'to_print': // back compat 381 return in_array( $handle, $this->to_do );405 return in_array( $handle, $this->to_do, true ); 382 406 383 407 case 'done': 384 408 case 'printed': // back compat 385 return in_array( $handle, $this->done );409 return in_array( $handle, $this->done, true ); 386 410 } 387 411 return false; 388 412 }