Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Brute force property removal when removeData([a,b,c]). Fixes #12786
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
  • Loading branch information
rwaldron committed Oct 24, 2012
1 parent 2eff7fe commit 812c608
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/data.js
Expand Up @@ -136,6 +136,14 @@ function internalRemoveData( elem, name, pvt /* For internal use only */ ){
name = name.split(" ");
}
}
} else {
// If "name" is an array of keys...
// When data is initially created, via ("key", "val") signature,
// keys will be converted to camelCase.
// Since there is no way to tell _how_ a key was added, remove
// both plain key and camelCase key. #12786
// This will only penalize the array argument path.
name = name.concat( jQuery.map( name, jQuery.camelCase ) );
}

for ( i = 0, l = name.length; i < l; i++ ) {
Expand Down
70 changes: 70 additions & 0 deletions test/unit/data.js
Expand Up @@ -621,6 +621,76 @@ test("jQuery.data supports interoperable removal of hyphenated/camelCase propert
});
});

test( "jQuery.fn.removeData supports interoperable removal of hyphenated properties via array (#12786)", function() {
expect( 10 );

var div, plain, datas, keys;

div = jQuery("<div/>", { id: "test12786" }).appendTo("#qunit-fixture"),
datas = {
"non-empty": "a string",
"empty-string": "",
"one-value": 1,
"zero-value": 0,
"an-array": [],
"an-object": {},
"bool-true": true,
"bool-false": false,
// JSHint enforces double quotes,
// but JSON strings need double quotes to parse
// so we need escaped double quotes here
"some-json": "{ \"foo\": \"bar\" }"
};

keys = jQuery.map( datas, function( _, key ) {
return key;
});

// "keys" is an array that looks like this:
// [
// "non-empty", "empty-string", "one-value", "zero-value",
// "an-array", "an-object", "bool-true", "bool-false", "some-json"
// ]

div.data( datas );
deepEqual( div.data(), datas, "div.data() returns an object whose values match those of datas (div)" );

div.removeData( keys.hyphen );
ok( jQuery.isEmptyObject( div.data() ), "After removal by array of hyphenated keys, div.data() returns an object with no properties (div)" );

div.data( "a-a", 1 );
div.data( "b-b", 2 );

deepEqual( div.data( "a-a" ), 1, "div.data('a-a') returns value that matches the manually set value (div)" );

This comment has been minimized.

Copy link
@Krinkle

Krinkle Oct 25, 2012

Member

Very deep ;-)

This comment has been minimized.

Copy link
@rwaldron

rwaldron Oct 25, 2012

Author Member

Haha that was previously much deeper ;) a little copy pasta there

deepEqual( div.data( "b-b" ), 2, "div.data('b-b') returns value that matches the manually set value (div)" );

div.removeData([ "a-a", "b-b" ]);

ok( jQuery.isEmptyObject( div.data() ), "After removal by array of hyphenated keys, div.data() returns an object with no properties (div)" );

plain = jQuery({});

plain.data( datas );
deepEqual( plain.data(), datas, "plain.data() returns an object whose values match those of datas (plain)" );

plain.removeData( keys );

ok( jQuery.isEmptyObject( plain.data() ), "After removal by array of hyphenated keys, plain.data() returns an object with no properties (plain)" );


plain = jQuery({});

plain.data( "a-a", 1 );
plain.data( "b-b", 2 );

deepEqual( plain.data( "a-a" ), 1, "plain.data('a-a') returns value that matches the manually set value (plain)" );
deepEqual( plain.data( "b-b" ), 2, "plain.data('b-b') returns value that matches the manually set value (plain)" );

plain.removeData([ "a-a", "b-b" ]);

ok( jQuery.isEmptyObject( plain.data() ), "After removal by array of hyphenated keys, plain.data() returns an object with no properties (plain)" );
});

// Test originally by Moschel
test("Triggering the removeData should not throw exceptions. (#10080)", function() {
expect(1);
Expand Down

0 comments on commit 812c608

Please sign in to comment.