8
0

datatransfer.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. /**
  6. * @module clipboard/datatransfer
  7. */
  8. /**
  9. * Facade over the native [`DataTransfer`](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.
  10. */
  11. export default class DataTransfer {
  12. constructor( nativeDataTransfer ) {
  13. /**
  14. * The array of files created from the native `DataTransfer#files` or `DataTransfer#items`.
  15. *
  16. * @readonly
  17. * @member {Array.<File>} #files
  18. */
  19. this.files = getFiles( nativeDataTransfer );
  20. /**
  21. * The native DataTransfer object.
  22. *
  23. * @private
  24. * @member {DataTransfer} #_native
  25. */
  26. this._native = nativeDataTransfer;
  27. }
  28. /**
  29. * Returns an array of available native content types.
  30. *
  31. * @returns {Array.<String>}
  32. */
  33. get types() {
  34. return this._native.types;
  35. }
  36. /**
  37. * Gets data from the data transfer by its mime type.
  38. *
  39. * dataTransfer.getData( 'text/plain' );
  40. *
  41. * @param {String} type The mime type. E.g. `text/html` or `text/plain`.
  42. * @returns {String}
  43. */
  44. getData( type ) {
  45. return this._native.getData( type );
  46. }
  47. /**
  48. * Sets data in the data transfer.
  49. *
  50. * @param {String} type The mime type. E.g. `text/html` or `text/plain`.
  51. * @param {String} data
  52. */
  53. setData( type, data ) {
  54. this._native.setData( type, data );
  55. }
  56. }
  57. function getFiles( nativeDataTransfer ) {
  58. // DataTransfer.files and items are Array-like and might not have an iterable interface.
  59. const files = nativeDataTransfer.files ? Array.from( nativeDataTransfer.files ) : [];
  60. const items = nativeDataTransfer.items ? Array.from( nativeDataTransfer.items ) : [];
  61. if ( files.length ) {
  62. return files;
  63. }
  64. // Chrome have empty DataTransfer.files, but let get files through the items interface.
  65. return items
  66. .filter( item => item.kind === 'file' )
  67. .map( item => item.getAsFile() );
  68. }