|
|
@@ -446,22 +446,29 @@ describe( 'DowncastDispatcher', () => {
|
|
|
} );
|
|
|
|
|
|
describe( 'convertMarkerAdd', () => {
|
|
|
- let range, element, text;
|
|
|
+ let element, text;
|
|
|
|
|
|
beforeEach( () => {
|
|
|
text = new ModelText( 'foo bar baz' );
|
|
|
element = new ModelElement( 'paragraph', null, [ text ] );
|
|
|
root._appendChild( [ element ] );
|
|
|
-
|
|
|
- range = model.createRange( model.createPositionAt( element, 0 ), model.createPositionAt( element, 4 ) );
|
|
|
} );
|
|
|
|
|
|
- it( 'should fire addMarker event', () => {
|
|
|
- sinon.spy( dispatcher, 'fire' );
|
|
|
+ it( 'should fire addMarker event for whole collapsed marker', () => {
|
|
|
+ const range = model.createRange( model.createPositionAt( element, 2 ), model.createPositionAt( element, 2 ) );
|
|
|
+
|
|
|
+ const spy = sinon.spy();
|
|
|
+
|
|
|
+ dispatcher.on( 'addMarker:name', ( evt, data ) => {
|
|
|
+ spy();
|
|
|
+
|
|
|
+ expect( data.markerName ).to.equal( 'name' );
|
|
|
+ expect( data.markerRange.isEqual( range ) ).to.be.true;
|
|
|
+ } );
|
|
|
|
|
|
dispatcher.convertMarkerAdd( 'name', range );
|
|
|
|
|
|
- expect( dispatcher.fire.calledWith( 'addMarker:name' ) ).to.be.true;
|
|
|
+ expect( spy.calledOnce ).to.be.true;
|
|
|
} );
|
|
|
|
|
|
it( 'should not convert marker if it is in graveyard', () => {
|
|
|
@@ -483,27 +490,69 @@ describe( 'DowncastDispatcher', () => {
|
|
|
expect( dispatcher.fire.called ).to.be.false;
|
|
|
} );
|
|
|
|
|
|
- it( 'should fire conversion for each item in the range', () => {
|
|
|
- range = model.createRangeIn( root );
|
|
|
+ it( 'should fire addMarker event for whole non-collapsed marker and for each item in the range', () => {
|
|
|
+ const range = model.createRangeIn( root );
|
|
|
+
|
|
|
+ const spyWholeRange = sinon.spy();
|
|
|
+
|
|
|
+ dispatcher.on( 'addMarker:name', ( evt, data ) => {
|
|
|
+ if ( !data.item ) {
|
|
|
+ spyWholeRange();
|
|
|
|
|
|
+ expect( data.markerName ).to.equal( 'name' );
|
|
|
+ expect( data.markerRange.isEqual( range ) ).to.be.true;
|
|
|
+ }
|
|
|
+ } );
|
|
|
+
|
|
|
+ const spyItems = sinon.spy();
|
|
|
const items = [];
|
|
|
|
|
|
dispatcher.on( 'addMarker:name', ( evt, data, conversionApi ) => {
|
|
|
- expect( data.markerName ).to.equal( 'name' );
|
|
|
- expect( data.markerRange.isEqual( range ) ).to.be.true;
|
|
|
- expect( conversionApi.consumable.test( data.item, 'addMarker:name' ) );
|
|
|
+ if ( data.item ) {
|
|
|
+ spyItems();
|
|
|
|
|
|
- items.push( data.item );
|
|
|
+ expect( data.markerName ).to.equal( 'name' );
|
|
|
+ expect( data.markerRange.isEqual( range ) ).to.be.true;
|
|
|
+ expect( conversionApi.consumable.test( data.item, 'addMarker:name' ) );
|
|
|
+
|
|
|
+ items.push( data.item );
|
|
|
+ }
|
|
|
} );
|
|
|
|
|
|
dispatcher.convertMarkerAdd( 'name', range );
|
|
|
|
|
|
+ expect( spyWholeRange.calledOnce ).to.be.true;
|
|
|
+ expect( spyItems.calledTwice ).to.be.true;
|
|
|
+
|
|
|
expect( items[ 0 ] ).to.equal( element );
|
|
|
expect( items[ 1 ].data ).to.equal( text.data );
|
|
|
} );
|
|
|
|
|
|
+ it( 'should not fire conversion for non-collapsed marker items if marker was consumed in earlier event', () => {
|
|
|
+ const range = model.createRangeIn( root );
|
|
|
+
|
|
|
+ dispatcher.on( 'addMarker:name', ( evt, data, conversionApi ) => {
|
|
|
+ if ( !data.item ) {
|
|
|
+ conversionApi.consumable.consume( data.markerRange, evt.name );
|
|
|
+ }
|
|
|
+ }, { priority: 'high' } );
|
|
|
+
|
|
|
+ const spyItems = sinon.spy();
|
|
|
+ const items = [];
|
|
|
+
|
|
|
+ dispatcher.on( 'addMarker:name', ( evt, data ) => {
|
|
|
+ if ( data.item ) {
|
|
|
+ spyItems();
|
|
|
+ }
|
|
|
+ } );
|
|
|
+
|
|
|
+ dispatcher.convertMarkerAdd( 'name', range );
|
|
|
+
|
|
|
+ expect( spyItems.called ).to.be.false;
|
|
|
+ } );
|
|
|
+
|
|
|
it( 'should be possible to override', () => {
|
|
|
- range = model.createRangeIn( root );
|
|
|
+ const range = model.createRangeIn( root );
|
|
|
|
|
|
const addMarkerSpy = sinon.spy();
|
|
|
const highAddMarkerSpy = sinon.spy();
|