Skip to content

Commit 910de7a

Browse files
committed
Merge branch 't/12961' into major
2 parents c415544 + 3ef3e87 commit 910de7a

File tree

4 files changed

+191
-17
lines changed

4 files changed

+191
-17
lines changed

plugins/clipboard/plugin.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,7 +2130,7 @@
21302130
}
21312131

21322132
var that = this,
2133-
i;
2133+
i, file;
21342134

21352135
function getAndSetData( type ) {
21362136
type = that._.normalizeType( type );
@@ -2154,12 +2154,19 @@
21542154
}
21552155

21562156
// Copy files references.
2157-
if ( this.$ && this.$.files ) {
2157+
file = this._getImageFromClipboard();
2158+
if ( ( this.$ && this.$.files ) || file ) {
21582159
this._.files = [];
21592160

21602161
for ( i = 0; i < this.$.files.length; i++ ) {
21612162
this._.files.push( this.$.files[ i ] );
21622163
}
2164+
2165+
// Don't include $.items if both $.files and $.items contains files, because,
2166+
// according to spec and browsers behavior, they contain the same files.
2167+
if ( this._.files.length === 0 && file ) {
2168+
this._.files.push( file );
2169+
}
21632170
}
21642171
},
21652172

@@ -2177,7 +2184,7 @@
21772184
return this.$.files.length;
21782185
}
21792186

2180-
return 0;
2187+
return this._getImageFromClipboard() ? 1 : 0;
21812188
},
21822189

21832190
/**
@@ -2195,7 +2202,8 @@
21952202
return this.$.files[ i ];
21962203
}
21972204

2198-
return null;
2205+
// File or null if file was not founded.
2206+
return i === 0 ? this._getImageFromClipboard() : undefined;
21992207
},
22002208

22012209
/**
@@ -2243,6 +2251,31 @@
22432251
}
22442252

22452253
return true;
2254+
},
2255+
2256+
/**
2257+
* When the contents of the clipboard is pasted on Chrome the clipboard date object has empty `files` property,
2258+
* but it is possible to get file as items[0].getAsFile(); (#12961).
2259+
*
2260+
* @private
2261+
* @returns {File} File instance or null if not found.
2262+
*/
2263+
_getImageFromClipboard: function() {
2264+
var file;
2265+
2266+
if ( this.$ && this.$.items && this.$.items[ 0 ] ) {
2267+
try {
2268+
file = this.$.items[ 0 ].getAsFile();
2269+
// Duck typing
2270+
if ( file && file.type ) {
2271+
return file;
2272+
}
2273+
} catch ( err ) {
2274+
// noop
2275+
}
2276+
}
2277+
2278+
return undefined;
22462279
}
22472280
};
22482281
} )();

plugins/filetools/plugin.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,11 @@
338338

339339
if ( fileName ) {
340340
this.fileName = fileName;
341-
} else {
341+
} else if ( this.file.name ) {
342342
this.fileName = this.file.name;
343+
} else {
344+
// If file has no name create a name based on the mime type.
345+
this.fileName = this.file.type.replace( '/', '.' );
343346
}
344347

345348
this.uploaded = 0;
@@ -736,9 +739,7 @@
736739
byteArrays.push( byteArray );
737740
}
738741

739-
var file = new Blob( byteArrays, { type: contentType } );
740-
file.name = contentType.replace( '/', '.' );
741-
return file;
742+
return new Blob( byteArrays, { type: contentType } );
742743
}
743744

744745
//

tests/plugins/clipboard/datatransfer.js

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,70 @@ bender.test( {
383383
assert.areSame( 2, dataTransfer.getFilesCount() );
384384
assert.areSame( 'foo', dataTransfer.getFile( 0 ) );
385385
assert.areSame( 'bar', dataTransfer.getFile( 1 ) );
386+
assert.isUndefined( dataTransfer.getFile( 2 ) );
387+
},
388+
389+
// #12961
390+
'test file in items': function() {
391+
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
392+
assert.ignore();
393+
}
394+
395+
var nativeData = bender.tools.mockNativeDataTransfer(),
396+
dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer( nativeData ),
397+
file = { type: 'type' };
398+
399+
nativeData.items = [ {
400+
getAsFile: function() {
401+
return file;
402+
}
403+
} ];
404+
405+
assert.areSame( 1, dataTransfer.getFilesCount() );
406+
assert.areSame( file, dataTransfer.getFile( 0 ) );
407+
assert.isUndefined( dataTransfer.getFile( 1 ) );
408+
},
409+
410+
// #12961
411+
'test file in items with error': function() {
412+
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
413+
assert.ignore();
414+
}
415+
416+
var nativeData = bender.tools.mockNativeDataTransfer(),
417+
dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer( nativeData );
418+
419+
nativeData.items = [ {
420+
getAsFile: function() {
421+
return {}; // no 'type', so not file.
422+
}
423+
} ];
424+
425+
assert.areSame( 0, dataTransfer.getFilesCount() );
426+
assert.isUndefined( dataTransfer.getFile( 0 ) );
427+
},
428+
429+
// #12961
430+
'test file in items and files': function() {
431+
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
432+
assert.ignore();
433+
}
434+
435+
var nativeData = bender.tools.mockNativeDataTransfer(),
436+
dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer( nativeData ),
437+
file = { type: 'type' };
438+
439+
nativeData.items = [ {
440+
getAsFile: function() {
441+
return file;
442+
}
443+
} ];
444+
445+
nativeData.files.push( 'foo' );
446+
447+
assert.areSame( 1, dataTransfer.getFilesCount() );
448+
assert.areSame( 'foo', dataTransfer.getFile( 0 ) );
449+
assert.isUndefined( dataTransfer.getFile( 1 ) );
386450
},
387451

