diff --git a/packages/ckeditor5-clipboard/tests/clipboardobserver.js b/packages/ckeditor5-clipboard/tests/clipboardobserver.js index c417b145c16..a0d18b2944b 100644 --- a/packages/ckeditor5-clipboard/tests/clipboardobserver.js +++ b/packages/ckeditor5-clipboard/tests/clipboardobserver.js @@ -24,7 +24,7 @@ describe( 'ClipboardObserver', () => { // Create view and DOM structures. el = writer.createContainerElement( 'p' ); writer.insert( writer.createPositionAt( root, 0 ), el ); - view.domConverter.viewToDom( root, document, { withChildren: true, bind: true } ); + view.domConverter.viewToDom( root, { withChildren: true, bind: true } ); doc.selection._setTo( el, 0 ); range = writer.createRange( writer.createPositionAt( root, 1 ) ); diff --git a/packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js b/packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js index 4083be4cd9c..6df8085ae97 100644 --- a/packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js +++ b/packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js @@ -7,7 +7,7 @@ * @module engine/dataprocessor/htmldataprocessor */ -/* globals document, DOMParser */ +/* globals DOMParser */ import BasicHtmlWriter from './basichtmlwriter'; import DomConverter from '../view/domconverter'; @@ -56,7 +56,7 @@ export default class HtmlDataProcessor { */ toData( viewFragment ) { // Convert view DocumentFragment to DOM DocumentFragment. - const domFragment = this.domConverter.viewToDom( viewFragment, document ); + const domFragment = this.domConverter.viewToDom( viewFragment ); // Convert DOM DocumentFragment to HTML output. return this.htmlWriter.getHtml( domFragment ); diff --git a/packages/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js b/packages/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js index 455f14a3d00..040d9ab9a63 100644 --- a/packages/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js +++ b/packages/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js @@ -7,7 +7,7 @@ * @module engine/dataprocessor/xmldataprocessor */ -/* globals DOMParser, document */ +/* globals DOMParser */ import BasicHtmlWriter from './basichtmlwriter'; import DomConverter from '../view/domconverter'; @@ -71,7 +71,7 @@ export default class XmlDataProcessor { */ toData( viewFragment ) { // Convert view DocumentFragment to DOM DocumentFragment. - const domFragment = this.domConverter.viewToDom( viewFragment, document ); + const domFragment = this.domConverter.viewToDom( viewFragment ); // Convert DOM DocumentFragment to XML output. // There is no need to use dedicated for XML serializing method because BasicHtmlWriter works well in this case. diff --git a/packages/ckeditor5-engine/src/view/domconverter.js b/packages/ckeditor5-engine/src/view/domconverter.js index 94a3d58d75d..58a5e2f37e0 100644 --- a/packages/ckeditor5-engine/src/view/domconverter.js +++ b/packages/ckeditor5-engine/src/view/domconverter.js @@ -7,7 +7,7 @@ * @module engine/view/domconverter */ -/* globals document, Node, NodeFilter, DOMParser, Text */ +/* globals Node, NodeFilter, DOMParser, Text */ import ViewText from './text'; import ViewElement from './element'; @@ -30,9 +30,9 @@ import getAncestors from '@ckeditor/ckeditor5-utils/src/dom/getancestors'; import isText from '@ckeditor/ckeditor5-utils/src/dom/istext'; import isComment from '@ckeditor/ckeditor5-utils/src/dom/iscomment'; -const BR_FILLER_REF = BR_FILLER( document ); // eslint-disable-line new-cap -const NBSP_FILLER_REF = NBSP_FILLER( document ); // eslint-disable-line new-cap -const MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER( document ); // eslint-disable-line new-cap +const BR_FILLER_REF = BR_FILLER( global.document ); // eslint-disable-line new-cap +const NBSP_FILLER_REF = NBSP_FILLER( global.document ); // eslint-disable-line new-cap +const MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER( global.document ); // eslint-disable-line new-cap const UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-'; const UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element'; @@ -135,6 +135,14 @@ export default class DomConverter { */ this.unsafeElements = [ 'script', 'style' ]; + /** + * The DOM Document used to create DOM nodes. + * + * @type {Document} + * @private + */ + this._domDocument = this.renderingMode === 'editing' ? global.document : global.document.implementation.createHTMLDocument( '' ); + /** * The DOM-to-view mapping. * @@ -352,17 +360,16 @@ export default class DomConverter { * * @param {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment} viewNode * View node or document fragment to transform. - * @param {Document} domDocument Document which will be used to create DOM nodes. * @param {Object} [options] Conversion options. * @param {Boolean} [options.bind=false] Determines whether new elements will be bound. * @param {Boolean} [options.withChildren=true] If `true`, node's and document fragment's children will be converted too. * @returns {Node|DocumentFragment} Converted node or DocumentFragment. */ - viewToDom( viewNode, domDocument, options = {} ) { + viewToDom( viewNode, options = {} ) { if ( viewNode.is( '$text' ) ) { const textData = this._processDataFromViewText( viewNode ); - return domDocument.createTextNode( textData ); + return this._domDocument.createTextNode( textData ); } else { if ( this.mapViewToDom( viewNode ) ) { return this.mapViewToDom( viewNode ); @@ -372,17 +379,17 @@ export default class DomConverter { if ( viewNode.is( 'documentFragment' ) ) { // Create DOM document fragment. - domElement = domDocument.createDocumentFragment(); + domElement = this._domDocument.createDocumentFragment(); if ( options.bind ) { this.bindDocumentFragments( domElement, viewNode ); } } else if ( viewNode.is( 'uiElement' ) ) { if ( viewNode.name === '$comment' ) { - domElement = domDocument.createComment( viewNode.getCustomProperty( '$rawContent' ) ); + domElement = this._domDocument.createComment( viewNode.getCustomProperty( '$rawContent' ) ); } else { // UIElement has its own render() method (see #799). - domElement = viewNode.render( domDocument, this ); + domElement = viewNode.render( this._domDocument, this ); } if ( options.bind ) { @@ -397,9 +404,9 @@ export default class DomConverter { domElement = this._createReplacementDomElement( viewNode.name ); } else if ( viewNode.hasAttribute( 'xmlns' ) ) { - domElement = domDocument.createElementNS( viewNode.getAttribute( 'xmlns' ), viewNode.name ); + domElement = this._domDocument.createElementNS( viewNode.getAttribute( 'xmlns' ), viewNode.name ); } else { - domElement = domDocument.createElement( viewNode.name ); + domElement = this._domDocument.createElement( viewNode.name ); } // RawElement take care of their children in RawElement#render() method which can be customized @@ -419,7 +426,7 @@ export default class DomConverter { } if ( options.withChildren !== false ) { - for ( const child of this.viewChildrenToDom( viewNode, domDocument, options ) ) { + for ( const child of this.viewChildrenToDom( viewNode, options ) ) { domElement.appendChild( child ); } } @@ -488,23 +495,22 @@ export default class DomConverter { * Additionally, this method adds block {@link module:engine/view/filler filler} to the list of children, if needed. * * @param {module:engine/view/element~Element|module:engine/view/documentfragment~DocumentFragment} viewElement Parent view element. - * @param {Document} domDocument Document which will be used to create DOM nodes. * @param {Object} options See {@link module:engine/view/domconverter~DomConverter#viewToDom} options parameter. * @returns {Iterable.} DOM nodes. */ - * viewChildrenToDom( viewElement, domDocument, options = {} ) { + * viewChildrenToDom( viewElement, options = {} ) { const fillerPositionOffset = viewElement.getFillerOffset && viewElement.getFillerOffset(); let offset = 0; for ( const childView of viewElement.getChildren() ) { if ( fillerPositionOffset === offset ) { - yield this._getBlockFiller( domDocument ); + yield this._getBlockFiller(); } const transparentRendering = childView.is( 'element' ) && childView.getCustomProperty( 'dataPipeline:transparentRendering' ); if ( transparentRendering && this.renderingMode == 'data' ) { - yield* this.viewChildrenToDom( childView, domDocument, options ); + yield* this.viewChildrenToDom( childView, options ); } else { if ( transparentRendering ) { /** @@ -515,14 +521,14 @@ export default class DomConverter { logWarning( 'domconverter-transparent-rendering-unsupported-in-editing-pipeline', { viewElement: childView } ); } - yield this.viewToDom( childView, domDocument, options ); + yield this.viewToDom( childView, options ); } offset++; } if ( fillerPositionOffset === offset ) { - yield this._getBlockFiller( domDocument ); + yield this._getBlockFiller(); } } @@ -537,7 +543,7 @@ export default class DomConverter { const domStart = this.viewPositionToDom( viewRange.start ); const domEnd = this.viewPositionToDom( viewRange.end ); - const domRange = document.createRange(); + const domRange = this._domDocument.createRange(); domRange.setStart( domStart.parent, domStart.offset ); domRange.setEnd( domEnd.parent, domEnd.offset ); @@ -1094,7 +1100,7 @@ export default class DomConverter { // Since it takes multiple lines of code to check whether a "DOM Position" is before/after another "DOM Position", // we will use the fact that range will collapse if it's end is before it's start. - const range = document.createRange(); + const range = this._domDocument.createRange(); range.setStart( selection.anchorNode, selection.anchorOffset ); range.setEnd( selection.focusNode, selection.focusOffset ); @@ -1169,17 +1175,16 @@ export default class DomConverter { * Returns the block {@link module:engine/view/filler filler} node based on the current {@link #blockFillerMode} setting. * * @private - * @params {Document} domDocument * @returns {Node} filler */ - _getBlockFiller( domDocument ) { + _getBlockFiller() { switch ( this.blockFillerMode ) { case 'nbsp': - return NBSP_FILLER( domDocument ); // eslint-disable-line new-cap + return NBSP_FILLER( this._domDocument ); // eslint-disable-line new-cap case 'markedNbsp': - return MARKED_NBSP_FILLER( domDocument ); // eslint-disable-line new-cap + return MARKED_NBSP_FILLER( this._domDocument ); // eslint-disable-line new-cap case 'br': - return BR_FILLER( domDocument ); // eslint-disable-line new-cap + return BR_FILLER( this._domDocument ); // eslint-disable-line new-cap } } @@ -1580,7 +1585,7 @@ export default class DomConverter { * @returns {Element} */ _createReplacementDomElement( elementName, originalDomElement = null ) { - const newDomElement = document.createElement( 'span' ); + const newDomElement = this._domDocument.createElement( 'span' ); // Mark the span replacing a script as hidden. newDomElement.setAttribute( UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE, elementName ); diff --git a/packages/ckeditor5-engine/src/view/renderer.js b/packages/ckeditor5-engine/src/view/renderer.js index 33241108004..15e77d9b3dc 100644 --- a/packages/ckeditor5-engine/src/view/renderer.js +++ b/packages/ckeditor5-engine/src/view/renderer.js @@ -322,7 +322,7 @@ export default class Renderer { this.domConverter.mapViewToDom( viewElement ).childNodes ); const expectedDomChildren = Array.from( - this.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument, { withChildren: false } ) + this.domConverter.viewChildrenToDom( viewElement, { withChildren: false } ) ); const diff = this._diffNodeLists( actualDomChildren, expectedDomChildren ); const actions = this._findReplaceActions( diff, actualDomChildren, expectedDomChildren ); @@ -518,7 +518,7 @@ export default class Renderer { */ _updateText( viewText, options ) { const domText = this.domConverter.findCorrespondingDomText( viewText ); - const newDomText = this.domConverter.viewToDom( viewText, domText.ownerDocument ); + const newDomText = this.domConverter.viewToDom( viewText ); const actualText = domText.data; let expectedText = newDomText.data; @@ -597,7 +597,7 @@ export default class Renderer { const inlineFillerPosition = options.inlineFillerPosition; const actualDomChildren = this.domConverter.mapViewToDom( viewElement ).childNodes; const expectedDomChildren = Array.from( - this.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument, { bind: true } ) + this.domConverter.viewChildrenToDom( viewElement, { bind: true } ) ); // Inline filler element has to be created as it is present in the DOM, but not in the view. It is required diff --git a/packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js b/packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js index 7bf0c8789ea..42346496241 100644 --- a/packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js +++ b/packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js @@ -23,6 +23,9 @@ describe( 'BasicHtmlWriter', () => { const data = basicHtmlWriter.getHtml( fragment ); expect( data ).to.equal( text ); + + // Verify if node was not adopted to main document. + expect( textNode.ownerDocument ).not.equal( document ); } ); it( 'should return correct HTML from fragment with paragraph', () => { @@ -33,6 +36,10 @@ describe( 'BasicHtmlWriter', () => { const data = basicHtmlWriter.getHtml( fragment ); expect( data ).to.equal( '

foo bar

' ); + + // Verify if node was not adopted to main document. + expect( paragraph.ownerDocument ).not.equal( document ); + expect( paragraph.firstChild.ownerDocument ).not.equal( document ); } ); it( 'should return correct HTML from fragment with multiple child nodes', () => { @@ -51,5 +58,12 @@ describe( 'BasicHtmlWriter', () => { const data = basicHtmlWriter.getHtml( fragment ); expect( data ).to.equal( 'foo bar

foo

bar
' ); + + // Verify if node was not adopted to main document. + expect( text.ownerDocument ).not.equal( document ); + expect( paragraph.ownerDocument ).not.equal( document ); + expect( paragraph.firstChild.ownerDocument ).not.equal( document ); + expect( div.ownerDocument ).not.equal( document ); + expect( div.firstChild.ownerDocument ).not.equal( document ); } ); } ); diff --git a/packages/ckeditor5-engine/tests/view/domconverter/domconverter.js b/packages/ckeditor5-engine/tests/view/domconverter/domconverter.js index d94a13f1d9b..196b0fbb83c 100644 --- a/packages/ckeditor5-engine/tests/view/domconverter/domconverter.js +++ b/packages/ckeditor5-engine/tests/view/domconverter/domconverter.js @@ -828,7 +828,7 @@ describe( 'DomConverter', () => { const viewElement = writer.createContainerElement( 'p', {}, { renderUnsafeAttributes: [ 'onclick' ] } ); viewElement.getFillerOffset = () => null; - const domElement = converter.viewToDom( viewElement, document ); + const domElement = converter.viewToDom( viewElement ); converter.setDomElementAttribute( domElement, 'onclick', 'bar', viewElement ); diff --git a/packages/ckeditor5-engine/tests/view/domconverter/rawelement.js b/packages/ckeditor5-engine/tests/view/domconverter/rawelement.js index faa1dce7484..69f24aad517 100644 --- a/packages/ckeditor5-engine/tests/view/domconverter/rawelement.js +++ b/packages/ckeditor5-engine/tests/view/domconverter/rawelement.js @@ -3,7 +3,7 @@ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -/* globals document, HTMLElement */ +/* globals HTMLElement */ import ViewRawElement from '../../../src/view/rawelement'; import ViewContainer from '../../../src/view/containerelement'; @@ -33,14 +33,14 @@ describe( 'DOMConverter RawElement integration', () => { it( 'should create a DOM element from a RawElement', () => { const rawElement = new ViewRawElement( viewDocument, 'div' ); rawElement.render = () => {}; - const domElement = converter.viewToDom( rawElement, document ); + const domElement = converter.viewToDom( rawElement ); expect( domElement ).to.be.instanceOf( HTMLElement ); } ); it( 'should create a DOM structure from a RawElement', () => { const myElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( myElement, document ); + const domElement = converter.viewToDom( myElement ); expect( domElement ).to.be.instanceOf( HTMLElement ); expect( domElement.innerHTML ).to.equal( '

foo bar

' ); @@ -48,7 +48,7 @@ describe( 'DOMConverter RawElement integration', () => { it( 'should create a DOM structure entirely mapped to a single RawElement', () => { const myElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; expect( converter.mapDomToView( domElement ) ).to.equal( myElement ); @@ -60,14 +60,14 @@ describe( 'DOMConverter RawElement integration', () => { describe( 'domToView()', () => { it( 'should return a RawElement', () => { const rawElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( rawElement, document, { bind: true } ); + const domElement = converter.viewToDom( rawElement, { bind: true } ); expect( converter.domToView( domElement ) ).to.equal( rawElement ); } ); it( 'should return a RawElement for all nodes inside of it', () => { const rawElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( rawElement, document, { bind: true } ); + const domElement = converter.viewToDom( rawElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; const domSpan = domParagraph.childNodes[ 0 ]; @@ -83,7 +83,7 @@ describe( 'DOMConverter RawElement integration', () => { it( 'should convert a position inside a RawElement to a position before it', () => { const rawElement = createRawElement( 'h1' ); const container = new ViewContainer( viewDocument, 'div', null, [ new ViewContainer( viewDocument, 'div' ), rawElement ] ); - const domContainer = converter.viewToDom( container, document, { bind: true } ); + const domContainer = converter.viewToDom( container, { bind: true } ); const viewPosition = converter.domPositionToView( domContainer.childNodes[ 1 ], 0 ); @@ -94,7 +94,7 @@ describe( 'DOMConverter RawElement integration', () => { it( 'should convert a position inside RawElement children to a position before it', () => { const rawElement = createRawElement( 'h1' ); const container = new ViewContainer( viewDocument, 'div', null, [ new ViewContainer( viewDocument, 'div' ), rawElement ] ); - const domContainer = converter.viewToDom( container, document, { bind: true } ); + const domContainer = converter.viewToDom( container, { bind: true } ); const viewPosition = converter.domPositionToView( domContainer.childNodes[ 1 ].childNodes[ 0 ], 1 ); @@ -106,7 +106,7 @@ describe( 'DOMConverter RawElement integration', () => { describe( 'mapDomToView()', () => { it( 'should return a RawElement for all DOM elements inside of it', () => { const myElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); expect( converter.mapDomToView( domElement ) ).to.equal( myElement ); @@ -121,7 +121,7 @@ describe( 'DOMConverter RawElement integration', () => { describe( 'findCorrespondingViewText()', () => { it( 'should return a RawElement for all DOM text nodes inside of it', () => { const myElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); const domText = domElement.querySelector( 'span' ).childNodes[ 0 ]; expect( converter.findCorrespondingViewText( domText ) ).to.equal( myElement ); @@ -131,7 +131,7 @@ describe( 'DOMConverter RawElement integration', () => { describe( 'getHostViewElement()', () => { it( 'should return a RawElement for all DOM children', () => { const rawElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( rawElement, document, { bind: true } ); + const domElement = converter.viewToDom( rawElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; const domSpan = domParagraph.childNodes[ 0 ]; @@ -142,7 +142,7 @@ describe( 'DOMConverter RawElement integration', () => { it( 'should return "null" for the parent itself', () => { const rawElement = createRawElement( 'div' ); - const domElement = converter.viewToDom( rawElement, document, { bind: true } ); + const domElement = converter.viewToDom( rawElement, { bind: true } ); expect( converter.getHostViewElement( domElement ) ).to.be.null; } ); diff --git a/packages/ckeditor5-engine/tests/view/domconverter/uielement.js b/packages/ckeditor5-engine/tests/view/domconverter/uielement.js index 6c6831d1522..145ff30ed64 100644 --- a/packages/ckeditor5-engine/tests/view/domconverter/uielement.js +++ b/packages/ckeditor5-engine/tests/view/domconverter/uielement.js @@ -3,7 +3,7 @@ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -/* globals document, HTMLElement */ +/* globals HTMLElement */ import ViewUIElement from '../../../src/view/uielement'; import ViewContainer from '../../../src/view/containerelement'; @@ -35,14 +35,14 @@ describe( 'DOMConverter UIElement integration', () => { describe( 'viewToDom()', () => { it( 'should create DOM element from UIElement', () => { const uiElement = new ViewUIElement( viewDocument, 'div' ); - const domElement = converter.viewToDom( uiElement, document ); + const domElement = converter.viewToDom( uiElement ); expect( domElement ).to.be.instanceOf( HTMLElement ); } ); it( 'should create DOM structure from UIElement', () => { const myElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( myElement, document ); + const domElement = converter.viewToDom( myElement ); expect( domElement ).to.be.instanceOf( HTMLElement ); expect( domElement.innerHTML ).to.equal( '

foo bar

' ); @@ -50,7 +50,7 @@ describe( 'DOMConverter UIElement integration', () => { it( 'should create DOM structure that all is mapped to single UIElement', () => { const myElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; expect( converter.mapDomToView( domElement ) ).to.equal( myElement ); @@ -62,14 +62,14 @@ describe( 'DOMConverter UIElement integration', () => { describe( 'domToView()', () => { it( 'should return UIElement itself', () => { const uiElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( uiElement, document, { bind: true } ); + const domElement = converter.viewToDom( uiElement, { bind: true } ); expect( converter.domToView( domElement ) ).to.equal( uiElement ); } ); it( 'should return UIElement for nodes inside', () => { const uiElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( uiElement, document, { bind: true } ); + const domElement = converter.viewToDom( uiElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; const domSpan = domParagraph.childNodes[ 0 ]; @@ -85,7 +85,7 @@ describe( 'DOMConverter UIElement integration', () => { it( 'should convert position inside UIElement to position before it', () => { const uiElement = createUIElement( 'h1' ); const container = new ViewContainer( viewDocument, 'div', null, [ new ViewContainer( viewDocument, 'div' ), uiElement ] ); - const domContainer = converter.viewToDom( container, document, { bind: true } ); + const domContainer = converter.viewToDom( container, { bind: true } ); const viewPosition = converter.domPositionToView( domContainer.childNodes[ 1 ], 0 ); @@ -96,7 +96,7 @@ describe( 'DOMConverter UIElement integration', () => { it( 'should convert position inside UIElement children to position before UIElement', () => { const uiElement = createUIElement( 'h1' ); const container = new ViewContainer( viewDocument, 'div', null, [ new ViewContainer( viewDocument, 'div' ), uiElement ] ); - const domContainer = converter.viewToDom( container, document, { bind: true } ); + const domContainer = converter.viewToDom( container, { bind: true } ); const viewPosition = converter.domPositionToView( domContainer.childNodes[ 1 ].childNodes[ 0 ], 1 ); @@ -108,7 +108,7 @@ describe( 'DOMConverter UIElement integration', () => { describe( 'mapDomToView()', () => { it( 'should return UIElement for DOM elements inside', () => { const myElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); expect( converter.mapDomToView( domElement ) ).to.equal( myElement ); @@ -123,7 +123,7 @@ describe( 'DOMConverter UIElement integration', () => { describe( 'findCorrespondingViewText()', () => { it( 'should return UIElement for DOM text inside', () => { const myElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( myElement, document, { bind: true } ); + const domElement = converter.viewToDom( myElement, { bind: true } ); const domText = domElement.querySelector( 'span' ).childNodes[ 0 ]; expect( converter.findCorrespondingViewText( domText ) ).to.equal( myElement ); @@ -133,7 +133,7 @@ describe( 'DOMConverter UIElement integration', () => { describe( 'getHostViewElement()', () => { it( 'should return UIElement for DOM children', () => { const uiElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( uiElement, document, { bind: true } ); + const domElement = converter.viewToDom( uiElement, { bind: true } ); const domParagraph = domElement.childNodes[ 0 ]; const domSpan = domParagraph.childNodes[ 0 ]; @@ -144,7 +144,7 @@ describe( 'DOMConverter UIElement integration', () => { it( 'should return null for element itself', () => { const uiElement = createUIElement( 'div' ); - const domElement = converter.viewToDom( uiElement, document, { bind: true } ); + const domElement = converter.viewToDom( uiElement, { bind: true } ); expect( converter.getHostViewElement( domElement ) ).to.be.null; } ); diff --git a/packages/ckeditor5-engine/tests/view/domconverter/view-to-dom.js b/packages/ckeditor5-engine/tests/view/domconverter/view-to-dom.js index adee5515312..0acd7806e73 100644 --- a/packages/ckeditor5-engine/tests/view/domconverter/view-to-dom.js +++ b/packages/ckeditor5-engine/tests/view/domconverter/view-to-dom.js @@ -52,7 +52,7 @@ describe( 'DomConverter', () => { converter.bindElements( domImg, viewImg ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -76,7 +76,7 @@ describe( 'DomConverter', () => { viewP._appendChild( viewImg ); viewP._appendChild( viewText ); - const domP = converter.viewToDom( viewP, document, { bind: true } ); + const domP = converter.viewToDom( viewP, { bind: true } ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -96,7 +96,7 @@ describe( 'DomConverter', () => { const viewText = new ViewText( viewDocument, 'நிலைக்கு' ); const viewP = new ViewElement( viewDocument, 'p', null, viewText ); - const domP = converter.viewToDom( viewP, document, { bind: true } ); + const domP = converter.viewToDom( viewP, { bind: true } ); expect( domP.childNodes.length ).to.equal( 1 ); expect( domP.childNodes[ 0 ].data ).to.equal( 'நிலைக்கு' ); @@ -117,7 +117,7 @@ describe( 'DomConverter', () => { converter.bindElements( domImg, viewImg ); - const domP = converter.viewToDom( viewP, document, { withChildren: false } ); + const domP = converter.viewToDom( viewP, { withChildren: false } ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -137,7 +137,7 @@ describe( 'DomConverter', () => { viewFragment._appendChild( viewImg ); viewFragment._appendChild( viewText ); - const domFragment = converter.viewToDom( viewFragment, document, { bind: true } ); + const domFragment = converter.viewToDom( viewFragment, { bind: true } ); expect( domFragment ).to.be.an.instanceof( DocumentFragment ); expect( domFragment.childNodes.length ).to.equal( 2 ); @@ -160,7 +160,7 @@ describe( 'DomConverter', () => { converter.bindElements( domImg, viewImg ); - const domFragment = converter.viewToDom( viewFragment, document, { withChildren: false } ); + const domFragment = converter.viewToDom( viewFragment, { withChildren: false } ); expect( domFragment ).to.be.an.instanceof( DocumentFragment ); @@ -174,14 +174,14 @@ describe( 'DomConverter', () => { converter.bindDocumentFragments( domFragment, viewFragment ); - const domFragment2 = converter.viewToDom( viewFragment, document ); + const domFragment2 = converter.viewToDom( viewFragment ); expect( domFragment2 ).to.equal( domFragment ); } ); it( 'should create DOM text node from view text node', () => { const viewTextNode = new ViewText( viewDocument, 'foo' ); - const domTextNode = converter.viewToDom( viewTextNode, document ); + const domTextNode = converter.viewToDom( viewTextNode ); expect( domTextNode ).to.be.instanceof( Text ); expect( domTextNode.data ).to.equal( 'foo' ); @@ -191,7 +191,7 @@ describe( 'DomConverter', () => { const namespace = 'http://www.w3.org/2000/svg'; const viewSvg = new ViewElement( viewDocument, 'svg', { xmlns: namespace } ); - const domSvg = converter.viewToDom( viewSvg, document ); + const domSvg = converter.viewToDom( viewSvg ); expect( domSvg.createSVGRect ).to.be.a( 'function' ); } ); @@ -201,7 +201,7 @@ describe( 'DomConverter', () => { viewComment._setCustomProperty( '$rawContent', 'foo' ); - const domComment = converter.viewToDom( viewComment, document ); + const domComment = converter.viewToDom( viewComment ); expect( domComment ).to.be.an.instanceof( Comment ); expect( domComment.nodeName ).to.equal( '#comment' ); @@ -215,7 +215,7 @@ describe( 'DomConverter', () => { viewComment._setCustomProperty( '$rawContent', 'foo' ); - const domComment = converter.viewToDom( viewComment, document, { bind: true } ); + const domComment = converter.viewToDom( viewComment, { bind: true } ); expect( domComment ).to.be.an.instanceof( Comment ); expect( domComment.nodeName ).to.equal( '#comment' ); @@ -224,6 +224,62 @@ describe( 'DomConverter', () => { expect( converter.mapDomToView( domComment ) ).to.equal( viewComment ); } ); + describe( 'options.renderingMode = data', () => { + it( 'should use a separate DOM document to create DOM elements', () => { + const viewElement = new ViewElement( viewDocument, 'p', { onclick: 'bar' }, [ + new ViewElement( viewDocument, 'audio', { src: 'x', onerror: 'alert(1)' } ) + ] ); + + converter = new DomConverter( viewDocument, { + renderingMode: 'data' + } ); + + const domElement = converter.viewToDom( viewElement ); + + expect( domElement.ownerDocument ).not.equal( document ); + expect( domElement.firstChild.ownerDocument ).not.equal( document ); + expect( domElement.ownerDocument ).to.equal( domElement.firstChild.ownerDocument ); + expect( domElement.innerHTML ).to.equal( '' ); + } ); + + it( 'should use a separate DOM document to create DOM text nodes', () => { + const viewElement = new ViewElement( viewDocument, 'p', { onclick: 'bar' }, [ + new ViewText( viewDocument, 'foobar' ) + ] ); + + converter = new DomConverter( viewDocument, { + renderingMode: 'data' + } ); + + const domElement = converter.viewToDom( viewElement ); + + expect( domElement.ownerDocument ).not.equal( document ); + expect( domElement.firstChild.ownerDocument ).not.equal( document ); + expect( domElement.ownerDocument ).to.equal( domElement.firstChild.ownerDocument ); + expect( domElement.innerHTML ).to.equal( 'foobar' ); + } ); + + it( 'should use a separate DOM document to create a DOM document fragment', () => { + const viewFragment = new ViewDocumentFragment( viewDocument, [ + new ViewElement( viewDocument, 'p', { onclick: 'bar' }, [ + new ViewElement( viewDocument, 'audio', { src: 'x', onerror: 'alert(1)' } ) + ] ) + ] ); + + converter = new DomConverter( viewDocument, { + renderingMode: 'data' + } ); + + const domFragment = converter.viewToDom( viewFragment ); + + expect( domFragment.ownerDocument ).not.equal( document ); + expect( domFragment.firstChild.ownerDocument ).not.equal( document ); + expect( domFragment.firstChild.firstChild.ownerDocument ).not.equal( document ); + expect( domFragment.ownerDocument ).to.equal( domFragment.firstChild.ownerDocument ); + expect( domFragment.firstChild.innerHTML ).to.equal( '' ); + } ); + } ); + describe( 'options.renderingMode = editing', () => { let warnStub; @@ -247,7 +303,7 @@ describe( 'DomConverter', () => { converter.bindElements( domImg, viewImg ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -269,7 +325,7 @@ describe( 'DomConverter', () => { renderingMode: 'editing' } ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); sinon.assert.calledOnce( warnStub ); sinon.assert.calledWithExactly( warnStub, @@ -295,7 +351,7 @@ describe( 'DomConverter', () => { renderingMode: 'editing' } ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -320,7 +376,7 @@ describe( 'DomConverter', () => { renderingMode: 'editing' } ); - converter.viewToDom( viewP, document ); + converter.viewToDom( viewP ); sinon.assert.calledOnce( warnStub ); sinon.assert.calledWithExactly( warnStub, @@ -341,7 +397,7 @@ describe( 'DomConverter', () => { renderingMode: 'editing' } ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -366,7 +422,7 @@ describe( 'DomConverter', () => { renderingMode: 'editing' } ); - converter.viewToDom( viewP, document ); + converter.viewToDom( viewP ); sinon.assert.calledOnce( warnStub ); sinon.assert.calledWithExactly( warnStub, @@ -389,7 +445,7 @@ describe( 'DomConverter', () => { converter.unsafeElements.push( 'custom-foo-element' ); - const domP = converter.viewToDom( viewP, document ); + const domP = converter.viewToDom( viewP ); expect( domP ).to.be.an.instanceof( HTMLElement ); expect( domP.tagName ).to.equal( 'P' ); @@ -418,7 +474,7 @@ describe( 'DomConverter', () => { onkeydown: 'bar' }, { renderUnsafeAttributes: [ 'onclick' ] } ); - expect( converter.viewToDom( viewElement, document ).outerHTML ).to.equal( + expect( converter.viewToDom( viewElement ).outerHTML ).to.equal( '' ); } ); @@ -431,7 +487,7 @@ describe( 'DomConverter', () => { viewElement.getFillerOffset = () => null; - expect( converter.viewToDom( viewElement, document ).outerHTML ).to.equal( + expect( converter.viewToDom( viewElement ).outerHTML ).to.equal( '

' ); } ); @@ -444,7 +500,7 @@ describe( 'DomConverter', () => { viewElement.getFillerOffset = () => null; - expect( converter.viewToDom( viewElement, document ).outerHTML ).to.equal( + expect( converter.viewToDom( viewElement ).outerHTML ).to.equal( '
' ); } ); @@ -455,7 +511,7 @@ describe( 'DomConverter', () => { onkeydown: 'bar' }, { renderUnsafeAttributes: [ 'onclick' ] } ); - expect( converter.viewToDom( viewElement, document ).outerHTML ).to.equal( + expect( converter.viewToDom( viewElement ).outerHTML ).to.equal( '' ); } ); @@ -470,7 +526,7 @@ describe( 'DomConverter', () => { renderUnsafeAttributes: [ 'onclick' ] } ); - expect( converter.viewToDom( viewElement, document ).outerHTML ).to.equal( + expect( converter.viewToDom( viewElement ).outerHTML ).to.equal( '

foo

' ); } ); @@ -610,7 +666,7 @@ describe( 'DomConverter', () => { new ViewContainerElement( viewDocument, 'p', null, new ViewText( viewDocument, ' xxx' ) ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( domDiv.innerHTML ).to.equal( '

 foo

bar

 xxx

' ); } ); @@ -622,7 +678,7 @@ describe( 'DomConverter', () => { new ViewContainerElement( viewDocument, 'p', null, new ViewText( viewDocument, 'xxx ' ) ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( domDiv.innerHTML ).to.equal( '

foo 

bar

xxx 

' ); } ); @@ -638,7 +694,7 @@ describe( 'DomConverter', () => { ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( domDiv.innerHTML ).to.equal( 'x  x   x x  x' ); } ); @@ -657,7 +713,7 @@ describe( 'DomConverter', () => { new ViewContainerElement( viewDocument, 'p', null, new ViewText( viewDocument, ' x ' ) ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( domDiv.innerHTML ).to.equal( '

 x  x   x x 

  x  

' @@ -676,7 +732,7 @@ describe( 'DomConverter', () => { viewElement._appendChild( new ViewText( viewDocument, text.replace( /_/g, '\u00A0' ) ) ); } - const domElement = converter.viewToDom( viewElement, document ); + const domElement = converter.viewToDom( viewElement ); const data = showNbsp( domElement.innerHTML ); expect( data ).to.equal( output ); @@ -838,7 +894,7 @@ describe( 'DomConverter', () => { new ViewText( viewDocument, ' foo ' ), new ViewText( viewDocument, ' bar ' ) ] ); - const domPre = converter.viewToDom( viewPre, document ); + const domPre = converter.viewToDom( viewPre ); expect( domPre.innerHTML ).to.equal( ' foo bar ' ); } ); @@ -846,7 +902,7 @@ describe( 'DomConverter', () => { it( 'not in a preformatted block followed by a text', () => { const viewPre = new ViewAttributeElement( viewDocument, 'pre', null, new ViewText( viewDocument, 'foo ' ) ); const viewDiv = new ViewContainerElement( viewDocument, 'div', null, [ viewPre, new ViewText( viewDocument, ' bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( domDiv.innerHTML ).to.equal( '
foo   
bar' ); } ); @@ -858,7 +914,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo_
bar' ); } ); @@ -869,7 +925,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo _
bar' ); } ); @@ -880,7 +936,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo __
bar' ); } ); @@ -891,7 +947,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '_
bar' ); } ); @@ -902,7 +958,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '__
bar' ); } ); @@ -913,7 +969,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '_ _
bar' ); } ); @@ -924,7 +980,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
_bar' ); } ); @@ -935,7 +991,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
_ bar' ); } ); @@ -946,7 +1002,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' bar' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
_ _bar' ); } ); @@ -957,7 +1013,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' ' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
_' ); } ); @@ -968,7 +1024,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' ' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
__' ); } ); @@ -979,7 +1035,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, ' ' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( 'foo
_ _' ); } ); @@ -991,7 +1047,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'foo' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '
_
foo' ); } ); @@ -1003,7 +1059,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'foo' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '
__
foo' ); } ); @@ -1015,7 +1071,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'foo' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '
_ _
foo' ); } ); @@ -1027,7 +1083,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'foo' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '
_foo
foo' ); } ); @@ -1039,7 +1095,7 @@ describe( 'DomConverter', () => { new ViewEmptyElement( viewDocument, 'br' ), new ViewText( viewDocument, 'foo' ) ] ); - const domDiv = converter.viewToDom( viewDiv, document ); + const domDiv = converter.viewToDom( viewDiv ); expect( showNbsp( domDiv.innerHTML ) ).to.equal( '
foo_
foo' ); } ); @@ -1051,7 +1107,7 @@ describe( 'DomConverter', () => { it( 'should convert children', () => { const viewP = parse( 'foobar' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); expect( domChildren.length ).to.equal( 2 ); expect( domChildren[ 0 ].data ).to.equal( 'foo' ); @@ -1062,7 +1118,7 @@ describe( 'DomConverter', () => { it( 'should add filler', () => { const viewP = parse( '' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); expect( domChildren.length ).to.equal( 1 ); expect( converter.isBlockFiller( domChildren[ 0 ] ) ).to.be.true; @@ -1072,7 +1128,7 @@ describe( 'DomConverter', () => { const viewP = parse( 'foo' ); viewP.getFillerOffset = () => 0; - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); expect( domChildren.length ).to.equal( 2 ); expect( converter.isBlockFiller( domChildren[ 0 ] ) ).to.be.true; @@ -1084,7 +1140,7 @@ describe( 'DomConverter', () => { const viewP = parse( '' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); const filler = domChildren[ 0 ]; expect( filler.isEqualNode( BR_FILLER( document ) ) ).to.be.true; // eslint-disable-line new-cap @@ -1095,7 +1151,7 @@ describe( 'DomConverter', () => { const viewP = parse( '' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); const filler = domChildren[ 0 ]; expect( filler.isEqualNode( NBSP_FILLER( document ) ) ).to.be.true; // eslint-disable-line new-cap @@ -1106,7 +1162,7 @@ describe( 'DomConverter', () => { const viewP = parse( '' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP ) ); const filler = domChildren[ 0 ]; expect( filler.isEqualNode( MARKED_NBSP_FILLER( document ) ) ).to.be.true; // eslint-disable-line new-cap @@ -1115,7 +1171,7 @@ describe( 'DomConverter', () => { it( 'should pass options', () => { const viewP = parse( 'foobar' ); - const domChildren = Array.from( converter.viewChildrenToDom( viewP, document, { withChildren: false } ) ); + const domChildren = Array.from( converter.viewChildrenToDom( viewP, { withChildren: false } ) ); expect( domChildren.length ).to.equal( 2 ); expect( domChildren[ 0 ].data ).to.equal( 'foo' ); @@ -1148,7 +1204,7 @@ describe( 'DomConverter', () => { bogusParagraph._setCustomProperty( 'dataPipeline:transparentRendering', true ); - const domDivChildren = Array.from( converter.viewChildrenToDom( viewList, document ) ); + const domDivChildren = Array.from( converter.viewChildrenToDom( viewList ) ); expect( domDivChildren.length ).to.equal( 1 ); expect( domDivChildren[ 0 ].tagName.toLowerCase() ).to.equal( 'ul' ); @@ -1200,7 +1256,7 @@ describe( 'DomConverter', () => { bogusParagraph._setCustomProperty( 'dataPipeline:transparentRendering', true ); - const domDivChildren = Array.from( converter.viewChildrenToDom( viewList, document ) ); + const domDivChildren = Array.from( converter.viewChildrenToDom( viewList ) ); expect( domDivChildren.length ).to.equal( 1 ); expect( domDivChildren[ 0 ].tagName.toLowerCase() ).to.equal( 'ul' ); diff --git a/packages/ckeditor5-engine/tests/view/renderer.js b/packages/ckeditor5-engine/tests/view/renderer.js index 9ba8c60ecbc..bbbadffe8a6 100644 --- a/packages/ckeditor5-engine/tests/view/renderer.js +++ b/packages/ckeditor5-engine/tests/view/renderer.js @@ -435,12 +435,12 @@ describe( 'Renderer', () => { expect( domRoot.childNodes.length ).to.equal( 1 ); const domDivOuter = domRoot.childNodes[ 0 ]; - expect( renderer.domConverter.viewToDom( viewDivOuter, domRoot.document ) ).to.equal( domDivOuter ); + expect( renderer.domConverter.viewToDom( viewDivOuter ) ).to.equal( domDivOuter ); expect( domDivOuter.tagName ).to.equal( 'DIV' ); expect( domDivOuter.childNodes.length ).to.equal( 1 ); const domDivInner = domDivOuter.childNodes[ 0 ]; - expect( renderer.domConverter.viewToDom( viewDivInner, domRoot.document ) ).to.equal( domDivInner ); + expect( renderer.domConverter.viewToDom( viewDivInner ) ).to.equal( domDivInner ); expect( domDivInner.tagName ).to.equal( 'DIV' ); expect( domDivInner.childNodes.length ).to.equal( 0 ); } ); diff --git a/packages/ckeditor5-image/src/image/ui/utils.js b/packages/ckeditor5-image/src/image/ui/utils.js index 94e35c2e9b2..eaa4ffb7eff 100644 --- a/packages/ckeditor5-image/src/image/ui/utils.js +++ b/packages/ckeditor5-image/src/image/ui/utils.js @@ -40,7 +40,7 @@ export function getBalloonPositionData( editor ) { const imageUtils = editor.plugins.get( 'ImageUtils' ); return { - target: editingView.domConverter.viewToDom( imageUtils.getClosestSelectedImageWidget( editingView.document.selection ) ), + target: editingView.domConverter.mapViewToDom( imageUtils.getClosestSelectedImageWidget( editingView.document.selection ) ), positions: [ defaultPositions.northArrowSouth, defaultPositions.northArrowSouthWest, diff --git a/packages/ckeditor5-image/src/imageresize/imageresizehandles.js b/packages/ckeditor5-image/src/imageresize/imageresizehandles.js index 2ddb0182429..d0295e8121c 100644 --- a/packages/ckeditor5-image/src/imageresize/imageresizehandles.js +++ b/packages/ckeditor5-image/src/imageresize/imageresizehandles.js @@ -104,7 +104,7 @@ export default class ImageResizeHandles extends Plugin { }, getResizeHost() { // Return the model image element parent to avoid setting an inline element (/) as a resize host. - return domConverter.viewToDom( mapper.toViewElement( imageModel.parent ) ); + return domConverter.mapViewToDom( mapper.toViewElement( imageModel.parent ) ); }, // TODO consider other positions. isCentered() { diff --git a/packages/ckeditor5-image/tests/image/ui/utils.js b/packages/ckeditor5-image/tests/image/ui/utils.js index d984a8fc147..ca333f2f5a5 100644 --- a/packages/ckeditor5-image/tests/image/ui/utils.js +++ b/packages/ckeditor5-image/tests/image/ui/utils.js @@ -68,7 +68,7 @@ describe( 'Utils', () => { repositionContextualBalloon( editor ); sinon.assert.calledWithExactly( spy, { - target: converter.viewToDom( selection.getSelectedElement() ), + target: converter.mapViewToDom( selection.getSelectedElement() ), positions } ); } ); @@ -90,7 +90,7 @@ describe( 'Utils', () => { repositionContextualBalloon( editor ); sinon.assert.calledWithExactly( spy, { - target: converter.viewToDom( selection.getFirstPosition().parent.parent.parent ), + target: converter.mapViewToDom( selection.getFirstPosition().parent.parent.parent ), positions } ); } ); @@ -111,7 +111,7 @@ describe( 'Utils', () => { const data = getBalloonPositionData( editor ); expect( data ).to.deep.equal( { - target: converter.viewToDom( selection.getSelectedElement() ), + target: converter.mapViewToDom( selection.getSelectedElement() ), positions } ); } ); @@ -121,7 +121,7 @@ describe( 'Utils', () => { const data = getBalloonPositionData( editor ); expect( data ).to.deep.equal( { - target: converter.viewToDom( selection.getFirstPosition().parent.parent.parent ), + target: converter.mapViewToDom( selection.getFirstPosition().parent.parent.parent ), positions } ); } ); diff --git a/packages/ckeditor5-image/tests/imageresize/_utils/utils.js b/packages/ckeditor5-image/tests/imageresize/_utils/utils.js index a905d25875f..e314c435e45 100644 --- a/packages/ckeditor5-image/tests/imageresize/_utils/utils.js +++ b/packages/ckeditor5-image/tests/imageresize/_utils/utils.js @@ -19,7 +19,7 @@ export async function waitForAllImagesLoaded( editor ) { for ( const curModel of root.getChildren() ) { if ( curModel.is( 'element', 'imageBlock' ) ) { const imageView = editor.editing.mapper.toViewElement( curModel ); - images.add( editingView.domConverter.viewToDom( imageView ).querySelector( 'img' ) ); + images.add( editingView.domConverter.mapViewToDom( imageView ).querySelector( 'img' ) ); } } diff --git a/packages/ckeditor5-table/src/utils/ui/contextualballoon.js b/packages/ckeditor5-table/src/utils/ui/contextualballoon.js index e1997b8be1f..0817430f4f3 100644 --- a/packages/ckeditor5-table/src/utils/ui/contextualballoon.js +++ b/packages/ckeditor5-table/src/utils/ui/contextualballoon.js @@ -63,7 +63,7 @@ export function getBalloonTablePositionData( editor ) { const viewTable = editor.editing.mapper.toViewElement( modelTable ); return { - target: editor.editing.view.domConverter.viewToDom( viewTable ), + target: editor.editing.view.domConverter.mapViewToDom( viewTable ), positions: BALLOON_POSITIONS }; } @@ -92,7 +92,7 @@ export function getBalloonCellPositionData( editor ) { const viewTableCell = mapper.toViewElement( modelTableCell ); return { - target: domConverter.viewToDom( viewTableCell ), + target: domConverter.mapViewToDom( viewTableCell ), positions: BALLOON_POSITIONS }; } @@ -118,7 +118,7 @@ function createBoundingRect( ranges, editor ) { const rects = Array.from( ranges ).map( range => { const modelTableCell = getTableCellAtPosition( range.start ); const viewTableCell = mapper.toViewElement( modelTableCell ); - return new Rect( domConverter.viewToDom( viewTableCell ) ); + return new Rect( domConverter.mapViewToDom( viewTableCell ) ); } ); return Rect.getBoundingRect( rects ); diff --git a/packages/ckeditor5-table/tests/utils/ui/contextualballoon.js b/packages/ckeditor5-table/tests/utils/ui/contextualballoon.js index e46b70ced8e..a55ef6b77e6 100644 --- a/packages/ckeditor5-table/tests/utils/ui/contextualballoon.js +++ b/packages/ckeditor5-table/tests/utils/ui/contextualballoon.js @@ -72,7 +72,7 @@ describe( 'table utils', () => { const viewCell = editor.editing.mapper.toViewElement( modelCell ); sinon.assert.calledWithExactly( spy, { - target: editingView.domConverter.viewToDom( viewCell ), + target: editingView.domConverter.mapViewToDom( viewCell ), positions: [ defaultPositions.northArrowSouth, defaultPositions.northArrowSouthWest, @@ -121,7 +121,7 @@ describe( 'table utils', () => { const viewTable = editor.editing.mapper.toViewElement( modelTable ); sinon.assert.calledWithExactly( spy, { - target: editingView.domConverter.viewToDom( viewTable ), + target: editingView.domConverter.mapViewToDom( viewTable ), positions: [ defaultPositions.northArrowSouth, defaultPositions.northArrowSouthWest, @@ -161,7 +161,7 @@ describe( 'table utils', () => { for ( let col = 0; col < 3; col++ ) { const modelCell = modelRoot.getNodeByPath( [ 0, row, col ] ); const viewCell = editor.editing.mapper.toViewElement( modelCell ); - const cellDomElement = editingView.domConverter.viewToDom( viewCell ); + const cellDomElement = editingView.domConverter.mapViewToDom( viewCell ); mockBoundingBox( cellDomElement, { top: 100 + row * 10, @@ -181,7 +181,7 @@ describe( 'table utils', () => { const viewCell = editor.editing.mapper.toViewElement( modelCell ); expect( data ).to.deep.equal( { - target: editingView.domConverter.viewToDom( viewCell ), + target: editingView.domConverter.mapViewToDom( viewCell ), positions: [ defaultPositions.northArrowSouth, defaultPositions.northArrowSouthWest, diff --git a/packages/ckeditor5-widget/tests/widget-events.js b/packages/ckeditor5-widget/tests/widget-events.js index e91c1fcd958..23840331e41 100644 --- a/packages/ckeditor5-widget/tests/widget-events.js +++ b/packages/ckeditor5-widget/tests/widget-events.js @@ -57,7 +57,7 @@ describe( 'Widget - Events', () => { .from( editor.editing.view.document.getRoot().getChildren() ) .find( element => element.hasClass( 'simple-widget-container' ) ); - const domFragment = editor.editing.view.domConverter.viewToDom( container ); + const domFragment = editor.editing.view.domConverter.mapViewToDom( container ); buttonIgnored = domFragment.querySelector( '#ignored-button' ); buttonRegular = domFragment.querySelector( '#regular-button' ); diff --git a/packages/ckeditor5-widget/tests/widgettoolbarrepository.js b/packages/ckeditor5-widget/tests/widgettoolbarrepository.js index ef5c0e76e7d..5bd73231326 100644 --- a/packages/ckeditor5-widget/tests/widgettoolbarrepository.js +++ b/packages/ckeditor5-widget/tests/widgettoolbarrepository.js @@ -402,7 +402,7 @@ describe( 'WidgetToolbarRepository', () => { expect( balloon.visibleView ).to.equal( fakeChildWidgetToolbarView ); expect( updatePositionSpy.firstCall.args[ 0 ].position.target ).to.equal( - view.domConverter.viewToDom( fakeChildViewElement ) ); + view.domConverter.mapViewToDom( fakeChildViewElement ) ); } ); it( 'should not update balloon position when toolbar is in not visible stack', () => { diff --git a/packages/ckeditor5-widget/tests/widgettypearound/widgettypearound.js b/packages/ckeditor5-widget/tests/widgettypearound/widgettypearound.js index 236511865b6..a545d887bbf 100644 --- a/packages/ckeditor5-widget/tests/widgettypearound/widgettypearound.js +++ b/packages/ckeditor5-widget/tests/widgettypearound/widgettypearound.js @@ -267,7 +267,7 @@ describe( 'WidgetTypeAround', () => { expect( viewWidget.getChild( 1 ).hasClass( 'ck-reset_all' ) ).to.be.true; expect( viewWidget.getChild( 1 ).hasClass( 'ck-widget__type-around' ) ).to.be.true; - const domWrapper = editingView.domConverter.viewToDom( viewWidget.getChild( 1 ) ); + const domWrapper = editingView.domConverter.mapViewToDom( viewWidget.getChild( 1 ) ); expect( domWrapper.querySelectorAll( '.ck-widget__type-around__button' ) ).to.have.length( 2 ); } ); @@ -282,7 +282,7 @@ describe( 'WidgetTypeAround', () => { expect( viewWidget.getChild( 1 ).hasClass( 'ck-reset_all' ) ).to.be.true; expect( viewWidget.getChild( 1 ).hasClass( 'ck-widget__type-around' ) ).to.be.true; - const domWrapper = editingView.domConverter.viewToDom( viewWidget.getChild( 1 ) ); + const domWrapper = editingView.domConverter.mapViewToDom( viewWidget.getChild( 1 ) ); expect( domWrapper.querySelectorAll( '.ck-widget__type-around__fake-caret' ) ).to.have.length( 1 ); } ); @@ -294,7 +294,7 @@ describe( 'WidgetTypeAround', () => { setModelData( editor.model, '' ); const viewWidget = viewRoot.getChild( 0 ); - const domWrapper = editingView.domConverter.viewToDom( viewWidget.getChild( 1 ) ); + const domWrapper = editingView.domConverter.mapViewToDom( viewWidget.getChild( 1 ) ); buttonBefore = domWrapper.children[ 0 ]; buttonAfter = domWrapper.children[ 1 ]; @@ -342,7 +342,7 @@ describe( 'WidgetTypeAround', () => { const eventInfo = new EventInfo( viewDocument, 'mousedown' ); const domEventDataMock = new DomEventData( editingView, { // Clicking a widget. - target: editingView.domConverter.viewToDom( viewRoot.getChild( 0 ) ), + target: editingView.domConverter.mapViewToDom( viewRoot.getChild( 0 ) ), preventDefault: sinon.spy() } );