]> source.dussan.org Git - jquery.git/commitdiff
Brute force property removal when removeData([a,b,c]). Fixes #12786
authorRick Waldron <waldron.rick@gmail.com>
Wed, 24 Oct 2012 18:12:28 +0000 (14:12 -0400)
committerRick Waldron <waldron.rick@gmail.com>
Wed, 24 Oct 2012 18:12:28 +0000 (14:12 -0400)
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
src/data.js
test/unit/data.js

index 10adec6afc7b2818dd380dfcdc37908f8e71bb49..eb682feab37937a4580f9db61b12a43a1cc896f2 100644 (file)
@@ -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++ ) {
index d1d947f70c22bced721c37be7206bd639c0fe802..286bcc25da290fa860d96b77a01ad9f01ba3eb7b 100644 (file)
@@ -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)" );
+       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);