Make WordPress Core

Ticket #46469: recurse-deps-v2.diff

File recurse-deps-v2.diff, 3.3 KB (added by superdav42, 6 years ago)

Fix bug causing false positives

  • src/wp-includes/class.wp-dependencies.php

     
    7676        public $group = 0;
    7777
    7878        /**
     79         * Cached lookup array of flattened queued items and dependencies.
     80         *
     81         * @var array
     82         */
     83        private $all_queued_deps;
     84
     85        /**
    7986         * Processes the items and dependencies.
    8087         *
    8188         * Processes the items passed to it or the queue, and their dependencies.
     
    294302        public function enqueue( $handles ) {
    295303                foreach ( (array) $handles as $handle ) {
    296304                        $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] ] ) ) {
    298306                                $this->queue[] = $handle[0];
     307
     308                                // Reset all dependencies so it must be recalculated in recurse_deps().
     309                                $this->all_queued_deps = null;
     310
    299311                                if ( isset( $handle[1] ) ) {
    300312                                        $this->args[ $handle[0] ] = $handle[1];
    301313                                }
     
    317329        public function dequeue( $handles ) {
    318330                foreach ( (array) $handles as $handle ) {
    319331                        $handle = explode( '?', $handle );
    320                         $key    = array_search( $handle[0], $this->queue );
     332                        $key    = array_search( $handle[0], $this->queue, true );
    321333                        if ( false !== $key ) {
     334                                // Reset all dependencies so it must be recalculated in recurse_deps().
     335                                $this->all_queued_deps = null;
    322336                                unset( $this->queue[ $key ] );
    323337                                unset( $this->args[ $handle[0] ] );
    324338                        }
     
    335349         * @return bool Whether the handle is found after recursively searching the dependency tree.
    336350         */
    337351        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                }
    342355
    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 $queued ) {
     361                                if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) {
     362                                        $deps = $this->registered[ $queued ]->deps;
     363                                        if ( $deps ) {
     364                                                $all_deps += array_fill_keys( $deps, true );
     365                                                array_push( $queues, $deps );
     366                                        }
     367                                        $done[ $queued ] = true;
     368                                }
    347369                        }
     370                        $queue = array_pop( $queues );
    348371                }
     372                $this->all_queued_deps = $all_deps;
    349373
    350                 return false;
     374                return isset( $this->all_queued_deps[ $handle ] );
    351375        }
    352376
    353377        /**
     
    371395
    372396                        case 'enqueued':
    373397                        case 'queue':
    374                                 if ( in_array( $handle, $this->queue ) ) {
     398                                if ( in_array( $handle, $this->queue, true ) ) {
    375399                                        return true;
    376400                                }
     401
    377402                                return $this->recurse_deps( $this->queue, $handle );
    378 
    379403                        case 'to_do':
    380404                        case 'to_print': // back compat
    381                                 return in_array( $handle, $this->to_do );
     405                                return in_array( $handle, $this->to_do, true );
    382406
    383407                        case 'done':
    384408                        case 'printed': // back compat
    385                                 return in_array( $handle, $this->done );
     409                                return in_array( $handle, $this->done, true );
    386410                }
    387411                return false;
    388412        }