aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimmy Willison <timmywillisn@gmail.com>2014-12-10 09:48:55 -0500
committerTimmy Willison <timmywillisn@gmail.com>2014-12-10 09:51:30 -0500
commitcfe468f29c4cbe1a457d0feb17dec90dcfd7c280 (patch)
tree95ee702e8f3be147f0bb7f5f7f34226cac435927
parent8653068dd6b8a515f5c1d8a0fda4479e9534103e (diff)
downloadjquery-cfe468f29c4cbe1a457d0feb17dec90dcfd7c280.tar.gz
jquery-cfe468f29c4cbe1a457d0feb17dec90dcfd7c280.zip
Core: re-introduce createHTMLDocument in parseHTML; Safari 8 left out
Close gh-1505
-rw-r--r--src/core/parseHTML.js14
-rw-r--r--src/core/support.js12
-rw-r--r--test/data/testinit.js2
-rw-r--r--test/unit/core.js18
-rw-r--r--test/unit/support.js27
5 files changed, 67 insertions, 6 deletions
diff --git a/src/core/parseHTML.js b/src/core/parseHTML.js
index e0348971d..2b638e633 100644
--- a/src/core/parseHTML.js
+++ b/src/core/parseHTML.js
@@ -2,8 +2,12 @@ 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,
@@ -17,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..ebed460ae
--- /dev/null
+++ b/src/core/support.js
@@ -0,0 +1,12 @@
+define([
+ "../var/support"
+], function( support ) {
+
+support.createHTMLDocument = (function() {
+ var doc = document.implementation.createHTMLDocument( "" );
+ doc.body.innerHTML = "<form></form><form></form>";
+ return doc.body.childNodes.length === 2;
+})();
+
+return support;
+});
diff --git a/test/data/testinit.js b/test/data/testinit.js
index 9b3caba93..468956d4d 100644
--- a/test/data/testinit.js
+++ b/test/data/testinit.js
@@ -301,7 +301,7 @@ this.loadTests = function() {
/**
* Run in noConflict mode
*/
- if (jQuery.noConflict) {
+ if ( jQuery.noConflict ) {
jQuery.noConflict();
}
diff --git a/test/unit/core.js b/test/unit/core.js
index 17006a8ab..034473b5c 100644
--- a/test/unit/core.js
+++ b/test/unit/core.js
@@ -235,7 +235,7 @@ test( "globalEval execution after script injection (#7862)", 1, function() {
});
// This is not run in AMD mode
-if (jQuery.noConflict) {
+if ( jQuery.noConflict ) {
test("noConflict", function() {
expect(7);
@@ -1370,6 +1370,22 @@ test("jQuery.parseHTML", function() {
ok( jQuery.parseHTML("<#if><tr><p>This is a test.</p></tr><#/if>") || true, "Garbage input should not cause error" );
});
+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 );
diff --git a/test/unit/support.js b/test/unit/support.js
index 11f15a33b..0e58aa53b 100644
--- a/test/unit/support.js
+++ b/test/unit/support.js
@@ -61,6 +61,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": true,
@@ -77,6 +78,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": false,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": true,
"noCloneChecked": false,
"optDisabled": true,
@@ -93,6 +95,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": false,
"cors": false,
+ "createHTMLDocument": true,
"focusinBubbles": true,
"noCloneChecked": false,
"optDisabled": true,
@@ -101,7 +104,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"radioValue": false,
"reliableMarginRight": true
};
- } 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,
@@ -109,6 +112,24 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
+ "createHTMLDocument": true,
+ "focusinBubbles": false,
+ "noCloneChecked": true,
+ "optDisabled": true,
+ "optSelected": true,
+ "pixelPosition": false,
+ "radioValue": true,
+ "reliableMarginRight": true
+ };
+ } else if ( /8.0(\.\d+|) safari/i.test( userAgent ) ) {
+ expected = {
+ "ajax": true,
+ "boxSizingReliable": true,
+ "checkClone": true,
+ "checkOn": true,
+ "clearCloneStyle": true,
+ "cors": true,
+ "createHTMLDocument": false,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": true,
@@ -125,6 +146,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": true,
@@ -141,6 +163,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": true,
@@ -157,6 +180,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": false,
"clearCloneStyle": true,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": true,
@@ -173,6 +197,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"checkOn": false,
"clearCloneStyle": false,
"cors": true,
+ "createHTMLDocument": true,
"focusinBubbles": false,
"noCloneChecked": true,
"optDisabled": false,