aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Methvin <dave.methvin@gmail.com>2010-12-27 13:43:52 -0600
committerColin Snover <github.com@zetafleet.com>2010-12-27 13:43:52 -0600
commit5fd21fc02bda43d4e31bcf2d5b55b918a9190a7f (patch)
treecc941470936574d52fb01f3e43f8f9b51a30cd68
parent64ee5581afd6e9667ad45e75f082c95e2725efa6 (diff)
downloadjquery-5fd21fc02bda43d4e31bcf2d5b55b918a9190a7f.tar.gz
jquery-5fd21fc02bda43d4e31bcf2d5b55b918a9190a7f.zip
Don't cache non-html strings in buildFragment to avoid possible collision with the names of Object methods like toString. Also makes the unit tests 0.5% to 8% faster. Fixes #6779.
-rw-r--r--src/manipulation.js4
-rw-r--r--test/unit/manipulation.js17
2 files changed, 19 insertions, 2 deletions
diff --git a/src/manipulation.js b/src/manipulation.js
index 5f4b15dd9..96caa02d0 100644
--- a/src/manipulation.js
+++ b/src/manipulation.js
@@ -440,12 +440,12 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
var fragment, cacheable, cacheresults,
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
- // Only cache "small" (1/2 KB) strings that are associated with the main document
+ // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
// Cloning options loses the selected state, so don't cache them
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
- !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+ args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
cacheable = true;
cacheresults = jQuery.fragments[ args[0] ];
diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js
index da1635400..e273cf08a 100644
--- a/test/unit/manipulation.js
+++ b/test/unit/manipulation.js
@@ -1247,3 +1247,20 @@ test("jQuery.cleanData", function() {
return div;
}
});
+
+test("jQuery.buildFragment - no plain-text caching (Bug #6779)", function() {
+ expect(1);
+
+ // DOM manipulation fails if added text matches an Object method
+ var $f = jQuery( "<div />" ).appendTo( "#main" ),
+ bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ];
+
+ for ( var i=0; i < bad.length; i++ ) {
+ try {
+ $f.append( bad[i] );
+ }
+ catch(e) {}
+ }
+ equals($f.text(), bad.join(''), "Cached strings that match Object properties");
+ $f.remove();
+});