Browse Source

Fixing error context - WIP.

Maciej Bukowski 6 years ago
parent
commit
5d2f8e713e

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

@@ -116,7 +116,8 @@ export default class AttributeElement extends Element {
 			 */
 			throw new CKEditorError(
 				'attribute-element-get-elements-with-same-id-no-id: ' +
-				'Cannot get elements with the same id for an attribute element without id.'
+				'Cannot get elements with the same id for an attribute element without id.',
+				this
 			);
 		}
 

+ 21 - 18
packages/ckeditor5-engine/src/view/downcastwriter.js

@@ -444,7 +444,8 @@ export default class DowncastWriter {
 			 * @error view-writer-break-non-container-element
 			 */
 			throw new CKEditorError(
-				'view-writer-break-non-container-element: Trying to break an element which is not a container element.'
+				'view-writer-break-non-container-element: Trying to break an element which is not a container element.',
+				this.document
 			);
 		}
 
@@ -454,7 +455,7 @@ export default class DowncastWriter {
 			 *
 			 * @error view-writer-break-root
 			 */
-			throw new CKEditorError( 'view-writer-break-root: Trying to break root element.' );
+			throw new CKEditorError( 'view-writer-break-root: Trying to break root element.', this.document );
 		}
 
 		if ( position.isAtStart ) {
@@ -577,7 +578,7 @@ export default class DowncastWriter {
 			 * @error view-writer-merge-containers-invalid-position
 			 */
 			throw new CKEditorError( 'view-writer-merge-containers-invalid-position: ' +
-				'Element before and after given position cannot be merged.' );
+				'Element before and after given position cannot be merged.', this.document );
 		}
 
 		const lastChild = prev.getChild( prev.childCount - 1 );
