]> source.dussan.org Git - jquery.git/commitdiff
Event: Cover invalid delegation selector edge cases
authorRichard Gibson <richard.gibson@gmail.com>
Sat, 7 May 2016 02:12:53 +0000 (22:12 -0400)
committerRichard Gibson <richard.gibson@gmail.com>
Sat, 7 May 2016 02:12:53 +0000 (22:12 -0400)
Ref 7fd36ea145a11d5896de6d064b546b1c57a83f34

src/event.js
test/unit/event.js

index 3f1c5f31abf739fe11c241d817aa023780b84926..1c29a6b0942042f34eb5e5382168453f0b37623c 100644 (file)
@@ -1,13 +1,14 @@
 define( [
        "./core",
        "./var/document",
+       "./var/documentElement",
        "./var/rnotwhite",
        "./var/slice",
        "./data/var/dataPriv",
 
        "./core/init",
        "./selector"
-], function( jQuery, document, rnotwhite, slice, dataPriv ) {
+], function( jQuery, document, documentElement, rnotwhite, slice, dataPriv ) {
 
 "use strict";
 
@@ -120,9 +121,10 @@ jQuery.event = {
                        selector = handleObjIn.selector;
                }
 
-               // If the selector is invalid, throw any exceptions at attach time
+               // Ensure that invalid selectors throw exceptions at attach time
+               // Evaluate against documentElement in case elem is a non-element node (e.g., document)
                if ( selector ) {
-                       jQuery.find( selector, elem );
+                       jQuery.find.matchesSelector( documentElement, selector );
                }
 
                // Make sure that the handler has a unique ID, used to find/remove it later
index 6b4af04b93ca299c1e8a337518045bccf7648927..5d4108c900d1e1014a9bd129df558a5091210bc2 100644 (file)
@@ -1289,17 +1289,19 @@ QUnit.test( "Delegated events in SVG (#10791; #13180)", function( assert ) {
        jQuery( "#qunit-fixture" ).off( "click" );
 } );
 
-QUnit.test( "Delegated events with malformed selectors (#3071)", function( assert ) {
-       assert.expect( 2 );
+QUnit.test( "Delegated events with malformed selectors (gh-3071)", function( assert ) {
+       assert.expect( 3 );
 
-       assert.throws( function () {
-               jQuery( "#qunit-fixture" ).on( "click", "div:not", function () { } );
-       }, null, "malformed selector throws on attach" );
+       assert.throws( function() {
+               jQuery( "#foo" ).on( "click", ":not", function() {} );
+       }, "malformed selector throws on attach" );
 
-       jQuery( "#qunit-fixture" ).click();
-       assert.ok( true, "malformed selector does not throw on event" );
+       assert.throws( function() {
+               jQuery( "#foo" ).on( "click", "nonexistent:not", function() {} );
+       }, "short-circuitable malformed selector throws on attach" );
 
-       jQuery( "#qunit-fixture" ).off( "click" );
+       jQuery( "#foo > :first-child" ).click();
+       assert.ok( true, "malformed selector does not throw on event" );
 } );
 
 QUnit.test( "Delegated events in forms (#10844; #11145; #8165; #11382, #11764)", function( assert ) {