mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-29 08:34:54 +00:00
Deal with Parsoid's protocol-relative <base> tags in a DOMParser world
Protocol-relative <base> tags are fine when the iframe trick is used because the iframe inherits a default base URL from the parent document, so if the <base> is relative it can be resolved against that. However, a document created with DOMParser (or document.implementation, oops!) won't inherit anything, so anything other than a fully absolute <base> will just break. To make Parsoid's relative <base> work anyway, resolve it in the context of the main document, then write the resolved version back into the <base> tag. Change-Id: I7261bd5dbe9ec1f4077a4e5a00bd2a03ac237ca0
This commit is contained in:
parent
c149b1c071
commit
c06a86587c
|
@ -309,6 +309,27 @@ ve.init.mw.Target.static.apiRequest = function ( data, settings ) {
|
||||||
return $.ajax( settings );
|
return $.ajax( settings );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take a target document with a possibly relative base URL, and modify it to be absolute.
|
||||||
|
* The base URL of the target document is resolved using the base URL of the source document.
|
||||||
|
* @param {HTMLDocument} targetDoc Document whose base URL should be resolved
|
||||||
|
* @param {HTMLDocument} sourceDoc Document whose base URL should be used for resolution
|
||||||
|
*/
|
||||||
|
ve.init.mw.Target.static.fixBase = function ( targetDoc, sourceDoc ) {
|
||||||
|
var $base;
|
||||||
|
if ( !targetDoc.baseURI ) {
|
||||||
|
$base = $( 'base', targetDoc );
|
||||||
|
if ( $base.length ) {
|
||||||
|
// Modify the existing <base> tag
|
||||||
|
$base.attr( 'href', ve.resolveUrl( $base.attr( 'href' ), sourceDoc ) );
|
||||||
|
} else {
|
||||||
|
// No <base> tag, add one
|
||||||
|
$base = $( '<base>', targetDoc ).attr( 'href', sourceDoc.baseURI );
|
||||||
|
$( 'head', sourceDoc ).append( $base );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the RL modules for VE and registered plugin modules being loaded.
|
* Handle the RL modules for VE and registered plugin modules being loaded.
|
||||||
*
|
*
|
||||||
|
@ -367,6 +388,9 @@ ve.init.mw.Target.onLoad = function ( response ) {
|
||||||
this.originalHtml = data.content;
|
this.originalHtml = data.content;
|
||||||
this.doc = ve.createDocumentFromHtml( this.originalHtml );
|
this.doc = ve.createDocumentFromHtml( this.originalHtml );
|
||||||
|
|
||||||
|
// Parsoid outputs a protocol-relative <base> tag, so absolutize it
|
||||||
|
this.constructor.static.fixBase( this.doc, document );
|
||||||
|
|
||||||
this.remoteNotices = ve.getObjectValues( data.notices );
|
this.remoteNotices = ve.getObjectValues( data.notices );
|
||||||
this.$checkboxes = $( ve.getObjectValues( data.checkboxes ).join( '' ) );
|
this.$checkboxes = $( ve.getObjectValues( data.checkboxes ).join( '' ) );
|
||||||
// Populate checkboxes with default values for minor and watch
|
// Populate checkboxes with default values for minor and watch
|
||||||
|
|
Loading…
Reference in a new issue