@@ -612,7 +613,7 @@ export default class DowncastWriter {
 		nodes = isIterable( nodes ) ? [ ...nodes ] : [ nodes ];
 
 		// Check if nodes to insert are instances of AttributeElements, ContainerElements, EmptyElements, UIElements or Text.
-		validateNodesToInsert( nodes );
+		validateNodesToInsert( nodes, this.document );
 
 		const container = getParentContainer( position );
 
@@ -622,7 +623,7 @@ export default class DowncastWriter {
 			 *
 			 * @error view-writer-invalid-position-container
 			 */
-			throw new CKEditorError( 'view-writer-invalid-position-container' );
+			throw new CKEditorError( 'view-writer-invalid-position-container', this.document );
 		}
 
 		const insertionPosition = this._breakAttributes( position, true );
@@ -665,7 +666,7 @@ export default class DowncastWriter {
 	remove( rangeOrItem ) {
 		const range = rangeOrItem instanceof Range ? rangeOrItem : Range._createOn( rangeOrItem );
 
-		validateRangeContainer( range );
+		validateRangeContainer( range, this.document );
 
 		// If range is collapsed - nothing to remove.
 		if ( range.isCollapsed ) {
@@ -705,7 +706,7 @@ export default class DowncastWriter {
 	 * @param {module:engine/view/element~Element} element Element to remove.
 	 */
 	clear( range, element ) {
-		validateRangeContainer( range );
+		validateRangeContainer( range, this.document );
 
 		// Create walker on given range.
 		// We walk backward because when we remove element during walk it modifies range end position.
@@ -809,10 +810,10 @@ export default class DowncastWriter {
     */
 	wrap( range, attribute ) {
 		if ( !( attribute instanceof AttributeElement ) ) {
-			throw new CKEditorError( 'view-writer-wrap-invalid-attribute' );
+			throw new CKEditorError( 'view-writer-wrap-invalid-attribute', this.document );
 		}
 
-		validateRangeContainer( range );
+		validateRangeContainer( range, this.document );
 
 		if ( !range.isCollapsed ) {
 			// Non-collapsed range. Wrap it with the attribute element.
@@ -854,10 +855,10 @@ export default class DowncastWriter {
 			 *
 			 * @error view-writer-unwrap-invalid-attribute
 			 */
-			throw new CKEditorError( 'view-writer-unwrap-invalid-attribute' );
+			throw new CKEditorError( 'view-writer-unwrap-invalid-attribute', this.document );
 		}
 
-		validateRangeContainer( range );
+		validateRangeContainer( range, this.document );
 
 		// If range is collapsed - nothing to unwrap.
 		if ( range.isCollapsed ) {
@@ -1489,7 +1490,7 @@ export default class DowncastWriter {
 		const rangeStart = range.start;
 		const rangeEnd = range.end;
 
-		validateRangeContainer( range );
+		validateRangeContainer( range, this.document );
 
 		// Break at the collapsed position. Return new collapsed range.
 		if ( range.isCollapsed ) {
@@ -1534,7 +1535,7 @@ export default class DowncastWriter {
 			 *
 			 * @error view-writer-cannot-break-empty-element
 			 */
-			throw new CKEditorError( 'view-writer-cannot-break-empty-element' );
+			throw new CKEditorError( 'view-writer-cannot-break-empty-element', this.document );
 		}
 
 		// If position is placed inside UIElement - throw an exception as we cannot break inside.
@@ -1544,7 +1545,7 @@ export default class DowncastWriter {
 			 *
 			 * @error view-writer-cannot-break-ui-element
 			 */
-			throw new CKEditorError( 'view-writer-cannot-break-ui-element' );
+			throw new CKEditorError( 'view-writer-cannot-break-ui-element', this.document );
 		}
 
 		// There are no attributes to break and text nodes breaking is not forced.
@@ -1825,7 +1826,8 @@ function mergeTextNodes( t1, t2 ) {
 //
 // @param Iterable.<module:engine/view/text~Text|module:engine/view/attributeelement~AttributeElement
 // |module:engine/view/containerelement~ContainerElement> nodes
-function validateNodesToInsert( nodes ) {
+// @param {Object} errorContext
+function validateNodesToInsert( nodes, errorContext ) {
 	for ( const node of nodes ) {
 		if ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define
 			/**
@@ -1836,7 +1838,7 @@ function validateNodesToInsert( nodes ) {
 			 *
 			 * @error view-writer-insert-invalid-node
 			 */
-			throw new CKEditorError( 'view-writer-insert-invalid-node' );
+			throw new CKEditorError( 'view-writer-insert-invalid-node', errorContext );
 		}
 
 		if ( !node.is( 'text' ) ) {
@@ -1860,7 +1862,8 @@ function isContainerOrFragment( node ) {
 // Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.
 //
 // @param {module:engine/view/range~Range} range
-function validateRangeContainer( range ) {
+// @param {Object} errorContext
+function validateRangeContainer( range, errorContext ) {
 	const startContainer = getParentContainer( range.start );
 	const endContainer = getParentContainer( range.end );
 
@@ -1872,7 +1875,7 @@ function validateRangeContainer( range ) {
 		 *
 		 * @error view-writer-invalid-range-container
 		 */
-		throw new CKEditorError( 'view-writer-invalid-range-container' );
+		throw new CKEditorError( 'view-writer-invalid-range-container', errorContext );
 	}
 }
 

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

@@ -104,7 +104,7 @@ export default class EditableElement extends ContainerElement {
 			 *
 			 * @error view-editableelement-document-already-set
 			 */
-			throw new CKEditorError( 'view-editableelement-document-already-set: View document is already set.' );
+			throw new CKEditorError( 'view-editableelement-document-already-set: View document is already set.', this );
 		}
 
 		this._setCustomProperty( documentSymbol, document );

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

@@ -62,7 +62,7 @@ export default class Node {
 			 *
 			 * @error view-node-not-found-in-parent
 			 */
-			throw new CKEditorError( 'view-node-not-found-in-parent: The node\'s parent does not contain this node.' );
+			throw new CKEditorError( 'view-node-not-found-in-parent: The node\'s parent does not contain this node.', this );
 		}
 
 		return pos;

+ 5 - 3
packages/ckeditor5-engine/src/view/position.js

@@ -341,7 +341,9 @@ export default class Position {
 				 */
 				throw new CKEditorError(
 					'view-createPositionAt-offset-required: ' +
-					'View#createPositionAt() requires the offset when the first parameter is a view item.' );
+					'View#createPositionAt() requires the offset when the first parameter is a view item.',
+					this
+				);
 			}
 
 			return new Position( node, offset );
@@ -368,7 +370,7 @@ export default class Position {
 			 * @error view-position-after-root
 			 * @param {module:engine/view/node~Node} root
 			 */
-			throw new CKEditorError( 'view-position-after-root: You can not make position after root.', { root: item } );
+			throw new CKEditorError( 'view-position-after-root: You can not make position after root.', item, { root: item } );
 		}
 
 		return new Position( item.parent, item.index + 1 );
@@ -394,7 +396,7 @@ export default class Position {
 			 * @error view-position-before-root
 			 * @param {module:engine/view/node~Node} root
 			 */
-			throw new CKEditorError( 'view-position-before-root: You can not make position before root.', { root: item } );
+			throw new CKEditorError( 'view-position-before-root: You can not make position before root.', item, { root: item } );
 		}
 
 		return new Position( item.parent, item.index );

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

@@ -152,7 +152,7 @@ export default class Renderer {
 				 *
 				 * @error renderer-unknown-type
 				 */
-				throw new CKEditorError( 'view-renderer-unknown-type: Unknown type passed to Renderer.markToSync.' );
+				throw new CKEditorError( 'view-renderer-unknown-type: Unknown type passed to Renderer.markToSync.', this );
 			}
 		}
 	}
@@ -387,7 +387,7 @@ export default class Renderer {
 			 *
 			 * @error view-renderer-filler-was-lost
 			 */
-			throw new CKEditorError( 'view-renderer-filler-was-lost: The inline filler node was lost.' );
+			throw new CKEditorError( 'view-renderer-filler-was-lost: The inline filler node was lost.', this );
 		}
 
 		if ( isInlineFiller( domFillerNode ) ) {

+ 8 - 4
packages/ckeditor5-engine/src/view/selection.js

@@ -524,7 +524,8 @@ export default class Selection {
 				 */
 				throw new CKEditorError(
 					'view-selection-setTo-required-second-parameter: ' +
-					'selection.setTo requires the second parameter when the first parameter is a node.'
+					'selection.setTo requires the second parameter when the first parameter is a node.',
+					this
 				);
 			} else if ( placeOrOffset == 'in' ) {
 				range = Range._createIn( selectable );
@@ -547,7 +548,7 @@ export default class Selection {
 			 *
 			 * @error view-selection-setTo-not-selectable
 			 */
-			throw new CKEditorError( 'view-selection-setTo-not-selectable: Cannot set selection to given place.' );
+			throw new CKEditorError( 'view-selection-setTo-not-selectable: Cannot set selection to given place.', this );
 		}
 
 		this.fire( 'change' );
@@ -572,7 +573,8 @@ export default class Selection {
 			 * @error view-selection-setFocus-no-ranges
 			 */
 			throw new CKEditorError(
-				'view-selection-setFocus-no-ranges: Cannot set selection focus if there are no ranges in selection.'
+				'view-selection-setFocus-no-ranges: Cannot set selection focus if there are no ranges in selection.',
+				this
 			);
 		}
 
@@ -680,7 +682,8 @@ export default class Selection {
 			 */
 			throw new CKEditorError(
 				'view-selection-add-range-not-range: ' +
-				'Selection range set to an object that is not an instance of view.Range'
+				'Selection range set to an object that is not an instance of view.Range',
+				this
 			);
 		}
 
@@ -709,6 +712,7 @@ export default class Selection {
 				 */
 				throw new CKEditorError(
 					'view-selection-range-intersects: Trying to add a range that intersects with another range from selection.',
+					this,
 					{ addedRange: range, intersectingRange: storedRange }
 				);
 			}

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

@@ -55,7 +55,7 @@ export default class TextProxy {
 			 *
 			 * @error view-textproxy-wrong-offsetintext
 			 */
-			throw new CKEditorError( 'view-textproxy-wrong-offsetintext: Given offsetInText value is incorrect.' );
+			throw new CKEditorError( 'view-textproxy-wrong-offsetintext: Given offsetInText value is incorrect.', this );
 		}
 
 		if ( length < 0 || offsetInText + length > textNode.data.length ) {
@@ -64,7 +64,7 @@ export default class TextProxy {
 			 *
 			 * @error view-textproxy-wrong-length
 			 */
-			throw new CKEditorError( 'view-textproxy-wrong-length: Given length value is incorrect.' );
+			throw new CKEditorError( 'view-textproxy-wrong-length: Given length value is incorrect.', this );
 		}
 
 		/**

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

@@ -51,7 +51,7 @@ export default class TreeWalker {
 		if ( options.direction && options.direction != 'forward' && options.direction != 'backward' ) {
 			throw new CKEditorError(
 				'view-tree-walker-unknown-direction: Only `backward` and `forward` direction allowed.',
-				null,
+				this,
 				{ direction: options.direction }
 			);
 		}

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

@@ -81,7 +81,7 @@ export default class UIElement extends Element {
 			 *
 			 * @error view-uielement-cannot-add
 			 */
-			throw new CKEditorError( 'view-uielement-cannot-add: Cannot add child nodes to UIElement instance.' );
+			throw new CKEditorError( 'view-uielement-cannot-add: Cannot add child nodes to UIElement instance.', this );
 		}
 	}
 

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

@@ -451,7 +451,8 @@ export default class View {
 			throw new CKEditorError(
 				'cannot-change-view-tree: ' +
 				'Attempting to make changes to the view when it is in an incorrect state: rendering or post-fixers are in progress. ' +
-				'This may cause some unexpected behavior and inconsistency between the DOM and the view.'
+				'This may cause some unexpected behavior and inconsistency between the DOM and the view.',
+				this
 			);
 		}
 

+ 1 - 1
packages/ckeditor5-engine/tests/model/liveposition.js

@@ -44,7 +44,7 @@ describe( 'LivePosition', () =>
 	it( 'should throw if given root is not a RootElement', () => {
 		expectToThrowCKEditorError( () => {
 			new LivePosition( new DocumentFragment(), [ 1 ] ); // eslint-disable-line no-new
-		}, /model-liveposition-root-not-rootelement/, model );
+		}, /model-liveposition-root-not-rootelement/, null );
 	} );
 
 	it( 'should listen to the model applyOperation event', () => {

+ 5 - 5
packages/ckeditor5-engine/tests/model/markercollection.js

@@ -294,23 +294,23 @@ describe( 'Marker', () => {
 
 		expectToThrowCKEditorError( () => {
 			marker.getRange();
-		}, /^marker-destroyed/, model );
+		}, /^marker-destroyed/ );
 
 		expectToThrowCKEditorError( () => {
 			marker.getStart();
-		}, /^marker-destroyed/, model );
+		}, /^marker-destroyed/ );
 
 		expectToThrowCKEditorError( () => {
 			marker.getEnd();
-		}, /^marker-destroyed/, model );
+		}, /^marker-destroyed/ );
 
 		expectToThrowCKEditorError( () => {
 			marker.managedUsingOperations;
-		}, /^marker-destroyed/, model );
+		}, /^marker-destroyed/ );
 
 		expectToThrowCKEditorError( () => {
 			marker.affectsData;
-		}, /^marker-destroyed/, model );
+		}, /^marker-destroyed/ );
 	} );
 
 	it( 'should attach live range to marker', () => {

+ 3 - 3
packages/ckeditor5-engine/tests/model/operation/rootattributeoperation.js

@@ -191,7 +191,7 @@ describe( 'RootAttributeOperation', () => {
 				);
 
 				op._validate();
-			}, /rootattribute-operation-not-a-root/, model );
+			}, /rootattribute-operation-not-a-root/ );
 		} );
 
 		it( 'should throw an error when trying to change document fragment', () => {
@@ -205,7 +205,7 @@ describe( 'RootAttributeOperation', () => {
 				);
 
 				op._validate();
-			}, /rootattribute-operation-not-a-root/, model );
+			}, /rootattribute-operation-not-a-root/ );
 		} );
 
 		it( 'should throw an error when trying to remove an attribute that does not exists', () => {
@@ -306,7 +306,7 @@ describe( 'RootAttributeOperation', () => {
 
 			expectToThrowCKEditorError( () => {
 				RootAttributeOperation.fromJSON( serialized, doc );
-			}, /rootattribute-operation-fromjson-no-root/, model );
+			}, /rootattribute-operation-fromjson-no-root/ );
 		} );
 	} );
 } );

