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

Commit

Permalink
Fixed: Preventing "empty" wraps also in MoveOperation x WrapOperation…
Browse files Browse the repository at this point in the history
… cases.
  • Loading branch information
scofalik committed Aug 1, 2018
1 parent 20723dc commit d7b475c
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/model/position.js
Original file line number Diff line number Diff line change
Expand Up @@ -604,12 +604,19 @@ export default class Position {
if ( isContained ) {
pos = this._getCombined( operation.position, operation.targetPosition );
} else if ( this.isEqual( operation.targetPosition ) ) {
return Position.createFromPosition( this );
pos = Position.createFromPosition( this );
} else {
pos = this._getTransformedByInsertion( operation.targetPosition, operation.howMany );
}

return pos._getTransformedByMove( operation.targetPosition.getShiftedBy( operation.howMany ), operation.graveyardPosition, 1 );
const targetPosition = operation.targetPosition.getShiftedBy( operation.howMany );

if ( !targetPosition.isEqual( operation.graveyardPosition ) ) {
pos = pos._getTransformedByDeletion( targetPosition, 1 );
pos = pos._getTransformedByInsertion( operation.graveyardPosition, 1 );
}

return pos;
}

/**
Expand Down
96 changes: 96 additions & 0 deletions tests/model/operation/transform/wrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,102 @@ describe( 'transform', () => {
} );
} );

describe( 'by remove', () => {
it( 'remove the only wrapped element', () => {
john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );

john.wrap( 'blockQuote' );
kate.remove();

syncClients();

expectClients( '<paragraph>Bar</paragraph>' );
} );

it( 'remove one of two wrapped elements', () => {
john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );

john.wrap( 'blockQuote' );
kate.remove();

syncClients();

expectClients( '<blockQuote><paragraph>Bar</paragraph></blockQuote>' );
} );

it( 'remove all wrapped elements', () => {
john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Xyz</paragraph>' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );

john.wrap( 'blockQuote' );

kate.remove();
kate.setSelection( [ 0 ], [ 1 ] );
kate.remove();

syncClients();

expectClients( '<paragraph>Xyz</paragraph>' );
} );

it( 'remove the only wrapped element with undo', () => {
john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );

john.wrap( 'blockQuote' );
kate.remove();

syncClients();
expectClients( '<paragraph>Bar</paragraph>' );

john.undo();
kate.undo();

syncClients();
expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
} );

it( 'remove one of two wrapped elements with undo', () => {
john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );

john.wrap( 'blockQuote' );
kate.remove();

syncClients();
expectClients( '<blockQuote><paragraph>Bar</paragraph></blockQuote>' );

john.undo();
kate.undo();

syncClients();
expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
} );

it( 'remove all wrapped elements with undo', () => {
john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Xyz</paragraph>' );
kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );

john.wrap( 'blockQuote' );

kate.remove();
kate.setSelection( [ 0 ], [ 1 ] );
kate.remove();

syncClients();
expectClients( '<paragraph>Xyz</paragraph>' );

john.undo();
kate.undo();
kate.undo();

syncClients();
expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );
} );
} );

describe( 'by merge', () => {
it( 'element into paragraph #1', () => {
john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
Expand Down

0 comments on commit d7b475c

Please sign in to comment.