diff options
author | Timmy Willison <timmywillisn@gmail.com> | 2014-12-10 09:48:55 -0500 |
---|---|---|
committer | Timmy Willison <timmywillisn@gmail.com> | 2014-12-10 09:51:30 -0500 |
commit | cfe468f29c4cbe1a457d0feb17dec90dcfd7c280 (patch) | |
tree | 95ee702e8f3be147f0bb7f5f7f34226cac435927 | |
parent | 8653068dd6b8a515f5c1d8a0fda4479e9534103e (diff) | |
download | jquery-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.js | 14 | ||||
-rw-r--r-- | src/core/support.js | 12 | ||||
-rw-r--r-- | test/data/testinit.js | 2 | ||||
-rw-r--r-- | test/unit/core.js | 18 | ||||
-rw-r--r-- | test/unit/support.js | 27 |
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, |