Skip to content

Commit

Permalink
Ticked #8753; Revised approach per review recommendation
Browse files Browse the repository at this point in the history
  • Loading branch information
rwaldron committed Apr 4, 2011
1 parent cbe8451 commit c65ef9b
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 41 deletions.
56 changes: 38 additions & 18 deletions src/event.js
Expand Up @@ -288,9 +288,9 @@ jQuery.event = {
// jQuery.Event object
event[ jQuery.expando ] ? event :
// Object literal
jQuery.extend( jQuery.Event(type), event ) :
jQuery.extend( jQuery.Event( type, jQuery.event.adopted[ type ] ), event ) :
// Just the event type (string)
jQuery.Event(type);
jQuery.Event( type, jQuery.event.adopted[ type ] );

if ( type.indexOf("!") >= 0 ) {
event.type = type = type.slice(0, -1);
Expand Down Expand Up @@ -457,21 +457,36 @@ jQuery.event = {

props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),

// jQuery.Event( type, props ) registration
adopted: {},

fix: function( event ) {
if ( event[ jQuery.expando ] ) {
return event;
}

// store a copy of the original event object
// and "clone" to set read-only properties
var originalEvent = event;
var originalEvent = event,
adopted, prop, i;

event = jQuery.Event( originalEvent );

for ( var i = this.props.length, prop; i; ) {
// Check for adoptable properties
adopted = this.adopted[ event.type ] || false;

for ( i = this.props.length; i; ) {
prop = this.props[ --i ];
event[ prop ] = originalEvent[ prop ];
}

if ( adopted ) {
for ( prop in adopted ) {
// Give precendence specifically overridden properties
event[ prop ] = adopted[ prop ] || originalEvent[ prop ];
}
}

// Fix target property, if necessary
if ( !event.target ) {
// Fixes #1925 where srcElement might not be defined either
Expand Down Expand Up @@ -576,28 +591,33 @@ jQuery.Event = function( src, props ) {
return new jQuery.Event( src, props );
}

var adopted, srcType, prop;

// Event Properties
if ( props ) {

// Store local reference to reduce property lookups
var eventProps = jQuery.event.props;

srcType = ( jQuery.type( src ) === "string" && src ) || src.type;
adopted = jQuery.event.adopted[ srcType ] || {};
// Enumerate the provided properties
for ( var prop in props ) {
for ( prop in props ) {
// Add this property to adopted event props to make
// it available to all future events
adopted[ prop ] = props[ prop ];
}

// If we have no known record of the property
if ( jQuery.inArray( prop, eventProps ) === -1 ) {
// Update adopted properties for this type of event
jQuery.event.adopted[ srcType ] = adopted;
}

// Add this property to stored event props to make
// it available to all future events
eventProps.push( prop );
}
// Check if adopted properties have been previously stored
adopted = adopted || jQuery.event.adopted[ srcType ];

this[ prop ] = props[ prop ];
// If this event has adoptable properties, apply either the defaults or
// the matching property's value on the src event object
if ( adopted ) {
for ( prop in adopted ) {
this[ prop ] = adopted[ prop ] || src[ prop ] || undefined;
}

// Update normalized event props
jQuery.event.props = eventProps.sort();
}

// Event object
Expand Down
56 changes: 33 additions & 23 deletions test/unit/event.js
Expand Up @@ -930,38 +930,48 @@ test("trigger(eventObject, [data], [fn])", function() {

test("jQuery.Event( 'type' [, { /* props */ } ])", function() {

expect(12);

var event = jQuery.Event( "drop", { dataTransfer: true, otherProp: "aPropVal" }),
handler = function( event ) {
ok( "dataTransfer" in event, "Special property 'dataTransfer' exists" );
ok( "otherProp" in event, "Special property 'otherProp' exists" );
expect(18);

var dropEventA = jQuery.Event( "drop", { dataTransfer: undefined, otherProp: "aPropVal" }),
dropEventB = jQuery.Event( "drop" ),
dropHandler = function( event, data ) {
ok( "dataTransfer" in event, "Special property 'dataTransfer' exists on 'drop' event, when triggered by " + data.triggeredBy );
ok( "otherProp" in event, "Special property 'otherProp' exists on 'drop' event, when triggered by " + data.triggeredBy );
},
clickEvent = jQuery.Event( "click" ),
clickHandler = function( event ) {
ok( !("dataTransfer" in event), "Special property 'dataTransfer' DOES NOT exist on 'click' event" );
ok( !("otherProp" in event), "Special property 'otherProp' DOES NOT exists on 'click' event" );
};

// Supports jQuery.Event implementation
equal( event.type, "drop", "Verify type" );
ok( "dataTransfer" in event, "Special 'dataTransfer' property exists" );
ok( "otherProp" in event, "Special property 'otherProp' exists" );
equal( dropEventA.type, "drop", "Verify type" );
ok( "dataTransfer" in dropEventA, "Special 'dataTransfer' property exists on 'drop' event" );
ok( "otherProp" in dropEventA, "Special property 'otherProp' exists on 'drop' event" );

equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" );
equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );

event.preventDefault();
equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" );
event.stopPropagation();
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
equals( dropEventA.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
equals( dropEventA.isPropagationStopped(), false, "Verify isPropagationStopped" );
equals( dropEventA.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );

event.isPropagationStopped = function(){ return false };
event.stopImmediatePropagation();
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" );
dropEventA.preventDefault();
equals( dropEventA.isDefaultPrevented(), true, "Verify isDefaultPrevented" );
dropEventA.stopPropagation();
equals( dropEventA.isPropagationStopped(), true, "Verify isPropagationStopped" );

dropEventA.isPropagationStopped = function(){ return false };
dropEventA.stopImmediatePropagation();
equals( dropEventA.isPropagationStopped(), true, "Verify isPropagationStopped" );
equals( dropEventA.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" );

jQuery("body").bind( "drop", handler ).trigger( event );
jQuery("#foo").bind( "drop", dropHandler ).trigger( dropEventA, { "triggeredBy": "event object" });
jQuery("#foo").bind( "drop", dropHandler ).trigger( dropEventA, { "triggeredBy": "event object" } );
jQuery("#foo").bind( "click", clickHandler).trigger( clickEvent );

jQuery("body").unbind( "drop" );
jQuery("#ap").bind( "drop", dropHandler ).trigger( "drop", { "triggeredBy": "event type ( string )" } );

jQuery("#ap").unbind( "drop" );
jQuery("#foo").unbind( "drop" );
jQuery("#foo").unbind( "click" );
});

test("jQuery.Event.currentTarget", function(){
Expand Down

0 comments on commit c65ef9b

Please sign in to comment.