+ 2 - 2
packages/ckeditor5-engine/tests/model/operation/utils.js

@@ -82,7 +82,7 @@ describe( 'Operation utils', () => {
 		it( 'should throw if given range is not flat', () => {
 			expectToThrowCKEditorError( () => {
 				utils._remove( new Range( new Position( root, [ 0 ] ), new Position( root, [ 1, 2 ] ) ) );
-			}, /operation-utils-remove-range-not-flat/, model );
+			}, /operation-utils-remove-range-not-flat/ );
 		} );
 	} );
 
@@ -104,7 +104,7 @@ describe( 'Operation utils', () => {
 		it( 'should throw if given range is not flat', () => {
 			expectToThrowCKEditorError( () => {
 				utils._move( new Range( new Position( root, [ 0 ] ), new Position( root, [ 1, 2 ] ) ), null );
-			}, /operation-utils-move-range-not-flat/, model );
+			}, /operation-utils-move-range-not-flat/ );
 		} );
 	} );
 

+ 6 - 5
packages/ckeditor5-engine/tests/view/downcastwriter/breakattributes.js

@@ -17,10 +17,11 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'breakAttributes()', () => {
-		let writer;
+		let writer, document;
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter( document );
 		} );
 
 		describe( 'break position', () => {
@@ -156,7 +157,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.breakAttributes( Range._createFromParentsAndOffsets( p1, 0, p2, 0 ) );
-				}, 'view-writer-invalid-range-container', writer );
+				}, 'view-writer-invalid-range-container', document );
 			} );
 
 			it( 'should throw when range has no parent container', () => {
@@ -164,7 +165,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.breakAttributes( Range._createFromParentsAndOffsets( el, 0, el, 0 ) );
-				}, 'view-writer-invalid-range-container', writer );
+				}, 'view-writer-invalid-range-container', document );
 			} );
 
 			it( 'should not break text nodes if they are not in attribute elements', () => {

+ 6 - 5
packages/ckeditor5-engine/tests/view/downcastwriter/clear.js

@@ -16,7 +16,7 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'clear()', () => {
-		let writer;
+		let writer, document;
 
 		// Executes test using `parse` and `stringify` utils functions. Uses range delimiters `[]{}` to create ranges.
 		//
@@ -31,8 +31,9 @@ describe( 'DowncastWriter', () => {
 			expect( stringify( view, null, { showType: true } ) ).to.equal( expectedResult );
 		}
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter( document );
 		} );
 
 		it( 'should throw when range placed in two containers', () => {
@@ -41,7 +42,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.clear( Range._createFromParentsAndOffsets( p1, 0, p2, 0 ) );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should throw when range has no parent container', () => {
@@ -49,7 +50,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.clear( Range._createFromParentsAndOffsets( el, 0, el, 0 ) );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should remove matched element from range', () => {

+ 9 - 8
packages/ckeditor5-engine/tests/view/downcastwriter/insert.js

@@ -17,7 +17,7 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'insert()', () => {
-		let writer;
+		let writer, document;
 
 		// Executes test using `parse` and `stringify` utils functions.
 		//
@@ -32,8 +32,9 @@ describe( 'DowncastWriter', () => {
 			expect( stringify( view.root, newRange, { showType: true, showPriority: true } ) ).to.equal( expected );
 		}
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter( document );
 		} );
 
 		it( 'should return collapsed range in insertion position when using empty array', () => {
@@ -159,7 +160,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.insert( position, element );
-			}, 'view-writer-insert-invalid-node', writer );
+			}, 'view-writer-insert-invalid-node', document );
 		} );
 
 		it( 'should throw when Element is inserted as child node', () => {
@@ -170,7 +171,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.insert( position, root );
-			}, 'view-writer-insert-invalid-node', writer );
+			}, 'view-writer-insert-invalid-node', document );
 		} );
 
 		it( 'should throw when position is not placed inside container', () => {
@@ -180,7 +181,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.insert( position, attributeElement );
-			}, 'view-writer-invalid-position-container', writer );
+			}, 'view-writer-invalid-position-container', document );
 		} );
 
 		it( 'should allow to insert EmptyElement into container', () => {
@@ -199,7 +200,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.insert( position, attributeElement );
-			}, 'view-writer-cannot-break-empty-element', writer );
+			}, 'view-writer-cannot-break-empty-element', document );
 		} );
 
 		it( 'should throw if trying to insert inside UIElement', () => {
@@ -210,7 +211,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.insert( position, attributeElement );
-			}, 'view-writer-cannot-break-ui-element', writer );
+			}, 'view-writer-cannot-break-ui-element', document );
 		} );
 	} );
 } );

