瀏覽代碼

DomConverter.domToView() requires an instance of view.Document as a first argument.

Kamil Piechaczek 5 年之前
父節點
當前提交
07ef72d9e2

+ 3 - 1
packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js

@@ -11,6 +11,7 @@
 
 import BasicHtmlWriter from './basichtmlwriter';
 import DomConverter from '../view/domconverter';
+import ViewDocument from '../view/document';
 
 /**
  * The HTML data processor class.
@@ -72,9 +73,10 @@ export default class HtmlDataProcessor {
 	toView( data ) {
 		// Convert input HTML data to DOM DocumentFragment.
 		const domFragment = this._toDom( data );
+		const viewDocument = new ViewDocument();
 
 		// Convert DOM DocumentFragment to view DocumentFragment.
-		return this._domConverter.domToView( domFragment );
+		return this._domConverter.domToView( viewDocument, domFragment );
 	}
 
 	/**

+ 3 - 1
packages/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js

@@ -11,6 +11,7 @@
 
 import BasicHtmlWriter from './basichtmlwriter';
 import DomConverter from '../view/domconverter';
+import ViewDocument from '../view/document';
 
 /**
  * The XML data processor class.
@@ -90,9 +91,10 @@ export default class XmlDataProcessor {
 	toView( data ) {
 		// Convert input XML data to DOM DocumentFragment.
 		const domFragment = this._toDom( data );
+		const viewDocument = new ViewDocument();
 
 		// Convert DOM DocumentFragment to view DocumentFragment.
-		return this._domConverter.domToView( domFragment, { keepOriginalCase: true } );
+		return this._domConverter.domToView( viewDocument, domFragment, { keepOriginalCase: true } );
 	}
 
 	/**

+ 6 - 7
packages/ckeditor5-engine/src/view/domconverter.js

@@ -14,7 +14,6 @@ import ViewElement from './element';
 import ViewPosition from './position';
 import ViewRange from './range';
 import ViewSelection from './selection';
-import ViewDocument from './document';
 import ViewDocumentFragment from './documentfragment';
 import ViewTreeWalker from './treewalker';
 import { BR_FILLER, getDataWithoutFiller, INLINE_FILLER_LENGTH, isInlineFiller, NBSP_FILLER, startsWithFiller } from './filler';
@@ -374,6 +373,7 @@ export default class DomConverter {
 	 * {@link module:engine/view/filler fillers} `null` will be returned.
 	 * For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.
 	 *
+	 * @param {module:engine/view/document~Document} viewDocument View document where the created node will belong to.
 	 * @param {Node|DocumentFragment} domNode DOM node or document fragment to transform.
 	 * @param {Object} [options] Conversion options.
 	 * @param {Boolean} [options.bind=false] Determines whether new elements will be bound.
@@ -382,13 +382,11 @@ export default class DomConverter {
 	 * @returns {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment|null} Converted node or document fragment
 	 * or `null` if DOM node is a {@link module:engine/view/filler filler} or the given node is an empty text node.
 	 */
