Kaynağa Gözat

Check the type of the element in writer.wrap and writer.upwrap.

Piotr Jasiun 9 yıl önce
ebeveyn
işleme
d5b68925c3

+ 18 - 0
packages/ckeditor5-engine/src/treeview/writer.js

@@ -346,6 +346,15 @@ import DocumentFragment from './documentfragment.js';
 	 * @param {Number} priority Priority to set.
 	 */
 	wrap( range, attribute, priority ) {
+		if ( !( attribute instanceof AttributeElement ) ) {
+			/**
+			 * Attribute element need to be instance of attribute element.
+			 *
+			 * @error treeview-writer-wrap-invalid-attribute
+			 */
+			throw new CKEditorError( 'treeview-writer-wrap-invalid-attribute' );
+		}
+
 		// Range should be placed inside one container.
 		if ( this.getParentContainer( range.start ) !== this.getParentContainer( range.end ) ) {
 			/**
@@ -397,6 +406,15 @@ import DocumentFragment from './documentfragment.js';
 	 * @param {engine.treeView.AttributeElement} element
 	 */
 	unwrap( range, attribute ) {
+		if ( !( attribute instanceof AttributeElement ) ) {
+			/**
+			 * Attribute element need to be instance of attribute element.
+			 *
+			 * @error treeview-writer-unwrap-invalid-attribute
+			 */
+			throw new CKEditorError( 'treeview-writer-unwrap-invalid-attribute' );
+		}
+
 		// Range should be placed inside one container.
 		if ( this.getParentContainer( range.start ) !== this.getParentContainer( range.end ) ) {
 			/**

+ 29 - 15
packages/ckeditor5-engine/tests/treeview/writer/unwrap.js

@@ -8,6 +8,7 @@
 'use strict';
 
 import Writer from '/ckeditor5/engine/treeview/writer.js';
+import Element from '/ckeditor5/engine/treeview/element.js';
 import ContainerElement from '/ckeditor5/engine/treeview/containerelement.js';
 import AttributeElement from '/ckeditor5/engine/treeview/attributeelement.js';
 import Position from '/ckeditor5/engine/treeview/position.js';
@@ -35,7 +36,7 @@ describe( 'Writer', () => {
 				]
 			};
 			const created = create( writer, description );
-			const newRange = writer.unwrap( created.range, new ContainerElement( 'b' ), 1 );
+			const newRange = writer.unwrap( created.range, new AttributeElement( 'b' ), 1 );
 			test( writer, newRange, created.node, description );
 		} );
 
@@ -52,13 +53,26 @@ describe( 'Writer', () => {
 			};
 
 			const created = create( writer, description );
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 
 			test( writer, newRange, created.node, description );
 		} );
 
+		it( 'should throw error when element is not instance of AttributeElement', () => {
+			const container = new ContainerElement( 'p', null, new AttributeElement( 'b', null, new Text( 'foo' ) ) );
+			const range = new Range(
+				new Position( container, 0 ),
+				new Position( container, 1 )
+			);
+			const b = new Element( 'b' );
+
+			expect( () => {
+				writer.unwrap( range, b );
+			} ).to.throw( CKEditorError, 'treeview-writer-unwrap-invalid-attribute' );
+		} );
+
 		it( 'should throw error when range placed in two containers', () => {
 			const container1 = new ContainerElement( 'p' );
 			const container2 = new ContainerElement( 'p' );
@@ -66,7 +80,7 @@ describe( 'Writer', () => {
 				new Position( container1, 0 ),
 				new Position( container2, 1 )
 			);
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 
 			expect( () => {
 				writer.unwrap( range, b, 1 );
@@ -92,7 +106,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -128,7 +142,7 @@ describe( 'Writer', () => {
 			};
 			const created = create( writer, description );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 2;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -171,7 +185,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 2;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -215,7 +229,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 
 			const newRange = writer.unwrap( created.range, b );
@@ -265,7 +279,7 @@ describe( 'Writer', () => {
 					}
 				]
 			} );
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 
 			const newRange = writer.unwrap( created.range, b );
@@ -308,7 +322,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b =  new ContainerElement( 'b' );
+			const b =  new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 			test( writer, newRange, created.node, {
@@ -360,7 +374,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -419,7 +433,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -502,7 +516,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 
@@ -582,7 +596,7 @@ describe( 'Writer', () => {
 				]
 			} );
 
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 			test( writer, newRange, created.node, {
@@ -628,7 +642,7 @@ describe( 'Writer', () => {
 					}
 				]
 			} );
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 			test( writer, newRange, created.node, {
@@ -673,7 +687,7 @@ describe( 'Writer', () => {
 					}
 				]
 			} );
-			const b = new ContainerElement( 'b' );
+			const b = new AttributeElement( 'b' );
 			b.priority = 1;
 			const newRange = writer.unwrap( created.range, b );
 			test( writer, newRange, created.node, {

+ 14 - 0
packages/ckeditor5-engine/tests/treeview/writer/wrap.js

@@ -8,6 +8,7 @@
 'use strict';
 
 import Writer from '/ckeditor5/engine/treeview/writer.js';
+import Element from '/ckeditor5/engine/treeview/element.js';
 import ContainerElement from '/ckeditor5/engine/treeview/containerelement.js';
 import AttributeElement from '/ckeditor5/engine/treeview/attributeelement.js';
 import Position from '/ckeditor5/engine/treeview/position.js';
@@ -74,6 +75,19 @@ describe( 'Writer', () => {
 			} );
 		} );
 
+		it( 'should throw error when element is not instance of AttributeElement', () => {
+			const container = new ContainerElement( 'p', null, new Text( 'foo' ) );
+			const range = new Range(
+				new Position( container, 0 ),
+				new Position( container, 1 )
+			);
+			const b = new Element( 'b' );
+
+			expect( () => {
+				writer.wrap( range, b, 1 );
+			} ).to.throw( CKEditorError, 'treeview-writer-wrap-invalid-attribute' );
+		} );
+
 		it( 'should throw error when range placed in two containers', () => {
 			const container1 = new ContainerElement( 'p' );
 			const container2 = new ContainerElement( 'p' );