+ 9 - 8
packages/ckeditor5-engine/tests/view/downcastwriter/remove.js

@@ -17,7 +17,7 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'remove()', () => {
-		let writer;
+		let writer, document;
 
 		// Executes test using `parse` and `stringify` utils functions. Uses range delimiters `[]{}` to create and
 		// test ranges.
@@ -37,8 +37,9 @@ describe( 'DowncastWriter', () => {
 			expect( stringify( removed, null, { showType: true, showPriority: true } ) ).to.equal( expectedRemoved );
 		}
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter();
 		} );
 
 		it( 'should throw when range placed in two containers', () => {
@@ -47,7 +48,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.remove( Range._createFromParentsAndOffsets( p1, 0, p2, 0 ) );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should throw when range has no parent container', () => {
@@ -55,7 +56,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.remove( Range._createFromParentsAndOffsets( el, 0, el, 0 ) );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should return empty DocumentFragment when range is collapsed', () => {
@@ -136,7 +137,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.remove( range );
-			}, 'view-writer-cannot-break-empty-element', writer );
+			}, 'view-writer-cannot-break-empty-element', document );
 		} );
 
 		it( 'should remove UIElement', () => {
@@ -155,7 +156,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.remove( range );
-			}, 'view-writer-cannot-break-ui-element', writer );
+			}, 'view-writer-cannot-break-ui-element', document );
 		} );
 
 		it( 'should remove single text node (as item)', () => {
@@ -204,7 +205,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.remove( el );
-			}, 'view-position-before-root', writer );
+			}, 'view-position-before-root', document );
 		} );
 	} );
 } );