388452
'test files with cache': function() {
@@ -411,6 +475,62 @@ bender.test( {
411475
assert.isFalse( !!dataTransfer.getFile( 2 ) );
412476
},
413477

478+
// #12961
479+
'test file in items with cache': function() {
480+
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
481+
assert.ignore();
482+
}
483+
484+
var nativeData = bender.tools.mockNativeDataTransfer(),
485+
dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer( nativeData ),
486+
file = { type: 'type' };
487+
488+
nativeData.items = [ {
489+
getAsFile: function() {
490+
return file;
491+
}
492+
} ];
493+
494+
dataTransfer.cacheData();
495+
496+
assert.areSame( 1, dataTransfer.getFilesCount() );
497+
assert.areSame( file, dataTransfer.getFile( 0 ) );
498+
assert.isUndefined( dataTransfer.getFile( 1 ) );
499+
500+
nativeData.files = [];
501+
nativeData.items = [];
502+
503+
assert.areSame( 1, dataTransfer.getFilesCount() );
504+
assert.areSame( file, dataTransfer.getFile( 0 ) );
505+
assert.isUndefined( dataTransfer.getFile( 1 ) );
506+
},
507+
508+
// #12961
509+
'test file in items and files with cache': function() {
510+
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) {
511+
assert.ignore();
512+
}
513+
514+
var nativeData = bender.tools.mockNativeDataTransfer(),
515+
dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer( nativeData ),
516+
file = { type: 'type' };
517+
518+
nativeData.items = [ {
519+
getAsFile: function() {
520+
return file;
521+
}
522+
} ];
523+
524+
nativeData.files.push( 'foo' );
525+
526+
// debugger;
527+
dataTransfer.cacheData();
528+
529+
assert.areSame( 1, dataTransfer.getFilesCount() );
530+
assert.areSame( 'foo', dataTransfer.getFile( 0 ) );
531+
assert.isUndefined( dataTransfer.getFile( 1 ) );
532+
},
533+
414534
'test isEmpty 1': function() {
415535
var dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer();
416536

tests/plugins/filetools/fileloader.js

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,21 @@
247247
assert.areSame( 'created', loader.status );
248248
},
249249

250+
'test constructor file, no filename in file': function() {
251+
var testFileWithoutName = bender.tools.getTestPngFile();
252+
testFileWithoutName.name = undefined;
253+
254+
var loader = new FileLoader( {}, testFileWithoutName );
255+
256+
assert.areSame( 'image.png', loader.fileName );
257+
assert.isNull( loader.data );
258+
assert.isObject( loader.file );
259+
assert.areSame( 82, loader.total );
260+
assert.areSame( 0, loader.loaded );
261+
assert.areSame( 0, loader.uploaded );
262+
assert.areSame( 'created', loader.status );
263+
},
264+
250265
'test load': function() {
251266
var loader = new FileLoader( editorMock, testFile ),
252267
observer = observeEvents( loader );
@@ -753,15 +768,18 @@
753768
createXMLHttpRequestMock( [ 'progress', update, 'load', update ] );
754769

755770
resumeAfter( loader, 'uploaded', function() {
756-
observer.assert( [
757-
'update[created,name.png,0/0/82,-,-,-]',
758-
'uploading[uploading,name.png,0/0/82,-,-,-]',
759-
'update[uploading,name.png,0/0/82,-,-,-]',
760-
'update[uploading,name.png,41/0/82,-,-,-]',
761-
'update[uploading,name.png,41/0/82,-,-,-]',
762-
'uploaded[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]',
763-
'update[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]',
764-
'update[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]' ] );
771+
// Wait for all update events.
772+
wait( function() {
773+
observer.assert( [
774+
'update[created,name.png,0/0/82,-,-,-]',
775+
'uploading[uploading,name.png,0/0/82,-,-,-]',
776+
'update[uploading,name.png,0/0/82,-,-,-]',
777+
'update[uploading,name.png,41/0/82,-,-,-]',
778+
'update[uploading,name.png,41/0/82,-,-,-]',
779+
'uploaded[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]',
780+
'update[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]',
781+
'update[uploaded,name2.png,82/0/82,-,-,http://url/name2.png]' ] );
782+
}, 5 );
765783
} );
766784

767785
loader.update();
@@ -827,6 +845,8 @@
827845
evt.cancel();
828846
} );
829847

848+
createXMLHttpRequestMock( [ 'progress', 'load' ] );
849+
830850
loader.upload( 'http:\/\/url\/' );
831851

832852
observer.assert( [] );

0 commit comments

Comments
 (0)