8
0
Quellcode durchsuchen

Created a single DataController#viewDocument. Used the document in DataController#toView.

Aleksander Nowodzinski vor 5 Jahren
Ursprung
Commit
46467505e4

+ 22 - 5
packages/ckeditor5-engine/src/controller/datacontroller.js

@@ -104,6 +104,24 @@ export default class DataController {
 			schema: model.schema
 		} );
 
+		/**
+		 * The view document used by the data controller.
+		 *
+		 * @readonly
+		 * @member {module:engine/view/document~Document}
+		 */
+		this.viewDocument = new ViewDocument( stylesProcessor );
+
+		/**
+		 * The view downcast writer just for data conversion purposes, i.e. to modify
+		 * the {@link #viewDocument}.
+		 *
+		 * @private
+		 * @readonly
+		 * @member {module:engine/view/downcastwriter~DowncastWriter}
+		 */
+		this._viewWriter = new ViewDowncastWriter( this.viewDocument );
+
 		// Define default converters for text and elements.
 		//
 		// Note that if there is no default converter for the element it will be skipped, for instance `<b>foo</b>` will be
@@ -188,20 +206,19 @@ export default class DataController {
 	 * @returns {module:engine/view/documentfragment~DocumentFragment} Output view DocumentFragment.
 	 */
 	toView( modelElementOrFragment ) {
+		const viewDocument = this.viewDocument;
+		const viewWriter = this._viewWriter;
+
 		// Clear bindings so the call to this method gives correct results.
 		this.mapper.clearBindings();
 
 		// First, convert elements.
 		const modelRange = ModelRange._createIn( modelElementOrFragment );
-		const viewDocument = new ViewDocument( this.stylesProcessor );
-
 		const viewDocumentFragment = new ViewDocumentFragment( viewDocument );
 
-		// Create separate ViewDowncastWriter just for data conversion purposes.
-		// We have no view controller and rendering do DOM in DataController so view.change() block is not used here.
-		const viewWriter = new ViewDowncastWriter( viewDocument );
 		this.mapper.bindElements( modelElementOrFragment, viewDocumentFragment );
 
+		// We have no view controller and rendering do DOM in DataController so view.change() block is not used here.
 		this.downcastDispatcher.convertInsert( modelRange, viewWriter );
 
 		if ( !modelElementOrFragment.is( 'documentFragment' ) ) {

+ 14 - 0
packages/ckeditor5-engine/tests/controller/datacontroller.js

@@ -56,6 +56,13 @@ describe( 'DataController', () => {
 			expect( data.model ).to.equal( model );
 			expect( data.stylesProcessor ).to.equal( stylesProcessor );
 		} );
+
+		it( 'should create the #viewDocument property', () => {
+			const stylesProcessor = new StylesProcessor();
+			const data = new DataController( model, stylesProcessor );
+
+			expect( data.viewDocument ).to.be.instanceOf( ViewDocument );
+		} );
 	} );
 
 	describe( 'parse()', () => {
@@ -474,6 +481,13 @@ describe( 'DataController', () => {
 			downcastHelpers.elementToElement( { model: 'paragraph', view: 'p' } );
 		} );
 
+		it( 'should use #viewDocument as a parent for returned document fragments', () => {
+			const modelElement = parseModel( '<div><paragraph>foo</paragraph></div>', schema );
+			const viewDocumentFragment = data.toView( modelElement );
+
+			expect( viewDocumentFragment.document ).to.equal( data.viewDocument );
+		} );
+
 		it( 'should convert a content of an element', () => {
 			const modelElement = parseModel( '<div><paragraph>foo</paragraph></div>', schema );