+ 9 - 8
packages/ckeditor5-engine/tests/view/downcastwriter/unwrap.js

@@ -19,7 +19,7 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'unwrap()', () => {
-		let writer;
+		let writer, document;
 
 		// Executes test using `parse` and `stringify` utils functions.
 		//
@@ -33,8 +33,9 @@ describe( 'DowncastWriter', () => {
 			expect( stringify( view.root, newRange, { showType: true, showPriority: true } ) ).to.equal( expected );
 		}
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter( document );
 		} );
 
 		it( 'should do nothing on collapsed ranges', () => {
@@ -63,7 +64,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.unwrap( range, b );
-			}, 'view-writer-unwrap-invalid-attribute', writer );
+			}, 'view-writer-unwrap-invalid-attribute', document );
 		} );
 
 		it( 'should throw error when range placed in two containers', () => {
@@ -77,7 +78,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.unwrap( range, b );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should throw when range has no parent container', () => {
@@ -86,7 +87,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.unwrap( Range._createFromParentsAndOffsets( el, 0, el, 0 ), b );
-			}, 'view-writer-invalid-range-container', writer );
+			}, 'view-writer-invalid-range-container', document );
 		} );
 
 		it( 'should unwrap single node', () => {
@@ -402,7 +403,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.unwrap( range, attribute );
-			}, 'view-writer-cannot-break-empty-element', writer );
+			}, 'view-writer-cannot-break-empty-element', document );
 		} );
 
 		it( 'should unwrap UIElement', () => {
@@ -421,7 +422,7 @@ describe( 'DowncastWriter', () => {
 
 			expectToThrowCKEditorError( () => {
 				writer.unwrap( range, attribute );
-			}, 'view-writer-cannot-break-ui-element', writer );
+			}, 'view-writer-cannot-break-ui-element', document );
 		} );
 
 		it( 'should unwrap if both elements have same id', () => {

+ 10 - 9
packages/ckeditor5-engine/tests/view/downcastwriter/wrap.js

@@ -22,10 +22,11 @@ import { expectToThrowCKEditorError } from '@ckeditor/ckeditor5-utils/tests/_uti
 
 describe( 'DowncastWriter', () => {
 	describe( 'wrap()', () => {
-		let writer;
+		let writer, document;
 
-		before( () => {
-			writer = new DowncastWriter( new Document() );
+		beforeEach( () => {
+			document = new Document();
+			writer = new DowncastWriter( document );
 		} );
 
 		describe( 'non-collapsed range', () => {
@@ -70,7 +71,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( range, b );
-				}, 'view-writer-wrap-invalid-attribute', writer );
+				}, 'view-writer-wrap-invalid-attribute', document );
 			} );
 
 			it( 'should throw error when range placed in two containers', () => {
@@ -84,7 +85,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( range, b );
-				}, 'view-writer-invalid-range-container', writer );
+				}, 'view-writer-invalid-range-container', document );
 			} );
 
 			it( 'should throw when range has no parent container', () => {
@@ -93,7 +94,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( Range._createFromParentsAndOffsets( el, 0, el, 0 ), b );
-				}, 'view-writer-invalid-range-container', writer );
+				}, 'view-writer-invalid-range-container', document );
 			} );
 
 			it( 'wraps part of a single text node #1', () => {
@@ -399,7 +400,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( range, new AttributeElement( 'b' ) );
-				}, 'view-writer-cannot-break-empty-element', writer );
+				}, 'view-writer-cannot-break-empty-element', document );
 			} );
 
 			it( 'should wrap UIElement', () => {
@@ -417,7 +418,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( range, new AttributeElement( 'b' ) );
-				}, 'view-writer-cannot-break-ui-element', writer );
+				}, 'view-writer-cannot-break-ui-element', document );
 			} );
 
 			it( 'should keep stable hierarchy when wrapping with attribute with same priority', () => {
@@ -554,7 +555,7 @@ describe( 'DowncastWriter', () => {
 
 				expectToThrowCKEditorError( () => {
 					writer.wrap( new Range( position ), b );
-				}, 'view-writer-wrap-invalid-attribute', writer );
+				}, 'view-writer-wrap-invalid-attribute', document );
 			} );
 
 			it( 'should wrap position at the beginning of text node', () => {

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

@@ -217,7 +217,7 @@ describe( 'Node', () => {
 
 			expectToThrowCKEditorError( () => {
 				f.index;
-			}, /view-node-not-found-in-parent/, root );
+			}, /view-node-not-found-in-parent/, bar );
 		} );
 	} );
 

