From: John Resig Date: Thu, 20 Jan 2011 19:51:30 +0000 (-0500) Subject: Merge branch 'fix-7853-add-context' of https://github.com/dmethvin/jquery into dmethv... X-Git-Url: http://git.asbjorn.it/?p=jquery.git;a=commitdiff_plain;h=2e2d5e9db5ee9886644d75954d327e6d284e2da8;hp=-c Merge branch 'fix-7853-add-context' of https://github.com/dmethvin/jquery into dmethvin-fix-7853-add-context --- 2e2d5e9db5ee9886644d75954d327e6d284e2da8 diff --combined src/traversing.js index 929547c,e86883d..90601df --- a/src/traversing.js +++ b/src/traversing.js @@@ -6,14 -6,7 +6,14 @@@ var runtil = /Until$/ rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, - POS = jQuery.expr.match.POS; + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; jQuery.fn.extend({ find: function( selector ) { @@@ -58,7 -51,7 +58,7 @@@ filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, - + is: function( selector ) { return !!selector && jQuery.filter( selector, this ).length > 0; }, @@@ -76,7 -69,7 +76,7 @@@ selector = selectors[i]; if ( !matches[selector] ) { - matches[selector] = jQuery.expr.match.POS.test( selector ) ? + matches[selector] = jQuery.expr.match.POS.test( selector ) ? jQuery( selector, context || this.context ) : selector; } @@@ -99,7 -92,7 +99,7 @@@ return ret; } - var pos = POS.test( selectors ) ? + var pos = POS.test( selectors ) ? jQuery( selectors, context || this.context ) : null; for ( i = 0, l = this.length; i < l; i++ ) { @@@ -120,10 -113,10 +120,10 @@@ } ret = ret.length > 1 ? jQuery.unique(ret) : ret; - + return this.pushStack( ret, "closest", selectors ); }, - + // Determine the position of an element within // the matched set of elements index: function( elem ) { @@@ -141,7 -134,7 +141,7 @@@ add: function( selector, context ) { var set = typeof selector === "string" ? - jQuery( selector, context || this.context ) : + jQuery( selector, context ) : jQuery.makeArray( selector ), all = jQuery.merge( this.get(), set ); @@@ -203,13 -196,8 +203,13 @@@ jQuery.each( } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + if ( !runtil.test( name ) ) { selector = until; } @@@ -218,13 -206,13 +218,13 @@@ ret = jQuery.filter( selector, ret ); } - ret = this.length > 1 ? jQuery.unique( ret ) : ret; + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } - return this.pushStack( ret, name, slice.call(arguments).join(",") ); + return this.pushStack( ret, name, args.join(",") ); }; }); @@@ -238,7 -226,7 +238,7 @@@ jQuery.extend( jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, - + dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; diff --combined test/unit/traversing.js index f0471d7,e4b3e95..56fed22 --- a/test/unit/traversing.js +++ b/test/unit/traversing.js @@@ -1,4 -1,4 +1,4 @@@ -module("traversing"); +module("traversing", { teardown: moduleTeardown }); test("find(String)", function() { expect(5); @@@ -138,7 -138,7 +138,7 @@@ test("closest()", function() same( jq.closest("html", document.body).get(), [], "Context limited." ); same( jq.closest("body", document.body).get(), [], "Context limited." ); same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." ); - + //Test that .closest() returns unique'd set equals( jQuery('#main p').closest('#main').length, 1, "Closest should return a unique set" ); @@@ -275,9 -275,9 +275,9 @@@ test("parents([String])", function() test("parentsUntil([String])", function() { expect(9); - + var parents = jQuery("#groups").parents(); - + same( jQuery("#groups").parentsUntil().get(), parents.get(), "parentsUntil with no selector (nextAll)" ); same( jQuery("#groups").parentsUntil(".foo").get(), parents.get(), "parentsUntil with invalid selector (nextAll)" ); same( jQuery("#groups").parentsUntil("#html").get(), parents.not(':last').get(), "Simple parentsUntil check" ); @@@ -307,9 -307,9 +307,9 @@@ test("prev([String])", function() test("nextAll([String])", function() { expect(4); - + var elems = jQuery('#form').children(); - + same( jQuery("#label-for").nextAll().get(), elems.not(':first').get(), "Simple nextAll check" ); same( jQuery("#label-for").nextAll('input').get(), elems.not(':first').filter('input').get(), "Filtered nextAll check" ); same( jQuery("#label-for").nextAll('input,select').get(), elems.not(':first').filter('input,select').get(), "Multiple-filtered nextAll check" ); @@@ -318,9 -318,9 +318,9 @@@ test("prevAll([String])", function() { expect(4); - + var elems = jQuery( jQuery('#form').children().slice(0, 12).get().reverse() ); - + same( jQuery("#area1").prevAll().get(), elems.get(), "Simple prevAll check" ); same( jQuery("#area1").prevAll('input').get(), elems.filter('input').get(), "Filtered prevAll check" ); same( jQuery("#area1").prevAll('input,select').get(), elems.filter('input,select').get(), "Multiple-filtered prevAll check" ); @@@ -329,9 -329,9 +329,9 @@@ test("nextUntil([String])", function() { expect(11); - + var elems = jQuery('#form').children().slice( 2, 12 ); - + same( jQuery("#text1").nextUntil().get(), jQuery("#text1").nextAll().get(), "nextUntil with no selector (nextAll)" ); same( jQuery("#text1").nextUntil(".foo").get(), jQuery("#text1").nextAll().get(), "nextUntil with invalid selector (nextAll)" ); same( jQuery("#text1").nextUntil("#area1").get(), elems.get(), "Simple nextUntil check" ); @@@ -342,15 -342,15 +342,15 @@@ same( jQuery("#text1").nextUntil("#area1", "button,input").get(), elems.get(), "Multiple-filtered nextUntil check" ); equals( jQuery("#text1").nextUntil("#area1", "div").length, 0, "Filtered nextUntil check, no match" ); same( jQuery("#text1, #hidden1").nextUntil("#area1", "button,input").get(), elems.get(), "Multi-source, multiple-filtered nextUntil check" ); - + same( jQuery("#text1").nextUntil("[class=foo]").get(), jQuery("#text1").nextAll().get(), "Non-element nodes must be skipped, since they have no attributes" ); }); test("prevUntil([String])", function() { expect(10); - + var elems = jQuery("#area1").prevAll(); - + same( jQuery("#area1").prevUntil().get(), elems.get(), "prevUntil with no selector (prevAll)" ); same( jQuery("#area1").prevUntil(".foo").get(), elems.get(), "prevUntil with invalid selector (prevAll)" ); same( jQuery("#area1").prevUntil("label").get(), elems.not(':last').get(), "Simple prevUntil check" ); @@@ -440,12 -440,13 +440,13 @@@ test("add(String|Element|Array|undefine test("add(String, Context)", function() { expect(6); - - equals( jQuery(document).add("#form").length, 2, "Make sure that using regular context document still works." ); - equals( jQuery(document.body).add("#form").length, 2, "Using a body context." ); - equals( jQuery(document.body).add("#html").length, 1, "Using a body context." ); - - equals( jQuery(document).add("#form", document).length, 2, "Use a passed in document context." ); - equals( jQuery(document).add("#form", document.body).length, 2, "Use a passed in body context." ); - equals( jQuery(document).add("#html", document.body).length, 1, "Use a passed in body context." ); + + deepEqual( jQuery( "#firstp" ).add( "#ap" ).get(), q( "firstp", "ap" ), "Add selector to selector " ); + deepEqual( jQuery( document.getElementById("firstp") ).add( "#ap" ).get(), q( "firstp", "ap" ), "Add gEBId to selector" ); + deepEqual( jQuery( document.getElementById("firstp") ).add( document.getElementById("ap") ).get(), q( "firstp", "ap" ), "Add gEBId to gEBId" ); + + var ctx = document.getElementById("firstp"); + deepEqual( jQuery( "#firstp" ).add( "#ap", ctx ).get(), q( "firstp" ), "Add selector to selector " ); + deepEqual( jQuery( document.getElementById("firstp") ).add( "#ap", ctx ).get(), q( "firstp" ), "Add gEBId to selector, not in context" ); + deepEqual( jQuery( document.getElementById("firstp") ).add( "#ap", document.getElementsByTagName("body")[0] ).get(), q( "firstp", "ap" ), "Add gEBId to selector, in context" ); });