Przeglądaj źródła

"view.Text#data" is protected now.

Kamil Piechaczek 7 lat temu
rodzic
commit
fd1a2b434c

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

@@ -449,7 +449,7 @@ class RangeParser {
 			}
 
 			text = text.replace( regexp, '' );
-			node.data = text;
+			node._data = text;
 			const index = node.index;
 			const parent = node.parent;
 

+ 41 - 16
packages/ckeditor5-engine/src/view/text.js

@@ -33,19 +33,9 @@ export default class Text extends Node {
 		 * Setting the data fires the {@link module:engine/view/node~Node#event:change:text change event}.
 		 *
 		 * @protected
-		 * @member {String} module:engine/view/text~Text#_data
+		 * @member {String} module:engine/view/text~Text#_textData
 		 */
-		this._data = data;
-	}
-
-	/**
-	 * Clones this node.
-	 *
-	 * @protected
-	 * @returns {module:engine/view/text~Text} Text node that is a clone of this node.
-	 */
-	_clone() {
-		return new Text( this.data );
+		this._textData = data;
 	}
 
 	/**
@@ -58,16 +48,41 @@ export default class Text extends Node {
 	/**
 	 * The text content.
 	 *
-	 * Setting the data fires the {@link module:engine/view/node~Node#event:change:text change event}.
+	 * @returns {String}
 	 */
 	get data() {
-		return this._data;
+		return this._textData;
 	}
 
-	set data( data ) {
+	/**
+	 * This getter is required when using the addition assignment operator on protected property:
+	 *
+	 *		const foo = new Text( 'foo' );
+	 *		const bar = new Text( 'bar' );
+	 *
+	 *		foo._data += bar.data;   // executes: `foo._data = foo._data + bar.data`
+	 *		console.log( foo.data ); // prints: 'foobar'
+	 *
+	 * If the protected getter didn't exist, `foo._data` will return `undefined` and result of the merge will be invalid.
+	 *
+	 * @protected
+	 * @returns {String}
+	 */
+	get _data() {
+		return this.data;
+	}
+
+	/**
+	 * Sets data and fires the {@link module:engine/view/node~Node#event:change:text change event}.
+	 *
+	 * @protected
+	 * @fires change:text
+	 * @param {String} data New data for the text node.
+	 */
+	set _data( data ) {
 		this._fireChange( 'text', this );
 
-		this._data = data;
+		this._textData = data;
 	}
 
 	/**
@@ -84,4 +99,14 @@ export default class Text extends Node {
 
 		return this === otherNode || this.data === otherNode.data;
 	}
+
+	/**
+	 * Clones this node.
+	 *
+	 * @protected
+	 * @returns {module:engine/view/text~Text} Text node that is a clone of this node.
+	 */
+	_clone() {
+		return new Text( this.data );
+	}
 }

+ 2 - 2
packages/ckeditor5-engine/src/view/writer.js

@@ -1482,7 +1482,7 @@ function breakTextNode( position ) {
 	const textToMove = position.parent.data.slice( position.offset );
 
 	// Leave rest of the text in position's parent.
-	position.parent.data = position.parent.data.slice( 0, position.offset );
+	position.parent._data = position.parent.data.slice( 0, position.offset );
 
 	// Insert new text node after position's parent text node.
 	position.parent.parent._insertChildren( position.parent.index + 1, new Text( textToMove ) );
@@ -1500,7 +1500,7 @@ function breakTextNode( position ) {
 function mergeTextNodes( t1, t2 ) {
 	// Merge text data into first text node and remove second one.
 	const nodeBeforeLength = t1.data.length;
-	t1.data += t2.data;
+	t1._data += t2.data;
 	t2._remove();
 
 	return new Position( t1, nodeBeforeLength );

+ 3 - 3
packages/ckeditor5-engine/tests/view/node.js

@@ -289,7 +289,7 @@ describe( 'Node', () => {
 			const parsed = JSON.parse( json );
 
 			expect( parsed ).to.deep.equal( {
-				_data: 'a'
+				_textData: 'a'
 			} );
 		} );
 	} );
@@ -380,9 +380,9 @@ describe( 'Node', () => {
 			} );
 		} );
 