+ 9 - 5
packages/ckeditor5-engine/tests/view/position.js

@@ -382,7 +382,7 @@ describe( 'Position', () => {
 			it( 'should throw if no offset is passed', () => {
 				const element = new Element( 'p' );
 
-				expectToThrowCKEditorError( () => Position._createAt( element ), /view-createPositionAt-offset-required/, parentMock );
+				expectToThrowCKEditorError( () => Position._createAt( element ), /view-createPositionAt-offset-required/, element );
 			} );
 
 			it( 'should create positions from positions', () => {
@@ -448,9 +448,11 @@ describe( 'Position', () => {
 
 		describe( '_createBefore()', () => {
 			it( 'should throw error if one try to create positions before root', () => {
+				const paragraph = parse( '<p></p>' );
+
 				expectToThrowCKEditorError( () => {
-					Position._createBefore( parse( '<p></p>' ) );
-				}, /view-position-before-root/, parentMock );
+					Position._createBefore( paragraph );
+				}, /view-position-before-root/, paragraph );
 			} );
 
 			it( 'should create positions before `Node`', () => {
@@ -473,9 +475,11 @@ describe( 'Position', () => {
 
 		describe( '_createAfter()', () => {
 			it( 'should throw error if one try to create positions after root', () => {
+				const paragraph = parse( '<p></p>' );
+
 				expectToThrowCKEditorError( () => {
-					Position._createAfter( parse( '<p></p>' ) );
-				}, /view-position-after-root/, parentMock );
+					Position._createAfter( paragraph );
+				}, /view-position-after-root/, paragraph );
 			} );
 
 			it( 'should create positions after `Node`', () => {