From: Timmy Willison Date: Wed, 10 Dec 2014 14:48:55 +0000 (-0500) Subject: Core: introduce createHTMLDocument in parseHTML; Safari 8/IE8 left out X-Git-Tag: 3.0.0-alpha1+compat~179 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=828a718aa028ba6cde7b4076d94b10ef0853f9ee;p=jquery.git Core: introduce createHTMLDocument in parseHTML; Safari 8/IE8 left out Close gh-1506 --- diff --git a/src/core/parseHTML.js b/src/core/parseHTML.js index 808d60e3d..2b638e633 100644 --- a/src/core/parseHTML.js +++ b/src/core/parseHTML.js @@ -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 index 000000000..eb88d8bf9 --- /dev/null +++ b/src/core/support.js @@ -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 = "
"; + return doc.body.childNodes.length === 2; +})(); + +return support; +}); diff --git a/test/unit/core.js b/test/unit/core.js index 9d02f1a86..ab6aff0e3 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1348,6 +1348,22 @@ test("jQuery.parseHTML", function() { equal( jQuery.parseHTML("")[ 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( "" ); + + window.setTimeout(function() { + start(); + equal( window.parseHTMLError, false, "onerror eventhandler has not been called." ); + }, 2000); + }); +} + test("jQuery.parseJSON", function() { expect( 20 ); diff --git a/test/unit/support.js b/test/unit/support.js index 12f2c6421..a214ccd9a 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -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,