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

Commit 08e9d09

Browse files
author
Piotr Jasiun
authored
Merge pull request #76 from ckeditor/t/ckeditor5-engine/1207
Other: Use post-fixer API.
2 parents 3ccb56a + 3e68779 commit 08e9d09

File tree

3 files changed

+63
-37
lines changed

3 files changed

+63
-37
lines changed

src/imageuploadengine.js

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -75,29 +75,34 @@ export default class ImageUploadEngine extends Plugin {
7575
data.preventDefault();
7676
} );
7777

78-
doc.on( 'change', ( evt, type, data ) => {
79-
// Listen on document changes and:
80-
// * start upload process when image with `uploadId` attribute is inserted,
81-
// * abort upload process when image `uploadId` attribute is removed.
82-
if ( type === 'insert' || type === 'reinsert' || type === 'remove' ) {
83-
for ( const value of data.range ) {
84-
if ( value.type === 'elementStart' && value.item.name === 'image' ) {
85-
const imageElement = value.item;
86-
const uploadId = imageElement.getAttribute( 'uploadId' );
87-
88-
if ( uploadId ) {
89-
const loader = fileRepository.loaders.get( uploadId );
90-
91-
if ( loader ) {
92-
if ( type === 'insert' && loader.status == 'idle' ) {
93-
this.load( loader, imageElement );
94-
}
95-
96-
if ( type === 'remove' ) {
97-
loader.abort();
98-
}
99-
}
100-
}
78+
doc.on( 'change', () => {
79+
const changes = doc.differ.getChanges( { includeChangesInGraveyard: true } );
80+
81+
for ( const entry of changes ) {
82+
if ( entry.type == 'insert' && entry.name == 'image' ) {
83+
const item = entry.position.nodeAfter;
84+
const isInGraveyard = entry.position.root.rootName == '$graveyard';
85+
86+
// Check if the image element still has upload id.
87+
const uploadId = item.getAttribute( 'uploadId' );
88+
89+
if ( !uploadId ) {
90+
continue;
91+
}
92+
93+
// Check if the image is loaded on this client.
94+
const loader = fileRepository.loaders.get( uploadId );
95+
96+
if ( !loader ) {
97+
continue;
98+
}
99+
100+
if ( isInGraveyard ) {
101+
// If the image was inserted to the graveyard - abort the loading process.
102+
loader.abort();
103+
} else if ( loader.status == 'idle' ) {
104+
// If the image was inserted into content and has not been loaded, start loading it.
105+
this.load( loader, item );
101106
}
102107
}
103108
}

tests/imageuploadengine.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { setData as setModelData, getData as getModelData } from '@ckeditor/cked
2222
import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
2323
import { eventNameToConsumableType } from '@ckeditor/ckeditor5-engine/src/conversion/model-to-view-converters';
2424
import Range from '@ckeditor/ckeditor5-engine/src/model/range';
25+
import Position from '@ckeditor/ckeditor5-engine/src/model/position';
2526

2627
import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
2728
import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
@@ -214,7 +215,7 @@ describe( 'ImageUploadEngine', () => {
214215
setModelData( model, '<paragraph>{}foo bar</paragraph>' );
215216
editor.execute( 'imageUpload', { file } );
216217

217-
doc.once( 'changesDone', () => {
218+
model.once( '_change', () => {
218219
expect( getViewData( viewDocument ) ).to.equal(
219220
'[<figure class="ck-widget image" contenteditable="false">' +
220221
`<img src="${ base64Sample }"></img>` +
@@ -234,8 +235,8 @@ describe( 'ImageUploadEngine', () => {
234235
setModelData( model, '<paragraph>{}foo bar</paragraph>' );
235236
editor.execute( 'imageUpload', { file } );
236237

237-
doc.once( 'changesDone', () => {
238-
doc.once( 'changesDone', () => {
238+
model.document.once( 'change', () => {
239+
model.document.once( 'change', () => {
239240
expect( getViewData( viewDocument ) ).to.equal(
240241
'[<figure class="ck-widget image" contenteditable="false"><img src="image.png"></img></figure>]<p>foo bar</p>'
241242
);
@@ -309,8 +310,8 @@ describe( 'ImageUploadEngine', () => {
309310

310311
editor.execute( 'imageUpload', { file } );
311312

312-
doc.once( 'changesDone', () => {
313-
doc.once( 'changesDone', () => {
313+
model.document.once( 'change', () => {
314+
model.document.once( 'change', () => {
314315
expect( getModelData( model ) ).to.equal( '<paragraph>[]foo bar</paragraph>' );
315316
sinon.assert.calledOnce( spy );
316317

@@ -325,6 +326,7 @@ describe( 'ImageUploadEngine', () => {
325326
const file = createNativeFileMock();
326327
setModelData( model, '<paragraph>{}foo bar</paragraph>' );
327328
editor.execute( 'imageUpload', { file } );
329+
328330
const abortSpy = testUtils.sinon.spy( loader, 'abort' );
329331

330332
expect( loader.status ).to.equal( 'reading' );
@@ -339,6 +341,24 @@ describe( 'ImageUploadEngine', () => {
339341
sinon.assert.calledOnce( abortSpy );
340342
} );
341343

344+
it( 'should not abort and not restart upload when image is moved', () => {
345+
const file = createNativeFileMock();
346+
setModelData( model, '<paragraph>{}foo bar</paragraph>' );
347+
editor.execute( 'imageUpload', { file } );
348+
349+
const abortSpy = testUtils.sinon.spy( loader, 'abort' );
350+
const loadSpy = testUtils.sinon.spy( loader, 'read' );
351+
352+
const image = doc.getRoot().getChild( 0 );
353+
354+
model.change( writer => {
355+
writer.move( Range.createOn( image ), Position.createAt( doc.getRoot(), 2 ) );
356+
} );
357+
358+
expect( abortSpy.called ).to.be.false;
359+
expect( loadSpy.called ).to.be.false;
360+
} );
361+
342362
it( 'image should be permanently removed if it is removed by user during upload', done => {
343363
const file = createNativeFileMock();
344364
const notification = editor.plugins.get( Notification );
@@ -351,13 +371,13 @@ describe( 'ImageUploadEngine', () => {
351371

352372
editor.execute( 'imageUpload', { file } );
353373

354-
doc.once( 'changesDone', () => {
374+
model.document.once( 'change', () => {
355375
// This is called after "manual" remove.
356-
doc.once( 'changesDone', () => {
376+
model.document.once( 'change', () => {
357377
// This is called after attributes are removed.
358378
let undone = false;
359379

360-
doc.once( 'changesDone', () => {
380+
model.document.once( 'change', () => {
361381
if ( !undone ) {
362382
undone = true;
363383

@@ -376,6 +396,7 @@ describe( 'ImageUploadEngine', () => {
376396
} );
377397

378398
const image = doc.getRoot().getChild( 0 );
399+
379400
model.change( writer => {
380401
writer.remove( image );
381402
} );
@@ -386,8 +407,8 @@ describe( 'ImageUploadEngine', () => {
386407
setModelData( model, '<paragraph>{}foo bar</paragraph>' );
387408
editor.execute( 'imageUpload', { file } );
388409

389-
doc.once( 'changesDone', () => {
390-
doc.once( 'changesDone', () => {
410+
model.document.once( 'change', () => {
411+
model.document.once( 'change', () => {
391412
expect( getViewData( viewDocument ) ).to.equal(
392413
'[<figure class="ck-widget image" contenteditable="false">' +
393414
'<img sizes="100vw" src="image.png" srcset="image-500.png 500w, image-800.png 800w" width="800"></img>' +

tests/imageuploadprogress.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ describe( 'ImageUploadProgress', () => {
8888
setModelData( model, '<paragraph>[]foo</paragraph>' );
8989
editor.execute( 'imageUpload', { file: createNativeFileMock() } );
9090

91-
document.once( 'changesDone', () => {
91+
model.document.once( 'change', () => {
9292
expect( getViewData( viewDocument ) ).to.equal(
9393
'[<figure class="ck-appear ck-widget image" contenteditable="false">' +
9494
`<img src="${ base64Sample }"></img>` +
@@ -106,7 +106,7 @@ describe( 'ImageUploadProgress', () => {
106106
setModelData( model, '<paragraph>[]foo</paragraph>' );
107107
editor.execute( 'imageUpload', { file: createNativeFileMock() } );
108108

109-
document.once( 'changesDone', () => {
109+
model.document.once( 'change', () => {
110110
adapterMock.mockProgress( 40, 100 );
111111

112112
expect( getViewData( viewDocument ) ).to.equal(
@@ -126,8 +126,8 @@ describe( 'ImageUploadProgress', () => {
126126
setModelData( model, '<paragraph>[]foo</paragraph>' );
127127
editor.execute( 'imageUpload', { file: createNativeFileMock() } );
128128

129-
document.once( 'changesDone', () => {
130-
document.once( 'changesDone', () => {
129+
model.document.once( 'change', () => {
130+
model.document.once( 'change', () => {
131131
expect( getViewData( viewDocument ) ).to.equal(
132132
'[<figure class="ck-widget image" contenteditable="false">' +
133133
'<img src="image.png"></img>' +

0 commit comments

Comments
 (0)