Core: set the base href of the context in parseHTML

Fixes gh-2965
Close gh-3022
This commit is contained in:
Timmy Willison 2016-03-28 10:32:15 -04:00
parent 5cbb234dd3
commit 10fc59007d
2 changed files with 30 additions and 7 deletions

View File

@ -21,14 +21,28 @@ jQuery.parseHTML = function( data, context, keepScripts ) {
context = false;
}
// Stop scripts or inline event handlers from being executed immediately
// by using document.implementation
context = context || ( support.createHTMLDocument ?
document.implementation.createHTMLDocument( "" ) :
document );
var base, parsed, scripts;
var parsed = rsingleTag.exec( data ),
scripts = !keepScripts && [];
if ( !context ) {
// Stop scripts or inline event handlers from being executed immediately
// by using document.implementation
if ( support.createHTMLDocument ) {
context = document.implementation.createHTMLDocument( "" );
// Set the base href for the created document
// so any parsed elements with URLs
// are based on the document's URL (gh-2965)
base = context.createElement( "base" );
base.href = document.location.href;
context.head.appendChild( base );
} else {
context = document;
}
}
parsed = rsingleTag.exec( data );
scripts = !keepScripts && [];
// Single tag
if ( parsed ) {

View File

@ -1563,6 +1563,15 @@ 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" );
} );
QUnit.test( "jQuery.parseHTML(<a href>) - gh-2965", function( assert ) {
assert.expect( 1 );
var html = "<a href='test.html'></a>",
href = jQuery.parseHTML( html )[ 0 ].href;
assert.ok( /\/test\.html$/.test( href ), "href is not lost after parsing anchor" );
} );
if ( jQuery.support.createHTMLDocument ) {
QUnit.asyncTest( "jQuery.parseHTML", function( assert ) {
assert.expect( 1 );