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,
|