Skip to content

Commit

Permalink
Core: re-introduce createHTMLDocument in parseHTML; Safari 8 left out
Browse files Browse the repository at this point in the history
Close gh-1505
  • Loading branch information
timmywil committed Dec 10, 2014
1 parent 8653068 commit cfe468f
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 6 deletions.
14 changes: 11 additions & 3 deletions src/core/parseHTML.js
Expand Up @@ -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,
Expand All @@ -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 && [];
Expand Down
12 changes: 12 additions & 0 deletions 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>";

This comment has been minimized.

Copy link
@phistuck

phistuck Jul 15, 2015

Perhaps add a comment here?

This comment has been minimized.

Copy link
@mgol

mgol Jul 16, 2015

Member

Yeah, it should mention Safari 8 explicitely. 👍

This comment has been minimized.

Copy link
@mgol

mgol Jul 20, 2015

Member

Added in d242753 on master & 9c373c3 on compat. Thanks for noticing!

return doc.body.childNodes.length === 2;
})();

return support;
});
2 changes: 1 addition & 1 deletion test/data/testinit.js
Expand Up @@ -301,7 +301,7 @@ this.loadTests = function() {
/**
* Run in noConflict mode
*/
if (jQuery.noConflict) {
if ( jQuery.noConflict ) {
jQuery.noConflict();
}

Expand Down
18 changes: 17 additions & 1 deletion test/unit/core.js
Expand Up @@ -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);

Expand Down Expand Up @@ -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 );

Expand Down
27 changes: 26 additions & 1 deletion test/unit/support.js
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -101,14 +104,32 @@ 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,
"checkClone": true,
"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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down

0 comments on commit cfe468f

Please sign in to comment.