From e8825a529b97a27b8b2e40eaaa7773189642c772 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Fri, 6 May 2016 22:12:53 -0400 Subject: [PATCH] Event: Cover invalid delegation selector edge cases Ref 7fd36ea145a11d5896de6d064b546b1c57a83f34 --- src/event.js | 8 +++++--- test/unit/event.js | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/event.js b/src/event.js index 3f1c5f31a..1c29a6b09 100644 --- a/src/event.js +++ b/src/event.js @@ -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 diff --git a/test/unit/event.js b/test/unit/event.js index 6b4af04b9..5d4108c90 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -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.throws( function() { + jQuery( "#foo" ).on( "click", "nonexistent:not", function() {} ); + }, "short-circuitable malformed selector throws on attach" ); + + jQuery( "#foo > :first-child" ).click(); assert.ok( true, "malformed selector does not throw on event" ); - - jQuery( "#qunit-fixture" ).off( "click" ); } ); QUnit.test( "Delegated events in forms (#10844; #11145; #8165; #11382, #11764)", function( assert ) {