-		describe( '_removeChildren()', () => {
+		describe( 'setText', () => {
 			it( 'should fire change event', () => {
-				text.data = 'bar';
+				text._data = 'bar';
 
 				sinon.assert.calledOnce( rootChangeSpy );
 				sinon.assert.calledWith( rootChangeSpy, 'text', text );

+ 6 - 6
packages/ckeditor5-engine/tests/view/renderer.js

@@ -80,7 +80,7 @@ describe( 'Renderer', () => {
 		it( 'should mark text which need update', () => {
 			const viewText = new ViewText( 'foo' );
 			viewRoot._appendChildren( viewText );
-			viewText.data = 'bar';
+			viewText._data = 'bar';
 
 			renderer.markToSync( 'text', viewText );
 
@@ -93,7 +93,7 @@ describe( 'Renderer', () => {
 			viewRoot = new ViewElement( 'p' );
 
 			viewRoot._appendChildren( viewText );
-			viewText.data = 'bar';
+			viewText._data = 'bar';
 
 			renderer.markToSync( 'text', viewText );
 
@@ -205,7 +205,7 @@ describe( 'Renderer', () => {
 			expect( domRoot.childNodes.length ).to.equal( 1 );
 			expect( domRoot.childNodes[ 0 ].data ).to.equal( 'foo' );
 
-			viewText.data = 'bar';
+			viewText._data = 'bar';
 
 			renderer.markToSync( 'text', viewText );
 			renderer.render();
@@ -1914,7 +1914,7 @@ describe( 'Renderer', () => {
 				writer.unwrap( viewDoc.selection.getFirstRange(), new ViewAttributeElement( 'italic' ) );
 			} );
 
-			viewRoot.getChild( 0 ).getChild( 0 ).getChild( 0 ).data = 'bar';
+			viewRoot.getChild( 0 ).getChild( 0 ).getChild( 0 )._data = 'bar';
 			expect( getViewData( view ) ).to.equal( '<p>[<strong>bar</strong>]</p>' );
 
 			// Re-render changes in view to DOM.
@@ -1935,7 +1935,7 @@ describe( 'Renderer', () => {
 
 			// Change text and insert new element into paragraph.
 			const textNode = viewRoot.getChild( 0 ).getChild( 0 );
-			textNode.data = 'foobar';
+			textNode._data = 'foobar';
 
 			view.change( writer => {
 				writer.insert( ViewPosition.createAfter( textNode ), new ViewAttributeElement( 'img' ) );
@@ -1961,7 +1961,7 @@ describe( 'Renderer', () => {
 
 			// Change text and insert new element into paragraph.
 			const textNode = viewRoot.getChild( 0 ).getChild( 0 );
-			textNode.data = 'foobar';
+			textNode._data = 'foobar';
 
 			view.change( writer => {
 				writer.insert( ViewPosition.createBefore( textNode ), new ViewAttributeElement( 'img' ) );

+ 10 - 2
packages/ckeditor5-engine/tests/view/text.js

@@ -70,7 +70,7 @@ describe( 'Text', () => {
 
 		it( 'should return false when data is not the same', () => {
 			const other = text._clone();
-			other.data = 'not-foo';
+			other._data = 'not-foo';
 
 			expect( text.isSimilar( other ) ).to.be.false;
 		} );
@@ -79,9 +79,17 @@ describe( 'Text', () => {
 	describe( 'setText', () => {
 		it( 'should change the text', () => {
 			const text = new Text( 'foo' );
-			text.data = 'bar';
+			text._data = 'bar';
 
 			expect( text.data ).to.equal( 'bar' );
 		} );
+
+		it( 'works when using addition assignment operator (+=)', () => {
+			const foo = new Text( 'foo' );
+			const bar = new Text( 'bar' );
+
+			foo._data += bar.data;
+			expect( foo.data ).to.equal( 'foobar' );
+		} );
 	} );
 } );