Index: src/wp-includes/class.wp-dependencies.php
===================================================================
--- src/wp-includes/class.wp-dependencies.php	(revision 44898)
+++ src/wp-includes/class.wp-dependencies.php	(working copy)
@@ -76,6 +76,13 @@
 	public $group = 0;
 
 	/**
+	 * Cached lookup array of flattened queued items and dependencies.
+	 *
+	 * @var array
+	 */
+	private $all_queued_deps;
+
+	/**
 	 * Processes the items and dependencies.
 	 *
 	 * Processes the items passed to it or the queue, and their dependencies.
 
@@ -294,8 +302,12 @@
 	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 it must be recalculated in recurse_deps().
+				$this->all_queued_deps = null;
+
 				if ( isset( $handle[1] ) ) {
 					$this->args[ $handle[0] ] = $handle[1];
 				}
@@ -317,8 +329,10 @@
 	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 it must be recalculated in recurse_deps().
+				$this->all_queued_deps = null;
 				unset( $this->queue[ $key ] );
 				unset( $this->args[ $handle[0] ] );
 			}
@@ -335,19 +349,29 @@
 	 * @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 ( isset( $this->all_queued_deps ) ) {
+			return isset( $this->all_queued_deps[ $handle ] );
+		}
 
-			if ( in_array( $handle, $this->registered[ $queued ]->deps ) ) {
-				return true;
-			} elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) {
-				return true;
+		$all_deps = array_fill_keys( $queue, true );
+		$queues   = array();
+		$done     = array();
+		while ( $queue ) {
+			foreach ( $queue as $handle ) {
+				if ( ! isset( $done[ $handle ] ) && isset( $this->registered[ $handle ] ) ) {
+					$deps = $this->registered[ $handle ]->deps;
+					if ( $deps ) {
+						$all_deps += array_fill_keys( $deps, true );
+						array_push( $queues, $deps );
+					}
+					$done[ $handle ] = true;
+				}
 			}
+			$queue = array_pop( $queues );
 		}
+		$this->all_queued_deps = $all_deps;
 
-		return false;
+		return isset( $this->all_queued_deps[ $handle ] );
 	}
 
 	/**
@@ -371,18 +395,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 );
+				return in_array( $handle, $this->to_do, true );
 
 			case 'done':
 			case 'printed': // back compat
-				return in_array( $handle, $this->done );
+				return in_array( $handle, $this->done, true );
 		}
 		return false;
 	}
