Core: introduce createHTMLDocument in parseHTML; Safari 8/IE8 left out

Close gh-1506
This commit is contained in:
Timmy Willison 2014-12-10 09:48:55 -05:00
parent 51564bbd39
commit 828a718aa0
4 changed files with 83 additions and 4 deletions

View File

@ -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 && [];

15
src/core/support.js Normal file
View File

@ -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 = "<form></form><form></form>";
return doc.body.childNodes.length === 2;
})();
return support;
});

View File

@ -1348,6 +1348,22 @@ test("jQuery.parseHTML", function() {
equal( jQuery.parseHTML("<td><td>")[ 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( "<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 );

View File

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