From 812c6087ada4a6383fd2e033d04648ec0f6691ea Mon Sep 17 00:00:00 2001 From: Rick Waldron Date: Wed, 24 Oct 2012 14:12:28 -0400 Subject: [PATCH] Brute force property removal when removeData([a,b,c]). Fixes #12786 Signed-off-by: Rick Waldron --- src/data.js | 8 ++++++ test/unit/data.js | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/data.js b/src/data.js index 10adec6af..eb682feab 100644 --- a/src/data.js +++ b/src/data.js @@ -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++ ) { diff --git a/test/unit/data.js b/test/unit/data.js index d1d947f70..286bcc25d 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -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("
", { 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)" ); + 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); -- 2.39.5