Skip to content

Commit

Permalink
Data: remove the expando when there's no more data
Browse files Browse the repository at this point in the history
  • Loading branch information
timmywil committed May 7, 2015
1 parent 772b3c5 commit d9dd4fb
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 13 deletions.
10 changes: 6 additions & 4 deletions src/data/Data.js
Expand Up @@ -120,10 +120,7 @@ Data.prototype = {
return;
}

if ( key === undefined ) {
this.register( owner );

} else {
if ( key !== undefined ) {

// Support array or space separated string of keys
if ( jQuery.isArray( key ) ) {
Expand All @@ -147,6 +144,11 @@ Data.prototype = {
delete cache[ key[ i ] ];
}
}

// Remove the expando if there's no more data
if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
delete owner[ this.expando ];
}
},
hasData: function( owner ) {
var cache = owner[ this.expando ];
Expand Down
9 changes: 2 additions & 7 deletions src/event.js
Expand Up @@ -216,14 +216,9 @@ jQuery.event = {
}
}

// Remove the expando if it's no longer used
// Remove data and the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
// Normally this should go through the data api
// but since event.js owns these properties,
// this exception is made for the sake of optimizing
// the operation.
delete elemData.handle;
delete elemData.events;
dataPriv.remove( elem, "handle events" );
}
},

Expand Down
21 changes: 19 additions & 2 deletions test/unit/data.js
Expand Up @@ -837,7 +837,24 @@ test("Check proper data removal of non-element descendants nodes (#8335)", 1, fu
});

testIframeWithCallback( "enumerate data attrs on body (#14894)", "data/dataAttrs.html", function( result ) {
expect(1);
expect( 1 );

equal( result, "ok", "enumeration of data- attrs on body" );
});

test( "Check that the expando is removed when there's no more data", function() {
expect( 1 );

equal(result, "ok", "enumeration of data- attrs on body" );
var key,
div = jQuery( "<div/>" );
div.data( "some", "data" );
equal( div.data( "some" ), "data", "Data is added" );
div.removeData( "some" );

// Make sure the expando is gone
for ( key in div[ 0 ] ) {
if ( /^jQuery/.test( key ) ) {
ok( false, "Expando was not removed when there was no more data" );
}
}
});
21 changes: 21 additions & 0 deletions test/unit/event.js
Expand Up @@ -2657,6 +2657,27 @@ test( "Inline event result is returned (#13993)", function() {
equal( result, 42, "inline handler returned value" );
});

test( ".off() removes the expando when there's no more data", function() {
expect( 1 );

var key,
div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );

div.on( "click", false );
div.on( "custom", function() {
ok( true, "Custom event triggered" );
} );
div.trigger( "custom" );
div.off( "click custom" );

// Make sure the expando is gone
for ( key in div[ 0 ] ) {
if ( /^jQuery/.test( key ) ) {
ok( false, "Expando was not removed when there was no more data" );
}
}
});

// This tests are unreliable in Firefox
if ( !(/firefox/i.test( window.navigator.userAgent )) ) {
test( "Check order of focusin/focusout events", 2, function() {
Expand Down

0 comments on commit d9dd4fb

Please sign in to comment.