Skip to content
This repository has been archived by the owner on Jun 26, 2020. It is now read-only.

Commit

Permalink
Fixing error context - WIP.
Browse files Browse the repository at this point in the history
  • Loading branch information
ma2ciek committed Jul 1, 2019
1 parent 67fdc7c commit be00572
Show file tree
Hide file tree
Showing 23 changed files with 116 additions and 95 deletions.
3 changes: 2 additions & 1 deletion src/view/attributeelement.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
);
}

Expand Down
39 changes: 21 additions & 18 deletions src/view/downcastwriter.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
);
}

Expand All @@ -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 ) {
Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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 );

Expand All @@ -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 );
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand Down Expand Up @@ -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
/**
Expand All @@ -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' ) ) {
Expand All @@ -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 );

Expand All @@ -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 );
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/view/editableelement.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down
2 changes: 1 addition & 1 deletion src/view/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 5 additions & 3 deletions src/view/position.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand All @@ -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 );
Expand All @@ -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 );
Expand Down
4 changes: 2 additions & 2 deletions src/view/renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
}
}
}
Expand Down Expand Up @@ -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 ) ) {
Expand Down
12 changes: 8 additions & 4 deletions src/view/selection.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand All @@ -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' );
Expand All @@ -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
);
}

Expand Down Expand Up @@ -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
);
}

Expand Down Expand Up @@ -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 }
);
}
Expand Down
4 changes: 2 additions & 2 deletions src/view/textproxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {
Expand All @@ -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 );
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/view/treewalker.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
);
}
Expand Down
2 changes: 1 addition & 1 deletion src/view/uielement.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/view/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/model/liveposition.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
10 changes: 5 additions & 5 deletions tests/model/markercollection.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
6 changes: 3 additions & 3 deletions tests/model/operation/rootattributeoperation.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand All @@ -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', () => {
Expand Down Expand Up @@ -306,7 +306,7 @@ describe( 'RootAttributeOperation', () => {

expectToThrowCKEditorError( () => {
RootAttributeOperation.fromJSON( serialized, doc );
}, /rootattribute-operation-fromjson-no-root/, model );
}, /rootattribute-operation-fromjson-no-root/ );
} );
} );
} );
Loading

0 comments on commit be00572

Please sign in to comment.