From 23a411b6bcbb96edbbfe53e11ec1671dccaa92b6 Mon Sep 17 00:00:00 2001 From: rwldrn Date: Tue, 5 Apr 2011 15:55:40 -0400 Subject: [PATCH 1/3] Ticket #8753 Allow special properties to explicitly defined on jQuery.Event objects --- src/event.js | 17 ++++++++++++++--- test/unit/event.js | 29 +++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/event.js b/src/event.js index bc2cf76e..eadfa05c 100644 --- a/src/event.js +++ b/src/event.js @@ -1,6 +1,7 @@ (function( jQuery ) { -var rnamespaces = /\.(.*)$/, +var hasOwn = Object.prototype.hasOwnProperty, + rnamespaces = /\.(.*)$/, rformElems = /^(?:textarea|input|select)$/i, rperiod = /\./g, rspace = / /g, @@ -581,6 +582,15 @@ jQuery.Event = function( src ) { this.originalEvent = src; this.type = src.type; + // Push explicitly provided properties onto the event object + for ( var prop in src ) { + // Ensure we don't clobber jQuery.Event prototype + // with own properties. + if ( hasOwn.call( src, prop ) ) { + this[ prop ] = src[ prop ]; + } + } + // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || @@ -868,10 +878,10 @@ function trigger( type, elem, args ) { // Create "bubbling" focus and blur events if ( document.addEventListener ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - + // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0; - + jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { @@ -1184,3 +1194,4 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl }); })( jQuery ); + diff --git a/test/unit/event.js b/test/unit/event.js index 2a6d8a66..d19c7ec4 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -685,7 +685,6 @@ test("hover()", function() { test("mouseover triggers mouseenter", function() { expect(1); - var count = 0, elem = jQuery(""); elem.mouseenter(function () { @@ -693,7 +692,6 @@ test("mouseover triggers mouseenter", function() { }); elem.trigger('mouseover'); equals(count, 1, "make sure mouseover triggers a mouseenter" ); - elem.remove(); }); @@ -930,6 +928,27 @@ test("trigger(eventObject, [data], [fn])", function() { $parent.unbind().remove(); }); +test("jQuery.Event({ /* props */ })", function() { + + expect(4); + + var event = jQuery.Event({ type: "keydown", keyCode: 64 }), + handler = function( event ) { + ok( "keyCode" in event, "Special property 'keyCode' exists" ); + equal( event.keyCode, 64, "event.keyCode has explicit value '64'" ); + }; + + // Supports jQuery.Event implementation + equal( event.type, "keydown", "Verify type" ); + + ok( "keyCode" in event, "Special 'keyCode' property exists" ); + + jQuery("body").bind( "keydown", handler ).trigger( event ); + + jQuery("body").unbind( "keydown" ); + +}); + test("jQuery.Event.currentTarget", function(){ expect(1); @@ -1982,8 +2001,7 @@ test("window resize", function() { test("focusin bubbles", function() { expect(5); - - var input = jQuery( '' ).prependTo( "body" ), + var input = jQuery( '' ).prependTo( "body" ), order = 0; jQuery( "body" ).bind( "focusin.focusinBubblesTest", function(){ @@ -1996,12 +2014,10 @@ test("focusin bubbles", function() { // DOM focus method input[0].focus(); - // To make the next focus test work, we need to take focus off the input. // This will fire another focusin event, so set order to reflect that. order = 1; jQuery("#text1")[0].focus(); - // jQuery trigger, which calls DOM focus order = 0; input.trigger( "focus" ); @@ -2027,3 +2043,4 @@ test("event properties", function() { }).click(); }); */ + From b1b2e83394ef6ebcbaa5167d95e827f86655b74c Mon Sep 17 00:00:00 2001 From: rwldrn Date: Tue, 5 Apr 2011 16:20:55 -0400 Subject: [PATCH 2/3] Move this.type setting to after prop set; avoid setting twice --- src/event.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index eadfa05c..7f2e1d8b 100644 --- a/src/event.js +++ b/src/event.js @@ -580,7 +580,6 @@ jQuery.Event = function( src ) { // Event object if ( src && src.type ) { this.originalEvent = src; - this.type = src.type; // Push explicitly provided properties onto the event object for ( var prop in src ) { @@ -591,6 +590,10 @@ jQuery.Event = function( src ) { } } + if ( !this.type ) { + this.type = src.type; + } + // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || From 92a4d59c3221ada339177ca860570893766a6429 Mon Sep 17 00:00:00 2001 From: rwldrn Date: Tue, 5 Apr 2011 16:32:42 -0400 Subject: [PATCH 3/3] Remove this.type assignment --- src/event.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/event.js b/src/event.js index 7f2e1d8b..fe197189 100644 --- a/src/event.js +++ b/src/event.js @@ -590,10 +590,6 @@ jQuery.Event = function( src ) { } } - if ( !this.type ) { - this.type = src.type; - } - // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||