-	domToView( domNode, options = {} ) {
+	domToView( viewDocument, domNode, options = {} ) {
 		if ( this.isBlockFiller( domNode, this.blockFillerMode ) ) {
 			return null;
 		}
 
-		const viewDocument = new ViewDocument();
-
 		// When node is inside UIElement return that UIElement as it's view representation.
 		const uiElement = this.getParentUIElement( domNode, this._domToViewMapping );
 
@@ -438,7 +436,7 @@ export default class DomConverter {
 			}
 
 			if ( options.withChildren || options.withChildren === undefined ) {
-				for ( const child of this.domChildrenToView( domNode, options ) ) {
+				for ( const child of this.domChildrenToView( viewDocument, domNode, options ) ) {
 					viewElement._appendChild( child );
 				}
 			}
@@ -452,14 +450,15 @@ export default class DomConverter {
 	 * the {@link module:engine/view/domconverter~DomConverter#domToView} method.
 	 * Additionally this method omits block {@link module:engine/view/filler filler}, if it exists in the DOM parent.
 	 *
+	 * @param {module:engine/view/document~Document} viewDocument View document where the created node will belong to.
 	 * @param {HTMLElement} domElement Parent DOM element.
 	 * @param {Object} options See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
 	 * @returns {Iterable.<module:engine/view/node~Node>} View nodes.
 	 */
-	* domChildrenToView( domElement, options = {} ) {
+	* domChildrenToView( viewDocument, domElement, options = {} ) {
 		for ( let i = 0; i < domElement.childNodes.length; i++ ) {
 			const domChild = domElement.childNodes[ i ];
-			const viewChild = this.domToView( domChild, options );
+			const viewChild = this.domToView( viewDocument, domChild, options );
 
 			if ( viewChild !== null ) {
 				yield viewChild;

+ 2 - 2
packages/ckeditor5-engine/src/view/observer/mutationobserver.js

@@ -206,7 +206,7 @@ export default class MutationObserver extends Observer {
 		for ( const viewElement of mutatedElements ) {
 			const domElement = domConverter.mapViewToDom( viewElement );
 			const viewChildren = Array.from( viewElement.getChildren() );
-			const newViewChildren = Array.from( domConverter.domChildrenToView( domElement, { withChildren: false } ) );
+			const newViewChildren = Array.from( domConverter.domChildrenToView( this.document, domElement, { withChildren: false } ) );
 
 			// It may happen that as a result of many changes (sth was inserted and then removed),
 			// both elements haven't really changed. #1031
@@ -287,7 +287,7 @@ export default class MutationObserver extends Observer {
 
 		// Check if mutation added only one node on the end of its parent.
 		if ( mutation.nextSibling === null && mutation.removedNodes.length === 0 && mutation.addedNodes.length == 1 ) {
-			addedNode = this.domConverter.domToView( mutation.addedNodes[ 0 ], {
+			addedNode = this.domConverter.domToView( this.document, mutation.addedNodes[ 0 ], {
 				withChildren: false
 			} );
 		}

+ 13 - 6
packages/ckeditor5-engine/src/view/renderer.js

@@ -41,10 +41,9 @@ export default class Renderer {
 	/**
 	 * Creates a renderer instance.
 	 *
-	 * @param {module:engine/view/domconverter~DomConverter} domConverter Converter instance.
-	 * @param {module:engine/view/documentselection~DocumentSelection} selection View selection.
+	 * @param {module:engine/view/view~View} view View editing controller.
 	 */
-	constructor( domConverter, selection ) {
+	constructor( view ) {
 		/**
 		 * Set of DOM Documents instances.
 		 *
@@ -59,7 +58,7 @@ export default class Renderer {
 		 * @readonly
 		 * @member {module:engine/view/domconverter~DomConverter}
 		 */
-		this.domConverter = domConverter;
+		this.domConverter = view.domConverter;
 
 		/**
 		 * Set of nodes which attributes changed and may need to be rendered.
@@ -91,7 +90,7 @@ export default class Renderer {
 		 * @readonly
 		 * @member {module:engine/view/documentselection~DocumentSelection}
 		 */
-		this.selection = selection;
+		this.selection = view.document.selection;
 
 		/**
 		 * Indicates if the view document is focused and selection can be rendered. Selection will not be rendered if
@@ -116,6 +115,14 @@ export default class Renderer {
 		 * @type {null|HTMLElement}
 		 */
 		this._fakeSelectionContainer = null;
+
+		/**
+		 * Reference to the {@link module:engine/view/view~View#document}.
+		 *
+		 * @private
+		 * @member {module:engine/view/document~Document}
+		 */
+		this._viewDocument = view.document;
 	}
 
 	/**
@@ -557,7 +564,7 @@ export default class Renderer {
 				remove( actualDomChildren[ i ] );
 			} else { // 'equal'
 				// Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).
-				this._markDescendantTextToSync( this.domConverter.domToView( expectedDomChildren[ i ] ) );
+				this._markDescendantTextToSync( this.domConverter.domToView( this._viewDocument, expectedDomChildren[ i ] ) );
 				i++;
 			}
 		}

+ 1 - 1
packages/ckeditor5-engine/src/view/view.js

@@ -103,7 +103,7 @@ export default class View {
 		 * @protected
 		 * @type {module:engine/view/renderer~Renderer}
 		 */
-		this._renderer = new Renderer( this.domConverter, this.document.selection );
+		this._renderer = new Renderer( this );
 		this._renderer.bind( 'isFocused' ).to( this.document );
 
 		/**