Merge branch 'fix-7853-add-context' of https://github.com/dmethvin/jquery into dmethv...
authorJohn Resig <jeresig@gmail.com>
Thu, 20 Jan 2011 19:51:30 +0000 (14:51 -0500)
committerJohn Resig <jeresig@gmail.com>
Thu, 20 Jan 2011 19:51:30 +0000 (14:51 -0500)
1  2 
src/traversing.js
test/unit/traversing.js

diff --combined 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++ ) {
                }
  
                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 ) {
  
        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;
                }
                        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
@@@ -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" );
  
  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" );
  
  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" );
        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" );
  });