Catrope has uploaded a new change for review.
https://gerrit.wikimedia.org/r/57246
Change subject: Actually use the doc parameter in toDomElements()
......................................................................
Actually use the doc parameter in toDomElements()
It's been passed in for a while, but nothing ever used it. As we know
some browsers don't like it when we create elements in the wrong
document, and this ensures we always use the correct document for
createElement().
Change-Id: Ia3d2fabe0516956105ad2b5625ed2f76c015c26e
---
M modules/ve/dm/annotations/ve.dm.LinkAnnotation.js
M modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
M modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
M modules/ve/dm/annotations/ve.dm.TextStyleAnnotation.js
M modules/ve/dm/metaitems/ve.dm.AlienMetaItem.js
M modules/ve/dm/metaitems/ve.dm.MWCategoryMetaItem.js
M modules/ve/dm/metaitems/ve.dm.MWLanguageMetaItem.js
M modules/ve/dm/nodes/ve.dm.AlienNode.js
M modules/ve/dm/nodes/ve.dm.BreakNode.js
M modules/ve/dm/nodes/ve.dm.CenterNode.js
M modules/ve/dm/nodes/ve.dm.DefinitionListItemNode.js
M modules/ve/dm/nodes/ve.dm.DefinitionListNode.js
M modules/ve/dm/nodes/ve.dm.HeadingNode.js
M modules/ve/dm/nodes/ve.dm.ImageNode.js
M modules/ve/dm/nodes/ve.dm.ListItemNode.js
M modules/ve/dm/nodes/ve.dm.ListNode.js
M modules/ve/dm/nodes/ve.dm.MWEntityNode.js
M modules/ve/dm/nodes/ve.dm.ParagraphNode.js
M modules/ve/dm/nodes/ve.dm.PreformattedNode.js
M modules/ve/dm/nodes/ve.dm.TableCellNode.js
M modules/ve/dm/nodes/ve.dm.TableNode.js
M modules/ve/dm/nodes/ve.dm.TableRowNode.js
M modules/ve/dm/nodes/ve.dm.TableSectionNode.js
M modules/ve/dm/ve.dm.Annotation.js
M modules/ve/dm/ve.dm.Model.js
M modules/ve/test/dm/ve.dm.Converter.test.js
26 files changed, 56 insertions(+), 53 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/46/57246/1
diff --git a/modules/ve/dm/annotations/ve.dm.LinkAnnotation.js
b/modules/ve/dm/annotations/ve.dm.LinkAnnotation.js
index 4487c26..fef3ce5 100644
--- a/modules/ve/dm/annotations/ve.dm.LinkAnnotation.js
+++ b/modules/ve/dm/annotations/ve.dm.LinkAnnotation.js
@@ -49,8 +49,8 @@
};
};
-ve.dm.LinkAnnotation.static.toDomElements = function ( dataElement ) {
- var domElement = document.createElement( 'a' );
+ve.dm.LinkAnnotation.static.toDomElements = function ( dataElement, doc ) {
+ var domElement = doc.createElement( 'a' );
domElement.setAttribute( 'href', dataElement.attributes.href );
return [ domElement ];
};
diff --git a/modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
b/modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
index 299f281..4b55b82 100644
--- a/modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
+++ b/modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
@@ -55,7 +55,7 @@
};
ve.dm.MWExternalLinkAnnotation.static.toDomElements = function ( dataElement )
{
- var parentResult = ve.dm.LinkAnnotation.static.toDomElements(
dataElement );
+ var parentResult = ve.dm.LinkAnnotation.static.toDomElements.apply(
this, arguments );
parentResult[0].setAttribute( 'rel', dataElement.attributes.rel ||
'mw:ExtLink' );
return parentResult;
};
diff --git a/modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
b/modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
index 025fd18..ce256e8 100644
--- a/modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
+++ b/modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
@@ -57,9 +57,9 @@
};
};
-ve.dm.MWInternalLinkAnnotation.static.toDomElements = function ( dataElement )
{
+ve.dm.MWInternalLinkAnnotation.static.toDomElements = function ( dataElement,
doc ) {
var href,
- domElement = document.createElement( 'a' ),
+ domElement = doc.createElement( 'a' ),
title = dataElement.attributes.title,
origTitle = dataElement.attributes.origTitle;
if ( origTitle && decodeURIComponent( origTitle ).replace( /_/g, ' ' )
=== title ) {
diff --git a/modules/ve/dm/annotations/ve.dm.TextStyleAnnotation.js
b/modules/ve/dm/annotations/ve.dm.TextStyleAnnotation.js
index 5432984..1ea5f92 100644
--- a/modules/ve/dm/annotations/ve.dm.TextStyleAnnotation.js
+++ b/modules/ve/dm/annotations/ve.dm.TextStyleAnnotation.js
@@ -58,7 +58,7 @@
};
};
-ve.dm.TextStyleAnnotation.static.toDomElements = function ( dataElement ) {
+ve.dm.TextStyleAnnotation.static.toDomElements = function ( dataElement, doc )
{
var nodeNames = {
'bold': 'b',
'italic': 'i',
@@ -72,7 +72,7 @@
'superScript': 'sup',
'subScript': 'sub'
};
- return [ document.createElement( nodeNames[dataElement.type.substring(
10 )] ) ];
+ return [ doc.createElement( nodeNames[dataElement.type.substring( 10 )]
) ];
};
diff --git a/modules/ve/dm/metaitems/ve.dm.AlienMetaItem.js
b/modules/ve/dm/metaitems/ve.dm.AlienMetaItem.js
index ef8ea24..4f4b1e2 100644
--- a/modules/ve/dm/metaitems/ve.dm.AlienMetaItem.js
+++ b/modules/ve/dm/metaitems/ve.dm.AlienMetaItem.js
@@ -46,7 +46,7 @@
return dataElement;
};
-ve.dm.AlienMetaItem.static.toDomElements = function ( dataElement ) {
+ve.dm.AlienMetaItem.static.toDomElements = function ( dataElement, doc ) {
var style = dataElement.attributes && dataElement.attributes.style ||
'meta',
isLink = style === 'link',
tag = isLink ? 'link' : 'meta',
@@ -54,9 +54,9 @@
valueAttr = isLink ? 'href' : 'content',
domElement;
if ( style === 'comment' ) {
- return [ document.createComment( dataElement.attributes &&
dataElement.attributes.text || '' ) ];
+ return [ doc.createComment( dataElement.attributes &&
dataElement.attributes.text || '' ) ];
}
- domElement = document.createElement( tag );
+ domElement = doc.createElement( tag );
if ( dataElement.attributes && dataElement.attributes.key !== null ) {
domElement.setAttribute( keyAttr, dataElement.attributes.key );
}
diff --git a/modules/ve/dm/metaitems/ve.dm.MWCategoryMetaItem.js
b/modules/ve/dm/metaitems/ve.dm.MWCategoryMetaItem.js
index 072d2a9..5d454a6 100644
--- a/modules/ve/dm/metaitems/ve.dm.MWCategoryMetaItem.js
+++ b/modules/ve/dm/metaitems/ve.dm.MWCategoryMetaItem.js
@@ -48,9 +48,9 @@
};
};
-ve.dm.MWCategoryMetaItem.static.toDomElements = function ( dataElement ) {
+ve.dm.MWCategoryMetaItem.static.toDomElements = function ( dataElement, doc ) {
var href,
- domElement = document.createElement( 'link' ),
+ domElement = doc.createElement( 'link' ),
hrefPrefix = dataElement.attributes.hrefPrefix,
category = dataElement.attributes.category,
sortkey = dataElement.attributes.sortkey,
diff --git a/modules/ve/dm/metaitems/ve.dm.MWLanguageMetaItem.js
b/modules/ve/dm/metaitems/ve.dm.MWLanguageMetaItem.js
index 6634772..0586ad3 100644
--- a/modules/ve/dm/metaitems/ve.dm.MWLanguageMetaItem.js
+++ b/modules/ve/dm/metaitems/ve.dm.MWLanguageMetaItem.js
@@ -41,8 +41,8 @@
};
};
-ve.dm.MWLanguageMetaItem.static.toDomElements = function ( dataElement ) {
- var domElement = document.createElement( 'link' );
+ve.dm.MWLanguageMetaItem.static.toDomElements = function ( dataElement, doc ) {
+ var domElement = doc.createElement( 'link' );
domElement.setAttribute( 'rel', 'mw:WikiLink/Language' );
domElement.setAttribute( 'href', dataElement.attributes.href );
return [ domElement ];
diff --git a/modules/ve/dm/nodes/ve.dm.AlienNode.js
b/modules/ve/dm/nodes/ve.dm.AlienNode.js
index f20e547..0d60f1b 100644
--- a/modules/ve/dm/nodes/ve.dm.AlienNode.js
+++ b/modules/ve/dm/nodes/ve.dm.AlienNode.js
@@ -65,8 +65,8 @@
};
};
-ve.dm.AlienNode.static.toDomElements = function ( dataElement ) {
- var wrapper = document.createElement( 'div' );
+ve.dm.AlienNode.static.toDomElements = function ( dataElement, doc ) {
+ var wrapper = doc.createElement( 'div' );
wrapper.innerHTML = dataElement.attributes.html;
// Convert wrapper.children to an array
return Array.prototype.slice.call( wrapper.childNodes, 0 );
diff --git a/modules/ve/dm/nodes/ve.dm.BreakNode.js
b/modules/ve/dm/nodes/ve.dm.BreakNode.js
index 30e1f17..ae71c57 100644
--- a/modules/ve/dm/nodes/ve.dm.BreakNode.js
+++ b/modules/ve/dm/nodes/ve.dm.BreakNode.js
@@ -35,8 +35,8 @@
return { 'type': 'break' };
};
-ve.dm.BreakNode.static.toDomElements = function () {
- return [ document.createElement( 'br' ) ];
+ve.dm.BreakNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'br' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.CenterNode.js
b/modules/ve/dm/nodes/ve.dm.CenterNode.js
index 2c8d3bb..f8af6ce 100644
--- a/modules/ve/dm/nodes/ve.dm.CenterNode.js
+++ b/modules/ve/dm/nodes/ve.dm.CenterNode.js
@@ -33,8 +33,8 @@
return { 'type': 'center' };
};
-ve.dm.CenterNode.static.toDomElements = function () {
- return [ document.createElement( 'center' ) ];
+ve.dm.CenterNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'center' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.DefinitionListItemNode.js
b/modules/ve/dm/nodes/ve.dm.DefinitionListItemNode.js
index d20cf3e..22ed198 100644
--- a/modules/ve/dm/nodes/ve.dm.DefinitionListItemNode.js
+++ b/modules/ve/dm/nodes/ve.dm.DefinitionListItemNode.js
@@ -40,9 +40,9 @@
return { 'type': 'definitionListItem', 'attributes': { 'style': style }
};
};
-ve.dm.DefinitionListItemNode.static.toDomElements = function ( dataElement ) {
+ve.dm.DefinitionListItemNode.static.toDomElements = function ( dataElement,
doc ) {
var tag = dataElement.attributes && dataElement.attributes.style ===
'term' ? 'dt' : 'dd';
- return [ document.createElement( tag ) ];
+ return [ doc.createElement( tag ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.DefinitionListNode.js
b/modules/ve/dm/nodes/ve.dm.DefinitionListNode.js
index e71fe56..99e2765 100644
--- a/modules/ve/dm/nodes/ve.dm.DefinitionListNode.js
+++ b/modules/ve/dm/nodes/ve.dm.DefinitionListNode.js
@@ -35,8 +35,8 @@
return { 'type': 'definitionList' };
};
-ve.dm.DefinitionListNode.static.toDomElements = function () {
- return [ document.createElement( 'dl' ) ];
+ve.dm.DefinitionListNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'dl' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.HeadingNode.js
b/modules/ve/dm/nodes/ve.dm.HeadingNode.js
index 00601e8..a5f7c5f 100644
--- a/modules/ve/dm/nodes/ve.dm.HeadingNode.js
+++ b/modules/ve/dm/nodes/ve.dm.HeadingNode.js
@@ -48,9 +48,9 @@
return { 'type': 'heading', 'attributes': { 'level': level } };
};
-ve.dm.HeadingNode.static.toDomElements = function ( dataElement ) {
+ve.dm.HeadingNode.static.toDomElements = function ( dataElement, doc ) {
var level = dataElement.attributes && dataElement.attributes.level || 1;
- return [ document.createElement( 'h' + level ) ];
+ return [ doc.createElement( 'h' + level ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.ImageNode.js
b/modules/ve/dm/nodes/ve.dm.ImageNode.js
index 6b075ce..a0d2525 100644
--- a/modules/ve/dm/nodes/ve.dm.ImageNode.js
+++ b/modules/ve/dm/nodes/ve.dm.ImageNode.js
@@ -35,8 +35,8 @@
return { 'type': 'image' };
};
-ve.dm.ImageNode.static.toDomElements = function () {
- return [ document.createElement( 'img' ) ];
+ve.dm.ImageNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'img' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.ListItemNode.js
b/modules/ve/dm/nodes/ve.dm.ListItemNode.js
index a56e00c..835c2f8 100644
--- a/modules/ve/dm/nodes/ve.dm.ListItemNode.js
+++ b/modules/ve/dm/nodes/ve.dm.ListItemNode.js
@@ -35,8 +35,8 @@
return { 'type': 'listItem' };
};
-ve.dm.ListItemNode.static.toDomElements = function () {
- return [ document.createElement( 'li' ) ];
+ve.dm.ListItemNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'li' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.ListNode.js
b/modules/ve/dm/nodes/ve.dm.ListNode.js
index 79c0934..07ca99f 100644
--- a/modules/ve/dm/nodes/ve.dm.ListNode.js
+++ b/modules/ve/dm/nodes/ve.dm.ListNode.js
@@ -40,9 +40,9 @@
return { 'type': 'list', 'attributes': { 'style': style } };
};
-ve.dm.ListNode.static.toDomElements = function ( dataElement ) {
+ve.dm.ListNode.static.toDomElements = function ( dataElement, doc ) {
var tag = dataElement.attributes && dataElement.attributes.style ===
'number' ? 'ol' : 'ul';
- return [ document.createElement( tag ) ];
+ return [ doc.createElement( tag ) ];
};
diff --git a/modules/ve/dm/nodes/ve.dm.MWEntityNode.js
b/modules/ve/dm/nodes/ve.dm.MWEntityNode.js
index bd2fe3d..b6cb168 100644
--- a/modules/ve/dm/nodes/ve.dm.MWEntityNode.js
+++ b/modules/ve/dm/nodes/ve.dm.MWEntityNode.js
@@ -37,9 +37,9 @@
return { 'type': 'MWentity', 'attributes': { 'character':
domElements[0].textContent } };
};
-ve.dm.MWEntityNode.static.toDomElements = function ( dataElement ) {
- var domElement = document.createElement( 'span' ),
- textNode = document.createTextNode(
dataElement.attributes.character );
+ve.dm.MWEntityNode.static.toDomElements = function ( dataElement, doc ) {
+ var domElement = doc.createElement( 'span' ),
+ textNode = doc.createTextNode( dataElement.attributes.character
);
domElement.setAttribute( 'typeof', 'mw:Entity' );
domElement.appendChild( textNode );
return [ domElement ];
diff --git a/modules/ve/dm/nodes/ve.dm.ParagraphNode.js
b/modules/ve/dm/nodes/ve.dm.ParagraphNode.js
index 9f40a2a..67feb83 100644
--- a/modules/ve/dm/nodes/ve.dm.ParagraphNode.js
+++ b/modules/ve/dm/nodes/ve.dm.ParagraphNode.js
@@ -35,8 +35,8 @@
return { 'type': 'paragraph' };
};
-ve.dm.ParagraphNode.static.toDomElements = function () {
- return [ document.createElement( 'p' ) ];
+ve.dm.ParagraphNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'p' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.PreformattedNode.js
b/modules/ve/dm/nodes/ve.dm.PreformattedNode.js
index a644e24..451457b 100644
--- a/modules/ve/dm/nodes/ve.dm.PreformattedNode.js
+++ b/modules/ve/dm/nodes/ve.dm.PreformattedNode.js
@@ -37,8 +37,8 @@
return { 'type': 'preformatted' };
};
-ve.dm.PreformattedNode.static.toDomElements = function () {
- return [ document.createElement( 'pre' ) ];
+ve.dm.PreformattedNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'pre' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.TableCellNode.js
b/modules/ve/dm/nodes/ve.dm.TableCellNode.js
index 52ff611..5dcb92a 100644
--- a/modules/ve/dm/nodes/ve.dm.TableCellNode.js
+++ b/modules/ve/dm/nodes/ve.dm.TableCellNode.js
@@ -40,9 +40,9 @@
return { 'type': 'tableCell', 'attributes': { 'style': style } };
};
-ve.dm.TableCellNode.static.toDomElements = function ( dataElement ) {
+ve.dm.TableCellNode.static.toDomElements = function ( dataElement, doc ) {
var tag = dataElement.attributes && dataElement.attributes.style ===
'header' ? 'th' : 'td';
- return [ document.createElement( tag ) ];
+ return [ doc.createElement( tag ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.TableNode.js
b/modules/ve/dm/nodes/ve.dm.TableNode.js
index 72bba7f..816acef 100644
--- a/modules/ve/dm/nodes/ve.dm.TableNode.js
+++ b/modules/ve/dm/nodes/ve.dm.TableNode.js
@@ -35,8 +35,8 @@
return { 'type': 'table' };
};
-ve.dm.TableNode.static.toDomElements = function () {
- return [ document.createElement( 'table' ) ];
+ve.dm.TableNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'table' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.TableRowNode.js
b/modules/ve/dm/nodes/ve.dm.TableRowNode.js
index 65e6376..92bb936 100644
--- a/modules/ve/dm/nodes/ve.dm.TableRowNode.js
+++ b/modules/ve/dm/nodes/ve.dm.TableRowNode.js
@@ -37,8 +37,8 @@
return { 'type': 'tableRow' };
};
-ve.dm.TableRowNode.static.toDomElements = function () {
- return [ document.createElement( 'tr' ) ];
+ve.dm.TableRowNode.static.toDomElements = function ( dataElement, doc ) {
+ return [ doc.createElement( 'tr' ) ];
};
/* Registration */
diff --git a/modules/ve/dm/nodes/ve.dm.TableSectionNode.js
b/modules/ve/dm/nodes/ve.dm.TableSectionNode.js
index a2dcab1..d635ea3 100644
--- a/modules/ve/dm/nodes/ve.dm.TableSectionNode.js
+++ b/modules/ve/dm/nodes/ve.dm.TableSectionNode.js
@@ -47,14 +47,14 @@
return { 'type': 'tableSection', 'attributes': { 'style': style } };
};
-ve.dm.TableSectionNode.static.toDomElements = function ( dataElement ) {
+ve.dm.TableSectionNode.static.toDomElements = function ( dataElement, doc ) {
var tags = {
'header': 'thead',
'body': 'tbody',
'footer': 'tfoot'
},
tag = tags[dataElement.attributes &&
dataElement.attributes.style || 'body'];
- return [ document.createElement( tag ) ];
+ return [ doc.createElement( tag ) ];
};
/* Registration */
diff --git a/modules/ve/dm/ve.dm.Annotation.js
b/modules/ve/dm/ve.dm.Annotation.js
index 3872c21..cea13e8 100644
--- a/modules/ve/dm/ve.dm.Annotation.js
+++ b/modules/ve/dm/ve.dm.Annotation.js
@@ -43,8 +43,9 @@
/**
* Convenience wrapper for .toDomElements() on the current annotation
+ * @param {HTMLDocument} [doc] HTML document to use to create elements
* @see static.toDomElements
*/
-ve.dm.Annotation.prototype.getDomElements = function () {
- return this.constructor.static.toDomElements( this.element );
+ve.dm.Annotation.prototype.getDomElements = function ( doc ) {
+ return this.constructor.static.toDomElements( this.element, doc ||
document );
};
diff --git a/modules/ve/dm/ve.dm.Model.js b/modules/ve/dm/ve.dm.Model.js
index 1c581b0..d815b40 100644
--- a/modules/ve/dm/ve.dm.Model.js
+++ b/modules/ve/dm/ve.dm.Model.js
@@ -124,10 +124,11 @@
*
* @static
* @method
- * @param {Object} Linear model element with a type property and optionally an
attributes property
+ * @param {Object} dataElement Linear model element with a type property and
optionally an attributes property
+ * @param {HTMLDocument} doc HTML document for creating elements
* @returns {HTMLElement[]} DOM elements
*/
-ve.dm.Model.static.toDomElements = function ( /*dataElement*/ ) {
+ve.dm.Model.static.toDomElements = function ( /*dataElement, doc*/ ) {
throw new Error( 've.dm.Model subclass must implement toDomElements' );
};
diff --git a/modules/ve/test/dm/ve.dm.Converter.test.js
b/modules/ve/test/dm/ve.dm.Converter.test.js
index 66f968e..0260252 100644
--- a/modules/ve/test/dm/ve.dm.Converter.test.js
+++ b/modules/ve/test/dm/ve.dm.Converter.test.js
@@ -26,12 +26,13 @@
*/
QUnit.test( 'getDomElementsFromDataElement', 20, function ( assert ) {
- var msg, conversion;
+ var msg, conversion, doc;
for ( msg in ve.dm.example.conversions ) {
conversion = ve.dm.example.conversions[msg];
+ doc = conversion.domElement.ownerDocument;
assert.equalDomElement(
- ve.dm.converter.getDomElementsFromDataElement(
conversion.dataElement )[0],
+ ve.dm.converter.getDomElementsFromDataElement(
conversion.dataElement, doc )[0],
conversion.domElement,
msg
);
--
To view, visit https://gerrit.wikimedia.org/r/57246
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia3d2fabe0516956105ad2b5625ed2f76c015c26e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits