aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Gibson <richard.gibson@gmail.com>2016-05-06 22:12:53 -0400
committerRichard Gibson <richard.gibson@gmail.com>2016-05-06 22:12:53 -0400
commite8825a529b97a27b8b2e40eaaa7773189642c772 (patch)
treecd1e74d0024fb208a5d2fe371cf6074407320179
parent7fd36ea145a11d5896de6d064b546b1c57a83f34 (diff)
downloadjquery-e8825a529b97a27b8b2e40eaaa7773189642c772.tar.gz
jquery-e8825a529b97a27b8b2e40eaaa7773189642c772.zip
Event: Cover invalid delegation selector edge cases
Ref 7fd36ea145a11d5896de6d064b546b1c57a83f34
-rw-r--r--src/event.js8
-rw-r--r--test/unit/event.js18
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.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 ) {