Ticket #36791: add_enqueue_offset_ticket_36791.patch
| File add_enqueue_offset_ticket_36791.patch, 9.1 KB (added by , 10 years ago) |
|---|
-
src/wp-includes/class.wp-dependencies.php
35 35 public $queue = array(); 36 36 37 37 /** 38 * An array of reserved offsets. 39 * 40 * @access public 41 * @var array 42 */ 43 public $offsets = array(); 44 45 /** 38 46 * An array of _WP_Dependency handle objects to queue. 39 47 * 40 48 * @access public … … 291 299 * @since 2.6.0 Moved from `WP_Scripts`. 292 300 * 293 301 * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). 302 * @param integer $offset offset within queue (increments to next available offset if already reserved). 294 303 */ 295 public function enqueue( $handles ) {304 public function enqueue( $handles, $offset = null ) { 296 305 foreach ( (array) $handles as $handle ) { 297 306 $handle = explode('?', $handle); 298 307 if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) { 299 $this->queue[] = $handle[0]; 308 if ( $offset !== null ) { 309 while ( array_key_exists($offset, $this->offsets) ) { 310 $offset++; 311 } 312 $this->offsets[$offset] = $handle[0]; 313 ksort($this->offsets); 314 if ( array_key_exists($offset, $this->queue) ) { 315 array_splice($this->queue, $offset, 0, $handle[0]); 316 // Make sure all reserved offsets positions remain the same even after a splice 317 foreach ( $this->offsets as $queuedOffset => $queuedHandle ) { 318 if ( $this->queue[$queuedOffset] != $queuedHandle ) { 319 $queuedKey = array_search($queuedHandle, $this->queue); 320 unset($this->queue[$queuedKey]); 321 ksort($this->queue); 322 array_splice($this->queue, $queuedOffset, 0, $queuedHandle); 323 } 324 } 325 } else { 326 $this->queue[$offset] = $handle[0]; 327 ksort($this->queue); 328 } 329 } else { 330 $this->queue[] = $handle[0]; 331 } 300 332 if ( isset($handle[1]) ) 301 333 $this->args[$handle[0]] = $handle[1]; 302 334 } … … 320 352 $handle = explode('?', $handle); 321 353 $key = array_search($handle[0], $this->queue); 322 354 if ( false !== $key ) { 355 if ( in_array($key, $this->offsets) ) { 356 unset($this->offsets[$key]); 357 } 323 358 unset($this->queue[$key]); 324 359 unset($this->args[$handle[0]]); 325 360 } -
src/wp-includes/functions.wp-scripts.php
254 254 * If set to null, no version is added. 255 255 * @param bool $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>. 256 256 * Default 'false'. 257 * @param integer $offset Optional. Offset within queue (increments to next available offset if already reserved). 257 258 */ 258 function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) {259 function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false, $offset = null ) { 259 260 $wp_scripts = wp_scripts(); 260 261 261 262 _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); … … 273 274 } 274 275 } 275 276 276 $wp_scripts->enqueue( $handle );277 $wp_scripts->enqueue( $handle, $offset ); 277 278 } 278 279 279 280 /** -
src/wp-includes/functions.wp-styles.php
159 159 * @param string $media Optional. The media for which this stylesheet has been defined. 160 160 * Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like 161 161 * '(orientation: portrait)' and '(max-width: 640px)'. 162 * @param integer $offset Offset within queue (increments to next available offset if already reserved). 162 163 */ 163 function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) {164 function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all', $offset = null ) { 164 165 _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); 165 166 166 167 $wp_styles = wp_styles(); … … 169 170 $_handle = explode('?', $handle); 170 171 $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); 171 172 } 172 $wp_styles->enqueue( $handle );173 $wp_styles->enqueue( $handle, $offset ); 173 174 } 174 175 175 176 /** -
tests/phpunit/tests/dependencies/scripts.php
29 29 wp_enqueue_script('empty-deps-no-version', 'example.com' ); 30 30 wp_enqueue_script('empty-deps-version', 'example.com', array(), 1.2); 31 31 wp_enqueue_script('empty-deps-null-version', 'example.com', array(), null); 32 wp_enqueue_script('empty-deps-null-version-with-offset', 'example2.com', array(), null, false, 1); 33 wp_enqueue_script('empty-deps-null-version-with-offset-and-new-key', 'example3.com', array(), null, false, 5); 32 34 $ver = get_bloginfo( 'version' ); 33 35 $expected = "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n"; 36 $expected .= "<script type='text/javascript' src='http://example2.com'></script>\n"; 34 37 $expected .= "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n"; 35 38 $expected .= "<script type='text/javascript' src='http://example.com?ver=1.2'></script>\n"; 36 39 $expected .= "<script type='text/javascript' src='http://example.com'></script>\n"; 37 40 $expected .= "<script type='text/javascript' src='http://example3.com'></script>\n"; 38 41 $this->assertEquals($expected, get_echo('wp_print_scripts')); 39 42 40 43 // No scripts left to print … … 724 727 725 728 $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) ); 726 729 } 730 731 /** 732 * Test enqueue offsets 733 * @ticket 36791 734 */ 735 function test_wp_enqueue_script_with_offset_and_dependencies_in_head_and_footer() { 736 wp_enqueue_script( 'child-head', '/child-head.js', array(), null, false ); // in head 737 wp_enqueue_script( 'child-footer', '/child-footer.js', array(), null, true ); // in footer 738 wp_enqueue_script( 'child-head2', '/child-head2.js', array(), null, false, 1); // second in head 739 wp_enqueue_script( 'child-head1', '/child-head1.js', array(), null, false, 0); // first in head 740 wp_enqueue_script( 'parent', '/parent.js', array( 'child-head', 'child-footer' ), null, true); // in footer 741 wp_enqueue_script( 'parent1', '/parent1.js', array(), null, true, 1 ); // first in footer 742 wp_enqueue_script( 'parent2', '/parent2.js', array(), null, true); // in footer 743 wp_enqueue_script( 'parent3', '/parent3.js', array(), null, true, 0); // second in footer 744 745 $header = get_echo( 'wp_print_head_scripts' ); 746 $footer = get_echo( 'wp_print_footer_scripts' ); 747 748 $expected_header = "<script type='text/javascript' src='/child-head1.js'></script>\n"; 749 $expected_header .= "<script type='text/javascript' src='/child-head2.js'></script>\n"; 750 $expected_header .= "<script type='text/javascript' src='/child-head.js'></script>\n"; 751 $expected_footer = "<script type='text/javascript' src='/parent1.js'></script>\n"; 752 $expected_footer .= "<script type='text/javascript' src='/parent3.js'></script>\n"; 753 $expected_footer .= "<script type='text/javascript' src='/child-footer.js'></script>\n"; 754 $expected_footer .= "<script type='text/javascript' src='/parent.js'></script>\n"; 755 $expected_footer .= "<script type='text/javascript' src='/parent2.js'></script>\n"; 756 757 $this->assertEquals( $expected_header, $header ); 758 $this->assertEquals( $expected_footer, $footer ); 759 } 760 727 761 } -
tests/phpunit/tests/dependencies/styles.php
33 33 wp_enqueue_style('no-deps-version', 'example.com', array(), 1.2); 34 34 wp_enqueue_style('no-deps-null-version', 'example.com', array(), null); 35 35 wp_enqueue_style('no-deps-null-version-print-media', 'example.com', array(), null, 'print'); 36 wp_enqueue_style('no-deps-null-version-print-media-with-offset', 'example2.com', array(), null, 'print', 1); 37 36 38 $ver = get_bloginfo( 'version' ); 37 39 $expected = "<link rel='stylesheet' id='no-deps-no-version-css' href='http://example.com?ver=$ver' type='text/css' media='all' />\n"; 40 $expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-with-offset-css' href='http://example2.com' type='text/css' media='print' />\n"; 38 41 $expected .= "<link rel='stylesheet' id='no-deps-version-css' href='http://example.com?ver=1.2' type='text/css' media='all' />\n"; 39 42 $expected .= "<link rel='stylesheet' id='no-deps-null-version-css' href='http://example.com' type='text/css' media='all' />\n"; 40 43 $expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-css' href='http://example.com' type='text/css' media='print' />\n";