Commit 9d1d90e7 authored by Jason Bedard's avatar Jason Bedard Committed by Timmy Willison

Data: use removeAttribute in cleanData to bypass Chrome bug

Related:
https://code.google.com/p/chromium/issues/detail?id=378607

Fixes gh-1664
parent 57652eec
...@@ -230,9 +230,9 @@ function internalRemoveData( elem, name, pvt ) { ...@@ -230,9 +230,9 @@ function internalRemoveData( elem, name, pvt ) {
/* jshint eqeqeq: true */ /* jshint eqeqeq: true */
delete cache[ id ]; delete cache[ id ];
// When all else fails, null // When all else fails, undefined
} else { } else {
cache[ id ] = null; cache[ id ] = undefined;
} }
} }
......
...@@ -5,8 +5,6 @@ define([ ...@@ -5,8 +5,6 @@ define([
(function() { (function() {
var div = document.createElement( "div" ); var div = document.createElement( "div" );
// Execute the test only if not already executed in another module.
if (support.deleteExpando == null) {
// Support: IE<9 // Support: IE<9
support.deleteExpando = true; support.deleteExpando = true;
try { try {
...@@ -14,7 +12,6 @@ define([ ...@@ -14,7 +12,6 @@ define([
} catch ( e ) { } catch ( e ) {
support.deleteExpando = false; support.deleteExpando = false;
} }
}
// Null elements to avoid leaks in IE. // Null elements to avoid leaks in IE.
div = null; div = null;
......
...@@ -367,7 +367,7 @@ jQuery.extend({ ...@@ -367,7 +367,7 @@ jQuery.extend({
i = 0, i = 0,
internalKey = jQuery.expando, internalKey = jQuery.expando,
cache = jQuery.cache, cache = jQuery.cache,
deleteExpando = support.deleteExpando, attributes = support.attributes,
special = jQuery.event.special; special = jQuery.event.special;
for ( ; (elem = elems[i]) != null; i++ ) { for ( ; (elem = elems[i]) != null; i++ ) {
...@@ -394,17 +394,18 @@ jQuery.extend({ ...@@ -394,17 +394,18 @@ jQuery.extend({
delete cache[ id ]; delete cache[ id ];
// IE does not allow us to delete expando properties from nodes, // Support: IE<9
// nor does it have a removeAttribute function on Document nodes; // IE does not allow us to delete expando properties from nodes
// we must handle all of these cases // IE creates expando attributes along with the property
if ( deleteExpando ) { // IE does not have a removeAttribute function on Document nodes
delete elem[ internalKey ]; if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
} else if ( typeof elem.removeAttribute !== "undefined" ) {
elem.removeAttribute( internalKey ); elem.removeAttribute( internalKey );
// Webkit & Blink performance suffers when deleting properties
// from DOM nodes, so set to undefined instead
// https://code.google.com/p/chromium/issues/detail?id=378607
} else { } else {
elem[ internalKey ] = null; elem[ internalKey ] = undefined;
} }
deletedIds.push( id ); deletedIds.push( id );
......
define([ define([
"../core",
"../var/support" "../var/support"
], function( support ) { ], function( jQuery, support ) {
(function() { (function() {
var div = document.createElement( "div" ), var div = document.createElement( "div" ),
...@@ -38,16 +39,11 @@ define([ ...@@ -38,16 +39,11 @@ define([
// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
support.noCloneEvent = !!div.addEventListener; support.noCloneEvent = !!div.addEventListener;
// Execute the test only if not already executed in another module.
if (support.deleteExpando == null) {
// Support: IE<9 // Support: IE<9
support.deleteExpando = true; // Since attributes and properties are the same in IE,
try { // cleanData must set properties to undefined rather than use removeAttribute
delete div.test; div[ jQuery.expando ] = 1;
} catch ( e ) { support.attributes = !div.getAttribute( jQuery.expando );
support.deleteExpando = false;
}
}
})(); })();
return support; return support;
......
...@@ -100,18 +100,10 @@ test("jQuery.data(document)", 25, function() { ...@@ -100,18 +100,10 @@ test("jQuery.data(document)", 25, function() {
}); });
test("Expando cleanup", 4, function() { test("Expando cleanup", 4, function() {
var expected, actual, var div = document.createElement("div");
div = document.createElement("div");
function assertExpandoAbsent(message) { function assertExpandoAbsent(message) {
if (jQuery.support.deleteExpando) { strictEqual( div[ jQuery.expando ], undefined, message );
expected = false;
actual = jQuery.expando in div;
} else {
expected = null;
actual = div[ jQuery.expando ];
}
equal( actual, expected, message );
} }
assertExpandoAbsent("There is no expando on new elements"); assertExpandoAbsent("There is no expando on new elements");
......
...@@ -73,6 +73,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -73,6 +73,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
// Android browser on Android >= 4.4). // Android browser on Android >= 4.4).
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -103,6 +104,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -103,6 +104,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) { } else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": false, "boxSizingReliable": false,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -133,6 +135,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -133,6 +135,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /msie 9\.0/i.test( userAgent ) ) { } else if ( /msie 9\.0/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": false, "boxSizingReliable": false,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -163,6 +166,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -163,6 +166,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /msie 8\.0/i.test( userAgent ) ) { } else if ( /msie 8\.0/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": false,
"boxSizingReliable": false, "boxSizingReliable": false,
"changeBubbles": false, "changeBubbles": false,
"checkClone": true, "checkClone": true,
...@@ -193,6 +197,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -193,6 +197,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /(6|7)\.0(\.\d+|) safari/i.test( userAgent ) ) { } else if ( /(6|7)\.0(\.\d+|) safari/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -223,6 +228,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -223,6 +228,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /8.0(\.\d+|) safari/i.test( userAgent ) ) { } else if ( /8.0(\.\d+|) safari/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -253,6 +259,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -253,6 +259,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /firefox/i.test( userAgent ) ) { } else if ( /firefox/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -283,6 +290,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -283,6 +290,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /iphone os/i.test( userAgent ) ) { } else if ( /iphone os/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
...@@ -313,6 +321,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -313,6 +321,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /android 4\.[0-3]/i.test( userAgent ) ) { } else if ( /android 4\.[0-3]/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": false, "checkClone": false,
...@@ -343,6 +352,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec ...@@ -343,6 +352,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
} else if ( /android 2\.3/i.test( userAgent ) ) { } else if ( /android 2\.3/i.test( userAgent ) ) {
expected = { expected = {
"ajax": true, "ajax": true,
"attributes": true,
"boxSizingReliable": true, "boxSizingReliable": true,
"changeBubbles": true, "changeBubbles": true,
"checkClone": true, "checkClone": true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment