Core: drop the document.implementation.createHTMLDocument usage

The document.implementation.createHTMLDocument("") method creates inert
documents which is good but using it has introduced issues around anchor
elements href property not resolving according to the current document.
Because of that, this patch is getting backed out on 1.x/2.x branches.

Refs cfe468f29c
Refs gh-1505
Fixes gh-2941
This commit is contained in:
Michał Gołębiowski 2016-03-02 12:28:00 +01:00
parent 5d620be420
commit c5c3073531
4 changed files with 3 additions and 60 deletions

View File

@ -2,11 +2,8 @@ define( [
"../core",
"../var/document",
"./var/rsingleTag",
"../manipulation/buildFragment",
// This is the only module that needs core/support
"./support"
], function( jQuery, document, rsingleTag, buildFragment, support ) {
"../manipulation/buildFragment"
], function( jQuery, document, rsingleTag, buildFragment ) {
// Argument "data" should be string of html
// context (optional): If specified, the fragment will be created in this context,
@ -20,12 +17,7 @@ jQuery.parseHTML = function( data, context, keepScripts ) {
keepScripts = context;
context = false;
}
// Stop scripts or inline event handlers from being executed immediately
// by using document.implementation
context = context || ( support.createHTMLDocument ?
document.implementation.createHTMLDocument( "" ) :
document );
context = context || document;
var parsed = rsingleTag.exec( data ),
scripts = !keepScripts && [];

View File

@ -1,18 +0,0 @@
define( [
"../var/document",
"../var/support"
], function( document, support ) {
// Support: Safari 8+
// In Safari 8 documents created via document.implementation.createHTMLDocument
// collapse sibling forms: the second one becomes a child of the first one.
// Because of that, this security measure has to be disabled in Safari 8.
// https://bugs.webkit.org/show_bug.cgi?id=137337
support.createHTMLDocument = ( function() {
var body = document.implementation.createHTMLDocument( "" ).body;
body.innerHTML = "<form></form><form></form>";
return body.childNodes.length === 2;
} )();
return support;
} );

View File

@ -1491,22 +1491,6 @@ QUnit.test("jQuery.parseHTML", function( assert ) {
assert.ok( jQuery.parseHTML("<#if><tr><p>This is a test.</p></tr><#/if>") || true, "Garbage input should not cause error" );
});
if ( jQuery.support.createHTMLDocument && !/opera.*version\/12\.1/i.test( navigator.userAgent ) ) {
QUnit.asyncTest( "jQuery.parseHTML", function( assert ) {
assert.expect( 1 );
Globals.register( "parseHTMLError" );
jQuery.globalEval( "parseHTMLError = false;" );
jQuery.parseHTML( "<img src=x onerror='parseHTMLError = true'>" );
window.setTimeout( function() {
QUnit.start();
assert.equal( window.parseHTMLError, false, "onerror eventhandler has not been called." );
}, 2000 );
} );
}
QUnit.test( "jQuery.parseJSON", function( assert ) {
assert.expect( 20 );

View File

@ -65,7 +65,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": version >= 13,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -84,7 +83,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -103,7 +101,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": false,
"cors": true,
"createHTMLDocument": true,
"focusin": true,
"noCloneChecked": false,
"optDisabled": true,
@ -122,7 +119,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": false,
"cors": false,
"createHTMLDocument": true,
"focusin": true,
"noCloneChecked": false,
"optDisabled": true,
@ -144,7 +140,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -163,7 +158,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -182,7 +176,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": false,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -201,7 +194,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -220,7 +212,6 @@ testIframeWithCallback(
"checkOn": false,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -239,7 +230,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -258,7 +248,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -277,7 +266,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": false,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -296,7 +284,6 @@ testIframeWithCallback(
"checkOn": true,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -315,7 +302,6 @@ testIframeWithCallback(
"checkOn": false,
"clearCloneStyle": true,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": true,
@ -334,7 +320,6 @@ testIframeWithCallback(
"checkOn": false,
"clearCloneStyle": false,
"cors": true,
"createHTMLDocument": true,
"focusin": false,
"noCloneChecked": true,
"optDisabled": false,