]> source.dussan.org Git - jquery.git/commitdiff
Core: introduce createHTMLDocument in parseHTML; Safari 8/IE8 left out
authorTimmy Willison <timmywillisn@gmail.com>
Wed, 10 Dec 2014 14:48:55 +0000 (09:48 -0500)
committerTimmy Willison <timmywillisn@gmail.com>
Wed, 10 Dec 2014 15:08:04 +0000 (10:08 -0500)
Close gh-1506

src/core/parseHTML.js
src/core/support.js [new file with mode: 0644]
test/unit/core.js
test/unit/support.js

index 808d60e3dc4f052fe8e2248c529896d27fcf981b..2b638e6331b9b6fde5d1f5b84fdef36971a32c4c 100644 (file)
@@ -1,8 +1,13 @@
 define([
        "../core",
        "./var/rsingleTag",
-       "../manipulation" // buildFragment
-], function( jQuery, rsingleTag ) {
+
+       // This is the only module that needs core/support
+       "./support",
+
+       // buildFragment
+       "../manipulation"
+], function( jQuery, rsingleTag, support ) {
 
 // data: string of html
 // context (optional): If specified, the fragment will be created in this context,
@@ -16,7 +21,11 @@ jQuery.parseHTML = function( data, context, keepScripts ) {
                keepScripts = context;
                context = false;
        }
-       context = context || document;
+       // document.implementation stops scripts or inline event handlers from
+       // being executed immediately
+       context = context || ( support.createHTMLDocument ?
+               document.implementation.createHTMLDocument( "" ) :
+               document );
 
        var parsed = rsingleTag.exec( data ),
                scripts = !keepScripts && [];
diff --git a/src/core/support.js b/src/core/support.js
new file mode 100644 (file)
index 0000000..eb88d8b
--- /dev/null
@@ -0,0 +1,15 @@
+define([
+       "../var/support"
+], function( support ) {
+
+support.createHTMLDocument = (function() {
+       if ( !document.implementation.createHTMLDocument ) {
+               return false;
+       }
+       var doc = document.implementation.createHTMLDocument( "" );
+       doc.body.innerHTML = "<form></form><form></form>";
+       return doc.body.childNodes.length === 2;
+})();
+
+return support;
+});
index 9d02f1a861939a2bd678bb164fe75c28401d9915..ab6aff0e3d058037e470ba4635e9ef1b6a148b23 100644 (file)
@@ -1348,6 +1348,22 @@ test("jQuery.parseHTML", function() {
        equal( jQuery.parseHTML("<td><td>")[ 1 ].parentNode.nodeType, 11, "parentNode should be documentFragment" );
 });
 
+if ( jQuery.support.createHTMLDocument ) {
+       asyncTest("jQuery.parseHTML", function() {
+               expect ( 1 );
+
+               Globals.register("parseHTMLError");
+
+               jQuery.globalEval("parseHTMLError = false;");
+               jQuery.parseHTML( "<img src=x onerror='parseHTMLError = true'>" );
+
+               window.setTimeout(function() {
+                       start();
+                       equal( window.parseHTMLError, false, "onerror eventhandler has not been called." );
+               }, 2000);
+       });
+}
+
 test("jQuery.parseJSON", function() {
        expect( 20 );
 
index 12f2c6421e714b497fdc45db714439bf6cb14c2b..a214ccd9a21bee7605df8a297bccd40f554473f2 100644 (file)
@@ -79,6 +79,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": true,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,
@@ -108,6 +109,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": false,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": true,
@@ -137,6 +139,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": false,
                        "cors": false,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": true,
@@ -166,6 +169,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": true,
                        "cors": false,
+                       "createHTMLDocument": false,
                        "cssFloat": false,
                        "deleteExpando": false,
                        "focusinBubbles": true,
@@ -186,7 +190,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "style": false,
                        "submitBubbles": false
                };
-       } else if ( /(6|7|8)\.0(\.\d+|) safari/i.test( userAgent ) ) {
+       } else if ( /(6|7)\.0(\.\d+|) safari/i.test( userAgent ) ) {
                expected = {
                        "ajax": true,
                        "boxSizingReliable": true,
@@ -195,6 +199,37 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": true,
                        "cors": true,
+                       "createHTMLDocument": true,
+                       "cssFloat": true,
+                       "deleteExpando": true,
+                       "focusinBubbles": false,
+                       "html5Clone": true,
+                       "htmlSerialize": true,
+                       "input": true,
+                       "leadingWhitespace": true,
+                       "noCloneChecked": true,
+                       "noCloneEvent": true,
+                       "opacity": true,
+                       "optDisabled": true,
+                       "optSelected": true,
+                       "ownLast": false,
+                       "pixelPosition": false,
+                       "radioValue": true,
+                       "reliableHiddenOffsets": true,
+                       "reliableMarginRight": true,
+                       "style": true,
+                       "submitBubbles": true
+               };
+       } else if ( /8.0(\.\d+|) safari/i.test( userAgent ) ) {
+               expected = {
+                       "ajax": true,
+                       "boxSizingReliable": true,
+                       "changeBubbles": true,
+                       "checkClone": true,
+                       "checkOn": true,
+                       "clearCloneStyle": true,
+                       "cors": true,
+                       "createHTMLDocument": false,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,
@@ -224,6 +259,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": true,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,
@@ -253,6 +289,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": true,
                        "clearCloneStyle": true,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,
@@ -282,6 +319,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": false,
                        "clearCloneStyle": true,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,
@@ -311,6 +349,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
                        "checkOn": false,
                        "clearCloneStyle": false,
                        "cors": true,
+                       "createHTMLDocument": true,
                        "cssFloat": true,
                        "deleteExpando": true,
                        "focusinBubbles": false,