8
0
Просмотр исходного кода

Merge tag 'v1.0.0-beta.1' into stable

Release: v1.0.0-beta.1.
Piotrek Koszuliński 7 лет назад
Родитель
Сommit
55a34424f3
61 измененных файлов с 112 добавлено и 2328 удалено
  1. 1 1
      packages/ckeditor5-upload/.eslintrc.js
  2. 15 11
      packages/ckeditor5-upload/.travis.yml
  3. 23 0
      packages/ckeditor5-upload/CHANGELOG.md
  4. 1 1
      packages/ckeditor5-upload/LICENSE.md
  5. 3 1
      packages/ckeditor5-upload/README.md
  6. 0 4
      packages/ckeditor5-upload/lang/contexts.json
  7. 0 14
      packages/ckeditor5-upload/lang/translations/da.po
  8. 0 14
      packages/ckeditor5-upload/lang/translations/de.po
  9. 0 14
      packages/ckeditor5-upload/lang/translations/el.po
  10. 0 14
      packages/ckeditor5-upload/lang/translations/en-au.po
  11. 0 14
      packages/ckeditor5-upload/lang/translations/en.po
  12. 0 14
      packages/ckeditor5-upload/lang/translations/eo.po
  13. 0 14
      packages/ckeditor5-upload/lang/translations/fi.po
  14. 0 14
      packages/ckeditor5-upload/lang/translations/fr.po
  15. 0 14
      packages/ckeditor5-upload/lang/translations/gl.po
  16. 0 14
      packages/ckeditor5-upload/lang/translations/hr.po
  17. 0 14
      packages/ckeditor5-upload/lang/translations/hu.po
  18. 0 14
      packages/ckeditor5-upload/lang/translations/it.po
  19. 0 14
      packages/ckeditor5-upload/lang/translations/ja.po
  20. 0 14
      packages/ckeditor5-upload/lang/translations/km.po
  21. 0 14
      packages/ckeditor5-upload/lang/translations/ku.po
  22. 0 14
      packages/ckeditor5-upload/lang/translations/nb.po
  23. 0 14
      packages/ckeditor5-upload/lang/translations/ne.po
  24. 0 14
      packages/ckeditor5-upload/lang/translations/pl.po
  25. 0 14
      packages/ckeditor5-upload/lang/translations/pt-br.po
  26. 0 14
      packages/ckeditor5-upload/lang/translations/pt.po
  27. 0 14
      packages/ckeditor5-upload/lang/translations/ro.po
  28. 0 14
      packages/ckeditor5-upload/lang/translations/sk.po
  29. 0 14
      packages/ckeditor5-upload/lang/translations/sv.po
  30. 0 14
      packages/ckeditor5-upload/lang/translations/tr.po
  31. 0 14
      packages/ckeditor5-upload/lang/translations/zh-cn.po
  32. 0 14
      packages/ckeditor5-upload/lang/translations/zh.po
  33. 18 18
      packages/ckeditor5-upload/package.json
  34. 4 1
      packages/ckeditor5-upload/src/filereader.js
  35. 33 33
      packages/ckeditor5-upload/src/filerepository.js
  36. 0 36
      packages/ckeditor5-upload/src/imageupload.js
  37. 0 68
      packages/ckeditor5-upload/src/imageuploadbutton.js
  38. 0 77
      packages/ckeditor5-upload/src/imageuploadcommand.js
  39. 0 210
      packages/ckeditor5-upload/src/imageuploadengine.js
  40. 0 142
      packages/ckeditor5-upload/src/imageuploadprogress.js
  41. 1 1
      packages/ckeditor5-upload/src/ui/filedialogbuttonview.js
  42. 0 67
      packages/ckeditor5-upload/src/utils.js
  43. 3 3
      packages/ckeditor5-upload/tests/_utils/mocks.js
  44. 1 1
      packages/ckeditor5-upload/tests/filereader.js
  45. 6 6
      packages/ckeditor5-upload/tests/filerepository.js
  46. 0 46
      packages/ckeditor5-upload/tests/imageupload.js
  47. 0 153
      packages/ckeditor5-upload/tests/imageuploadbutton.js
  48. 0 132
      packages/ckeditor5-upload/tests/imageuploadcommand.js
  49. 0 419
      packages/ckeditor5-upload/tests/imageuploadengine.js
  50. 0 197
      packages/ckeditor5-upload/tests/imageuploadprogress.js
  51. 0 2
      packages/ckeditor5-upload/tests/manual/imageplaceholder.html
  52. 0 21
      packages/ckeditor5-upload/tests/manual/imageplaceholder.js
  53. 0 3
      packages/ckeditor5-upload/tests/manual/imageplaceholder.md
  54. 0 17
      packages/ckeditor5-upload/tests/manual/imageupload.html
  55. 0 100
      packages/ckeditor5-upload/tests/manual/imageupload.js
  56. 0 15
      packages/ckeditor5-upload/tests/manual/imageupload.md
  57. BIN
      packages/ckeditor5-upload/tests/manual/sample.jpg
  58. 3 1
      packages/ckeditor5-upload/tests/ui/filedialogbuttonview.js
  59. 0 111
      packages/ckeditor5-upload/tests/utils.js
  60. 0 1
      packages/ckeditor5-upload/theme/icons/image_placeholder.svg
  61. 0 65
      packages/ckeditor5-upload/theme/imageuploadprogress.scss

+ 1 - 1
packages/ckeditor5-upload/.eslintrc.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 15 - 11
packages/ckeditor5-upload/.travis.yml

@@ -1,24 +1,28 @@
 sudo: required
 dist: trusty
 addons:
+  firefox: "latest"
   apt:
     sources:
-      - google-chrome
+    - google-chrome
     packages:
-      - google-chrome-stable
+    - google-chrome-stable
 language: node_js
 node_js:
-  - "6"
+- '6'
 cache:
-  - node_modules
+- node_modules
 before_install:
-  - export DISPLAY=:99.0
-  - sh -e /etc/init.d/xvfb start
+- export DISPLAY=:99.0
+- sh -e /etc/init.d/xvfb start
 install:
-  - npm install @ckeditor/ckeditor5-dev-tests
-  - ckeditor5-dev-tests-install-dependencies
+- npm install @ckeditor/ckeditor5-dev-tests
+- ckeditor5-dev-tests-install-dependencies
 script:
-  - ckeditor5-dev-tests-travis
+- ckeditor5-dev-tests-travis
 after_success:
-  - codeclimate-test-reporter < coverage/lcov.info
-  - ckeditor5-dev-tests-save-revision
+- ckeditor5-dev-tests-save-revision
+env:
+  global:
+  - secure: HizBdevylmgI43/92y9+RDj5ScQBxLlLnOE/OPtHWXx4W375BH+oY1YN7kNGocSRMTughIpfUEh9yRvLts6QrEGggdsHhWadpnQiyxDC13/cLGgLsAekCNn7Cem4phAu1akSnEI9j6jmoQSWamE1RIOsq6AzR0zXrPTiVmwTh+xk9AR0oKhbt70GKFqPg1rFRDdKSH6XJ9C6XzOHoj31IetTpGgCGG1pY4VXDfmZf85ecDsv0jsq1KDIxU7y0R0Lv9GhXpFU31BMl8uk42SPEijDmjE4OXkbqJ5cGc4ZmLXyal2pxgHxURX6KQwzw6m3Qx3DkvhBbyOPsElXlw5hAYurPafHflXQLfY60UqI+GUau9BtNmgfHy0Vg05xyny5sBxQpz6JAIn/sarY3ejASFe/ni1yT+S+V92prOm/2X39WYmMAJnhiYl/WpV2yFkw4Nfga149C/Ln2HoWzFAa424AHOuaOeyL8t1Hg0HrsNJiXZbgfAB7NRlHdjJ2CHeOrW2cHVMU4odcVdvkCxp5d8MnZccLVEvjiQi0/iXc0nLb5hqMjZL5dPukW3fPRxU4FJU86QdO085fREOPHt/lSFyYI7ZTPVvwhCp47W/xWWPCsldHz3Mj+M1YirKy8bBNSyLGTuzHXE0jo0ohWRx1KljZgvfg9gHE5uoqjEwODD4=
+  - secure: JQLz5nAzj+dtA+wdlUM74AnQHCxqzV4dQTmVv/9YnfVIfD6iV3yFYgE/98u7y5w3Bw14Ou0aU6XmqsKBaNyzZapftYSu7DGSrHtIWlzCJM1iqwtLedwE0cq4yEi17cv6F7SXdRpDao/SQsGkU4U+1jXMDnEnvkIGrDZhfRxGApCeV7sF7WMwSk1SHpylQx2Byl/Lbw0NQTfMl1KLOfrSw5gH6GLQq7LXZhD9lemlL9C1olxAnoTUfw2pY5vkotVc/cTUrqt9pS5XYD9ghEVRkYfG3VjAkpIzjnlFP4jpK0ZfhtT1HyYMngH5X6dtzMQWMjDXO+PKnqwNr5EVG2iXO9afSFdp4K2NcKuUNhsYNHO0hCPT4PmVwW+zmu3IvJ2t+GZbAaFyv50rfKsahOiqnZJGsmRJT9KZ6c2spARFC09TFDM0L/fZkf3Kjaa9sG66Ddxr+sIoQGEYQW9+g7dL3dUWaUlVmSJPGbXGXlQ86oEb5Hm5hRzga8RtNeI9mjU2+LfhRZEz9xd91avDhFYWjDKRSBf22UEkOu8/dDKYvKQ0y1qek/54TQ6hpj1w+66YGsORNNXQ+mUT6tlxKsDTTUN8VzMWoqKwnR8FyIdQLDikX59u7YK9cY0x965mrgBCDRQbZzclSblY9iCd22dUoNmcmZuzfpCluuTtqNkEU5U=

+ 23 - 0
packages/ckeditor5-upload/CHANGELOG.md

@@ -1,6 +1,29 @@
 Changelog
 =========
 
+## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15)
+
+### Bug fixes
+
+* Fixed incorrect `ImageUploadButton` and `ImageUploadCommand` binding. Closes [#77](https://github.com/ckeditor/ckeditor5-upload/issues/77). Closes https://github.com/ckeditor/ckeditor5-ui/issues/357. ([d231ea6](https://github.com/ckeditor/ckeditor5-upload/commit/d231ea6))
+
+### Other changes
+
+* Migrated package styles to PostCSS. Moved visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([faf6100](https://github.com/ckeditor/ckeditor5-upload/commit/faf6100))
+* Moved the image upload plugins to the `@ckeditor/ckeditor5-image` package. Minor cleanup in the API. Closes [#22](https://github.com/ckeditor/ckeditor5-upload/issues/22). ([55697a9](https://github.com/ckeditor/ckeditor5-upload/commit/55697a9))
+* Use post-fixer API. ([08e9d09](https://github.com/ckeditor/ckeditor5-upload/commit/08e9d09))
+
+### BREAKING CHANGES
+
+* Renamed `Adapter` to `UploadAdapter`.
+* Removed `ImageUpload` plugin. It can be no found in ckeditor5-image repository.
+* Removed `ImageUploadEngine` plugin. It can be no found in ckeditor5-image repository.
+* Removed `ImageUploadProgress` plugin. It can be no found in ckeditor5-image repository.
+* Removed `ImageUploadButton` plugin. It can be no found in ckeditor5-image repository.
+* Renamed `FileRepository#createAdapter()` to `FileRepository#createUploadAdapter()`.
+* Renamed `filerepository-no-adapter` error to `filerepository-no-upload-adapter`.
+
+
 ## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14)
 
 ### Bug fixes

+ 1 - 1
packages/ckeditor5-upload/LICENSE.md

@@ -2,7 +2,7 @@ Software License Agreement
 ==========================
 
 **CKEditor 5 Upload Feature** – https://github.com/ckeditor/ckeditor5-upload <br>
-Copyright (c) 2003-2017, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2018, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
 
 Licensed under the terms of any of the following licenses at your choice:
 

+ 3 - 1
packages/ckeditor5-upload/README.md

@@ -4,7 +4,9 @@ CKEditor 5 file upload utilities
 [![Join the chat at https://gitter.im/ckeditor/ckeditor5](https://badges.gitter.im/ckeditor/ckeditor5.svg)](https://gitter.im/ckeditor/ckeditor5?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 [![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-upload.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload)
 [![Build Status](https://travis-ci.org/ckeditor/ckeditor5-upload.svg)](https://travis-ci.org/ckeditor/ckeditor5-upload)
-[![Test Coverage](https://codeclimate.com/github/ckeditor/ckeditor5-upload/badges/coverage.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-upload/coverage)
+[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=d3hvenZqQVZERFQ5d09FWXdyT0ozVXhLaVltRFRjTTUyZGpvQWNmWVhUUT0tLUZqNlJ1YWRUd0RvdEVOaEptM1B2Q0E9PQ==--c9d3dee40b9b4471ff3fb516d9ecf8d09292c7e0)](https://www.browserstack.com/automate/public-build/d3hvenZqQVZERFQ5d09FWXdyT0ozVXhLaVltRFRjTTUyZGpvQWNmWVhUUT0tLUZqNlJ1YWRUd0RvdEVOaEptM1B2Q0E9PQ==--c9d3dee40b9b4471ff3fb516d9ecf8d09292c7e0)
+[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5-upload/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5-upload?branch=master)
+<br>
 [![Dependency Status](https://david-dm.org/ckeditor/ckeditor5-upload/status.svg)](https://david-dm.org/ckeditor/ckeditor5-upload)
 [![devDependency Status](https://david-dm.org/ckeditor/ckeditor5-upload/dev-status.svg)](https://david-dm.org/ckeditor/ckeditor5-upload?type=dev)
 

+ 0 - 4
packages/ckeditor5-upload/lang/contexts.json

@@ -1,4 +0,0 @@
-{
-	"Insert image": "Label for the insert image toolbar button.",
-	"Upload failed": "Title of the notification displayed when upload fails."
-}

+ 0 - 14
packages/ckeditor5-upload/lang/translations/da.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: da\n"
-"Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Indsæt billede"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/de.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: de\n"
-"Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Bild einfügen"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/el.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: el\n"
-"Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Εισαγωγή εικόνας"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/en-au.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: en_AU\n"
-"Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Insert image"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Upload failed"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/en.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: \n"
-"Language-Team: \n"
-"Plural-Forms: \n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Insert image"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Upload failed"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/eo.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: eo\n"
-"Language-Team: Esperanto (https://www.transifex.com/ckeditor/teams/11143/eo/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Enmetu bildon"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/fi.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: fi\n"
-"Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Lisää kuva"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Lataus epäonnistui"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/fr.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: fr\n"
-"Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Insérer une image"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Échec de l'envoi"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/gl.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: gl\n"
-"Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Inserir imaxe"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Fallou o envío"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/hr.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: hr\n"
-"Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Umetni sliku"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Slanje nije uspjelo"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/hu.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: hu\n"
-"Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Kép beszúrása"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "A feltöltés nem sikerült"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/it.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: it\n"
-"Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Inserisci immagine"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Caricamento fallito"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/ja.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: ja\n"
-"Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "画像挿入"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "アップロード失敗"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/km.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: km\n"
-"Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "បញ្ចូល​រូបភាព"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "អាប់ឡូត​មិនបាន"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/ku.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: ku\n"
-"Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "وێنە دابنێ"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "بارکردنەکە سەرنەکەووت"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/nb.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: nb\n"
-"Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Sett inn bilde"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Opplasting feilet"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/ne.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: ne_NP\n"
-"Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "तस्वीर सम्मिलित गर्नुहोस्"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/pl.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: pl\n"
-"Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n"
-"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Wstaw obraz"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/pt-br.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: pt_BR\n"
-"Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Inserir imagem"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/pt.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: pt\n"
-"Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Inserir imagem"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Falha ao carregar"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/ro.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: ro\n"
-"Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n"
-"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Inserează imagine"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Încărcare eșuată"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/sk.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: sk\n"
-"Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Vložiť obrázok"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "Nahrávanie zlyhalo"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/sv.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: sv\n"
-"Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Infoga bild"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/tr.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: tr\n"
-"Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "Görsel Ekle"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr ""

+ 0 - 14
packages/ckeditor5-upload/lang/translations/zh-cn.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: zh_CN\n"
-"Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "插入图像"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "上传失败"

+ 0 - 14
packages/ckeditor5-upload/lang/translations/zh.po

@@ -1,14 +0,0 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-msgid ""
-msgstr ""
-"Language: zh_TW\n"
-"Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "Label for the insert image toolbar button."
-msgid "Insert image"
-msgstr "插入圖片"
-
-msgctxt "Title of the notification displayed when upload fails."
-msgid "Upload failed"
-msgstr "上傳失敗"

+ 18 - 18
packages/ckeditor5-upload/package.json

@@ -1,32 +1,32 @@
 {
   "name": "@ckeditor/ckeditor5-upload",
-  "version": "1.0.0-alpha.2",
+  "version": "1.0.0-beta.1",
   "description": "Upload Feature for CKEditor 5.",
   "keywords": [
     "ckeditor5",
     "ckeditor5-lib"
   ],
   "dependencies": {
-    "@ckeditor/ckeditor5-core": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-engine": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-ui": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-utils": "^1.0.0-alpha.2"
+    "@ckeditor/ckeditor5-core": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-engine": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-ui": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-utils": "^1.0.0-beta.1"
   },
   "devDependencies": {
-    "@ckeditor/ckeditor5-basic-styles": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-clipboard": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-editor-classic": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-enter": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-heading": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-image": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-list": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-paragraph": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-typing": "^1.0.0-alpha.2",
-    "@ckeditor/ckeditor5-undo": "^1.0.0-alpha.2",
-    "eslint": "^4.8.0",
-    "eslint-config-ckeditor5": "^1.0.6",
+    "@ckeditor/ckeditor5-basic-styles": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-clipboard": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-editor-classic": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-enter": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-heading": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-image": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-list": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-paragraph": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-typing": "^1.0.0-beta.1",
+    "@ckeditor/ckeditor5-undo": "^1.0.0-beta.1",
+    "eslint": "^4.15.0",
+    "eslint-config-ckeditor5": "^1.0.7",
     "husky": "^0.14.3",
-    "lint-staged": "^4.2.3"
+    "lint-staged": "^6.0.0"
   },
   "engines": {
     "node": ">=6.0.0",

+ 4 - 1
packages/ckeditor5-upload/src/filereader.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -16,6 +16,9 @@ import mix from '@ckeditor/ckeditor5-utils/src/mix';
  * FileReader class - wrapper over native FileReader.
  */
 export default class FileReader {
+	/**
+	 * Creates an instance of the FileReader.
+	 */
 	constructor() {
 		const reader = new window.FileReader();
 

+ 33 - 33
packages/ckeditor5-upload/src/filerepository.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -26,8 +26,8 @@ import uid from '@ckeditor/ckeditor5-utils/src/uid.js';
  * (sending the file and handling server's response). You can use one of the existing plugins introducing upload adapters
  * (e.g. {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter} or
  * {@link module:adapter-ckfinder/uploadadapter~CKFinderUploadAdapter}) or write your own one
- * (which boils down to setting the {@link ~FileRepository#createAdapter} factory function – see
- * {@link module:upload/filerepository~Adapter `Adapter` interface} documentation).
+ * (which boils down to setting the {@link ~FileRepository#createUploadAdapter} factory function – see
+ * {@link module:upload/filerepository~UploadAdapter `UploadAdapter` interface} documentation).
  *
  * Then, you can use {@link module:upload/filerepository~FileRepository#createLoader `createLoader()`} and the returned
  * {@link module:upload/filerepository~FileLoader} instance to load and upload files.
@@ -56,13 +56,13 @@ export default class FileRepository extends Plugin {
 		/**
 		 * A factory function which should be defined before using `FileRepository`.
 		 *
-		 * It should return a new instance of {@link module:upload/filerepository~Adapter} that will be used to upload files.
+		 * It should return a new instance of {@link module:upload/filerepository~UploadAdapter} that will be used to upload files.
 		 * {@link module:upload/filerepository~FileLoader} instance associated with the adapter
 		 * will be passed to that function.
 		 *
-		 * For more information and example see {@link module:upload/filerepository~Adapter}.
+		 * For more information and example see {@link module:upload/filerepository~UploadAdapter}.
 		 *
-		 * @member {Function} #createAdapter
+		 * @member {Function} #createUploadAdapter
 		 */
 
 		/**
@@ -120,18 +120,18 @@ export default class FileRepository extends Plugin {
 	/**
 	 * Creates a loader instance for the given file.
 	 *
-	 * Requires {@link #createAdapter} factory to be defined.
+	 * Requires {@link #createUploadAdapter} factory to be defined.
 	 *
 	 * @param {File} file Native File object.
 	 * @returns {module:upload/filerepository~FileLoader|null}
 	 */
 	createLoader( file ) {
-		if ( !this.createAdapter ) {
+		if ( !this.createUploadAdapter ) {
 			/**
 			 * You need to enable an upload adapter in order to be able to upload files.
 			 *
 			 * This warning shows up when {@link module:upload/filerepository~FileRepository} is being used
-			 * without {@link #createAdapter definining an upload adapter}.
+			 * without {@link #createUploadAdapter definining an upload adapter}.
 			 *
 			 * **If you see this warning when using one of the {@glink builds/index CKEditor 5 Builds}**
 			 * it means that you did not configure any of the upload adapters available by default in those builds.
@@ -143,8 +143,8 @@ export default class FileRepository extends Plugin {
 			 * file upload integration.
 			 *
 			 * **If you see this warning when using a custom build** there is a chance that you enabled
-			 * a feature like {@link module:upload/imageupload~ImageUpload},
-			 * or {@link module:upload/imageuploadbutton~ImageUploadButton} but you did not enable any upload adapter.
+			 * a feature like {@link module:image/imageupload~ImageUpload},
+			 * or {@link module:image/imageupload/imageuploadui~ImageUploadUI} but you did not enable any upload adapter.
 			 * You can choose one of the existing upload adapters:
 			 *
 			 * * {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter}
@@ -153,17 +153,17 @@ export default class FileRepository extends Plugin {
 			 * (remember to {@link module:core/editor/editorconfig~EditorConfig#ckfinder configure it})
 			 *
 			 * You can also implement your own upload adapter (in which case, please refer
-			 * to the {@link ~Adapter `Adapter` interface} documentation).
+			 * to the {@link module:upload/filerepository~UploadAdapter `UploadAdapter` interface} documentation).
 			 *
-			 * @error filerepository-no-adapter
+			 * @error filerepository-no-upload-adapter
 			 */
-			log.error( 'filerepository-no-adapter: Upload adapter is not defined.' );
+			log.error( 'filerepository-no-upload-adapter: Upload adapter is not defined.' );
 
 			return null;
 		}
 
 		const loader = new FileLoader( file );
-		loader._adapter = this.createAdapter( loader );
+		loader._adapter = this.createUploadAdapter( loader );
 
 		this.loaders.add( loader );
 
@@ -218,7 +218,7 @@ class FileLoader {
 	 * Creates a new instance of `FileLoader`.
 	 *
 	 * @param {File} file A native file instance.
-	 * @param {module:upload/filerepository~Adapter} adapter
+	 * @param {module:upload/filerepository~UploadAdapter} adapter
 	 */
 	constructor( file, adapter ) {
 		/**
@@ -241,7 +241,7 @@ class FileLoader {
 		 * Adapter instance associated with this file loader.
 		 *
 		 * @private
-		 * @member {module:upload/filerepository~Adapter}
+		 * @member {module:upload/filerepository~UploadAdapter}
 		 */
 		this._adapter = adapter;
 
@@ -365,7 +365,7 @@ class FileLoader {
 	}
 
 	/**
-	 * Reads file using the provided {@link module:upload/filerepository~Adapter}.
+	 * Reads file using the provided {@link module:upload/filerepository~UploadAdapter}.
 	 *
 	 * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-upload-wrong-status` when status
 	 * is different than `idle`.
@@ -443,17 +443,17 @@ class FileLoader {
 mix( FileLoader, ObservableMixin );
 
 /**
- * Adapter interface used by FileRepository to handle file upload. Adapter is a bridge between the editor and server that
+ * Upload adapter interface used by FileRepository to handle file upload. Upload adapter is a bridge between the editor and server that
  * handles file uploads. It should contain logic necessary to initiate upload process and monitor its progress.
  *
  * It should implement two methods:
  *
- * * {@link module:upload/filerepository~Adapter#upload `upload()`},
- * * {@link module:upload/filerepository~Adapter#abort `abort()`}.
+ * * {@link module:upload/filerepository~UploadAdapter#upload `upload()`},
+ * * {@link module:upload/filerepository~UploadAdapter#abort `abort()`}.
  *
- * Example adapter implementation:
+ * Example upload adapter implementation:
  *
- *		class Adapter {
+ *		class UploadAdapter {
  *			constructor( loader ) {
  *				// Save Loader instance to update upload progress.
  *				this.loader = loader;
@@ -476,13 +476,13 @@ mix( FileLoader, ObservableMixin );
  *			}
  *		}
  *
- * Then adapter can be set to be used by {@link module:upload/filerepository~FileRepository FileRepository}:
+ * Then upload adapter can be set to be used by {@link module:upload/filerepository~FileRepository FileRepository}:
  *
- *		editor.plugins.get( 'FileRepository' ).createAdapter = function( loader ) {
- *			return new Adapter( loader );
+ *		editor.plugins.get( 'FileRepository' ).createUploadAdapter = function( loader ) {
+ *			return new UploadAdapter( loader );
  *		};
  *
- * @interface Adapter
+ * @interface UploadAdapter
  */
 
 /**
@@ -508,10 +508,10 @@ mix( FileLoader, ObservableMixin );
  * correctly set `width` attribute of the image. See this discussion:
  * https://github.com/ckeditor/ckeditor5-easy-image/issues/4 for more information.
  *
- * Take a look at {@link module:upload/filerepository~Adapter example Adapter implementation} and
- * {@link module:upload/filerepository~FileRepository#createAdapter createAdapter method}.
+ * Take a look at {@link module:upload/filerepository~UploadAdapter example Adapter implementation} and
+ * {@link module:upload/filerepository~FileRepository#createUploadAdapter createUploadAdapter method}.
  *
- * @method module:upload/filerepository~Adapter#upload
+ * @method module:upload/filerepository~UploadAdapter#upload
  * @returns {Promise} Promise that should be resolved when data is uploaded.
  */
 
@@ -519,8 +519,8 @@ mix( FileLoader, ObservableMixin );
  * Aborts the upload process.
  * After aborting it should reject promise returned from {@link #upload upload()}.
  *
- * Take a look at {@link module:upload/filerepository~Adapter example Adapter implementation} and
- * {@link module:upload/filerepository~FileRepository#createAdapter createAdapter method}.
+ * Take a look at {@link module:upload/filerepository~UploadAdapter example Adapter implementation} and
+ * {@link module:upload/filerepository~FileRepository#createUploadAdapter createUploadAdapter method}.
  *
- * @method module:upload/filerepository~Adapter#abort
+ * @method module:upload/filerepository~UploadAdapter#abort
  */

+ 0 - 36
packages/ckeditor5-upload/src/imageupload.js

@@ -1,36 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module upload/imageupload
- */
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import ImageUploadButton from './imageuploadbutton';
-import ImageUploadProgress from './imageuploadprogress';
-
-/**
- * Image upload plugin.
- * This plugin do not do anything directly, but loads set of specific plugins to enable image uploading:
- * * {@link module:upload/imageuploadbutton~ImageUploadButton},
- * * {@link module:upload/imageuploadprogress~ImageUploadProgress}.
- *
- * @extends module:core/plugin~Plugin
- */
-export default class ImageUpload extends Plugin {
-	/**
-	 * @inheritDoc
-	 */
-	static get pluginName() {
-		return 'ImageUpload';
-	}
-
-	/**
-	 * @inheritDoc
-	 */
-	static get requires() {
-		return [ ImageUploadButton, ImageUploadProgress ];
-	}
-}

+ 0 - 68
packages/ckeditor5-upload/src/imageuploadbutton.js

@@ -1,68 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module upload/imageuploadbutton
- */
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import ImageUploadEngine from './imageuploadengine';
-import FileDialogButtonView from './ui/filedialogbuttonview';
-import imageIcon from '@ckeditor/ckeditor5-core/theme/icons/image.svg';
-import { isImageType, findOptimalInsertionPosition } from './utils';
-
-/**
- * Image upload button plugin.
- * Adds `insertImage` button to UI component factory.
- *
- * @extends module:core/plugin~Plugin
- */
-export default class ImageUploadButton extends Plugin {
-	/**
-	 * @inheritDoc
-	 */
-	static get requires() {
-		return [ ImageUploadEngine ];
-	}
-
-	/**
-	 * @inheritDoc
-	 */
-	init() {
-		const editor = this.editor;
-		const t = editor.t;
-
-		// Setup `insertImage` button.
-		editor.ui.componentFactory.add( 'insertImage', locale => {
-			const view = new FileDialogButtonView( locale );
-			const command = editor.commands.get( 'imageUpload' );
-
-			view.set( {
-				acceptedType: 'image/*',
-				allowMultipleFiles: true
-			} );
-
-			view.buttonView.set( {
-				label: t( 'Insert image' ),
-				icon: imageIcon,
-				tooltip: true
-			} );
-
-			view.bind( 'isEnabled' ).to( command );
-
-			view.on( 'done', ( evt, files ) => {
-				for ( const file of Array.from( files ) ) {
-					const insertAt = findOptimalInsertionPosition( editor.document.selection );
-
-					if ( isImageType( file ) ) {
-						editor.execute( 'imageUpload', { file, insertAt } );
-					}
-				}
-			} );
-
-			return view;
-		} );
-	}
-}

+ 0 - 77
packages/ckeditor5-upload/src/imageuploadcommand.js

@@ -1,77 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
-import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
-import ModelSelection from '@ckeditor/ckeditor5-engine/src/model/selection';
-import FileRepository from './filerepository';
-import Command from '@ckeditor/ckeditor5-core/src/command';
-
-/**
- * @module upload/imageuploadcommand
- */
-
-/**
- * Image upload command.
- *
- * @extends module:core/command~Command
- */
-export default class ImageUploadCommand extends Command {
-	/**
-	 * Executes the command.
-	 *
-	 * @fires execute
-	 * @param {Object} options Options for executed command.
-	 * @param {File} options.file Image file to upload.
-	 * @param {module:engine/model/position~Position} [options.insertAt] Position at which the image should be inserted.
-	 * If the position is not specified the image will be inserted into the current selection.
-	 * Note: You can use the {@link module:upload/utils~findOptimalInsertionPosition} function to calculate
-	 * (e.g. based on the current selection) a position which is more optimal from UX perspective.
-	 * @param {module:engine/model/batch~Batch} [options.batch] Batch to collect all the change steps.
-	 * New batch will be created if this option is not set.
-	 */
-	execute( options ) {
-		const editor = this.editor;
-		const doc = editor.document;
-		const batch = options.batch || doc.batch();
-		const file = options.file;
-		const selection = doc.selection;
-		const fileRepository = editor.plugins.get( FileRepository );
-
-		doc.enqueueChanges( () => {
-			const loader = fileRepository.createLoader( file );
-
-			// Do not throw when upload adapter is not set. FileRepository will log an error anyway.
-			if ( !loader ) {
-				return;
-			}
-
-			const imageElement = new ModelElement( 'image', {
-				uploadId: loader.id
-			} );
-
-			let insertAtSelection;
-
-			if ( options.insertAt ) {
-				insertAtSelection = new ModelSelection( [ new ModelRange( options.insertAt ) ] );
-			} else {
-				insertAtSelection = doc.selection;
-			}
-
-			editor.data.insertContent( imageElement, insertAtSelection, batch );
-
-			// Inserting an image might've failed due to schema regulations.
-			if ( imageElement.parent ) {
-				selection.setRanges( [ ModelRange.createOn( imageElement ) ] );
-			}
-		} );
-	}
-}
-
-// Returns correct image insertion position.
-//
-// @param {module:engine/model/document~Document} doc
-// @returns {module:engine/model/position~Position|undefined}
-

+ 0 - 210
packages/ckeditor5-upload/src/imageuploadengine.js

@@ -1,210 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module upload/imageuploadengine
- */
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import FileRepository from './filerepository';
-import ImageUploadCommand from './imageuploadcommand';
-import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
-import ModelSelection from '@ckeditor/ckeditor5-engine/src/model/selection';
-import { isImageType, findOptimalInsertionPosition } from './utils';
-
-/**
- * Image upload engine plugin.
- *
- * @extends module:core/plugin~Plugin
- */
-export default class ImageUploadEngine extends Plugin {
-	/**
-	 * @inheritDoc
-	 */
-	static get requires() {
-		return [ FileRepository, Notification ];
-	}
-
-	/**
-	 * @inheritDoc
-	 */
-	init() {
-		const editor = this.editor;
-		const doc = editor.document;
-		const schema = doc.schema;
-		const fileRepository = editor.plugins.get( FileRepository );
-
-		// Setup schema to allow uploadId for images.
-		schema.allow( { name: 'image', attributes: [ 'uploadId' ], inside: '$root' } );
-		schema.allow( { name: 'image', attributes: [ 'uploadStatus' ], inside: '$root' } );
-		schema.requireAttributes( 'image', [ 'uploadId' ] );
-
-		// Register imageUpload command.
-		editor.commands.add( 'imageUpload', new ImageUploadCommand( editor ) );
-
-		// Execute imageUpload command when image is dropped or pasted.
-		editor.editing.view.on( 'clipboardInput', ( evt, data ) => {
-			// Skip if non empty HTML data is included.
-			// https://github.com/ckeditor/ckeditor5-upload/issues/68
-			if ( isHtmlIncluded( data.dataTransfer ) ) {
-				return;
-			}
-
-			let targetModelSelection = new ModelSelection(
-				data.targetRanges.map( viewRange => editor.editing.mapper.toModelRange( viewRange ) )
-			);
-
-			for ( const file of data.dataTransfer.files ) {
-				const insertAt = findOptimalInsertionPosition( targetModelSelection );
-
-				if ( isImageType( file ) ) {
-					editor.execute( 'imageUpload', { file, insertAt } );
-					evt.stop();
-				}
-
-				// Use target ranges only for the first image. Then, use that image position
-				// so we keep adding the next ones after the previous one.
-				targetModelSelection = doc.selection;
-			}
-		} );
-
-		// Prevents from browser redirecting to the dropped image.
-		editor.editing.view.on( 'dragover', ( evt, data ) => {
-			data.preventDefault();
-		} );
-
-		doc.on( 'change', ( evt, type, data ) => {
-			// Listen on document changes and:
-			// * start upload process when image with `uploadId` attribute is inserted,
-			// * abort upload process when image `uploadId` attribute is removed.
-			if ( type === 'insert' || type === 'reinsert' || type === 'remove' ) {
-				for ( const value of data.range ) {
-					if ( value.type === 'elementStart' && value.item.name === 'image' ) {
-						const imageElement = value.item;
-						const uploadId = imageElement.getAttribute( 'uploadId' );
-
-						if ( uploadId ) {
-							const loader = fileRepository.loaders.get( uploadId );
-
-							if ( loader ) {
-								if ( type === 'insert' && loader.status == 'idle' ) {
-									this.load( loader, imageElement );
-								}
-
-								if ( type === 'remove' ) {
-									loader.abort();
-								}
-							}
-						}
-					}
-				}
-			}
-		} );
-	}
-
-	/**
-	 * Performs image loading. Image is read from the disk and temporary data is displayed, after uploading process
-	 * is complete we replace temporary data with target image from the server.
-	 *
-	 * @protected
-	 * @param {module:upload/filerepository~FileLoader} loader
-	 * @param {module:engine/model/element~Element} imageElement
-	 */
-	load( loader, imageElement ) {
-		const editor = this.editor;
-		const t = editor.locale.t;
-		const doc = editor.document;
-		const fileRepository = editor.plugins.get( FileRepository );
-		const notification = editor.plugins.get( Notification );
-
-		doc.enqueueChanges( () => {
-			doc.batch( 'transparent' ).setAttribute( imageElement, 'uploadStatus', 'reading' );
-		} );
-
-		loader.read()
-			.then( data => {
-				const viewFigure = editor.editing.mapper.toViewElement( imageElement );
-				const viewImg = viewFigure.getChild( 0 );
-				const promise = loader.upload();
-
-				viewImg.setAttribute( 'src', data );
-				editor.editing.view.render();
-
-				doc.enqueueChanges( () => {
-					doc.batch( 'transparent' ).setAttribute( imageElement, 'uploadStatus', 'uploading' );
-				} );
-
-				return promise;
-			} )
-			.then( data => {
-				doc.enqueueChanges( () => {
-					doc.batch( 'transparent' ).setAttribute( imageElement, 'uploadStatus', 'complete' );
-					doc.batch( 'transparent' ).setAttribute( imageElement, 'src', data.default );
-
-					// Srcset attribute for responsive images support.
-					let maxWidth = 0;
-					const srcsetAttribute = Object.keys( data )
-						// Filter out keys that are not integers.
-						.filter( key => {
-							const width = parseInt( key, 10 );
-
-							if ( !isNaN( width ) ) {
-								maxWidth = Math.max( maxWidth, width );
-
-								return true;
-							}
-						} )
-
-						// Convert each key to srcset entry.
-						.map( key => `${ data[ key ] } ${ key }w` )
-
-						// Join all entries.
-						.join( ', ' );
-
-					if ( srcsetAttribute != '' ) {
-						doc.batch( 'transparent' ).setAttribute( imageElement, 'srcset', {
-							data: srcsetAttribute,
-							width: maxWidth
-						} );
-					}
-				} );
-
-				clean();
-			} )
-			.catch( msg => {
-				// Might be 'aborted'.
-				if ( loader.status == 'error' ) {
-					notification.showWarning( msg, {
-						title: t( 'Upload failed' ),
-						namespace: 'upload'
-					} );
-				}
-
-				clean();
-
-				// Permanently remove image from insertion batch.
-				doc.enqueueChanges( () => {
-					doc.batch( 'transparent' ).remove( imageElement );
-				} );
-			} );
-
-		function clean() {
-			doc.enqueueChanges( () => {
-				doc.batch( 'transparent' ).removeAttribute( imageElement, 'uploadId' );
-				doc.batch( 'transparent' ).removeAttribute( imageElement, 'uploadStatus' );
-			} );
-
-			fileRepository.destroyLoader( loader );
-		}
-	}
-}
-
-// Returns true if non-empty `text/html` is included in data transfer.
-//
-// @param {module:clipboard/datatransfer~DataTransfer} dataTransfer
-// @returns {Boolean}
-export function isHtmlIncluded( dataTransfer ) {
-	return Array.from( dataTransfer.types ).includes( 'text/html' ) && dataTransfer.getData( 'text/html' ) !== '';
-}

+ 0 - 142
packages/ckeditor5-upload/src/imageuploadprogress.js

@@ -1,142 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module upload/imageuploadprogress
- */
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import { eventNameToConsumableType } from '@ckeditor/ckeditor5-engine/src/conversion/model-to-view-converters';
-import FileRepository from './filerepository';
-import uploadingPlaceholder from '../theme/icons/image_placeholder.svg';
-import UIElement from '@ckeditor/ckeditor5-engine/src/view/uielement';
-import ImageUploadEngine from './imageuploadengine';
-
-import '../theme/imageuploadprogress.scss';
-
-/**
- * Image upload progress plugin.
- * Shows placeholder when image is read from disk and progress bar while image is uploading.
- *
- * @extends module:core/plugin~Plugin
- */
-export default class ImageUploadProgress extends Plugin {
-	/**
-	 * @inheritDoc
-	 */
-	static get requires() {
-		return [ ImageUploadEngine ];
-	}
-
-	constructor( editor ) {
-		super( editor );
-
-		/**
-		 * Image's placeholder that is displayed before real image data can be accessed.
-		 *
-		 * @protected
-		 * @member {String} #placeholder
-		 */
-		this.placeholder = 'data:image/svg+xml;utf8,' + encodeURIComponent( uploadingPlaceholder );
-	}
-
-	init() {
-		const editor = this.editor;
-
-		// Upload status change - update image's view according to that status.
-		editor.editing.modelToView.on( 'addAttribute:uploadStatus:image', ( ...args ) => this.uploadStatusChange( ...args ) );
-		editor.editing.modelToView.on( 'changeAttribute:uploadStatus:image', ( ...args ) => this.uploadStatusChange( ...args ) );
-	}
-
-	/**
-	 * This ethod is called each time image's `uploadStatus` attribute is changed.
-	 *
-	 * @param {module:utils/eventinfo~EventInfo} evt Object containing information about the fired event.
-	 * @param {Object} data Additional information about the change.
-	 * @param {module:engine/conversion/modelconsumable~ModelConsumable} consumable Values to consume.
-	 */
-	uploadStatusChange( evt, data, consumable ) {
-		const editor = this.editor;
-		const modelImage = data.item;
-		const uploadId = modelImage.getAttribute( 'uploadId' );
-
-		if ( !consumable.consume( data.item, eventNameToConsumableType( evt.name ) ) || !uploadId ) {
-			return;
-		}
-
-		const fileRepository = editor.plugins.get( FileRepository );
-		const placeholder = this.placeholder;
-		const status = data.attributeNewValue;
-		const viewFigure = editor.editing.mapper.toViewElement( modelImage );
-
-		// Show placeholder with infinite progress bar on the top while image is read from disk.
-		if ( status == 'reading' ) {
-			viewFigure.addClass( 'ck-appear', 'ck-infinite-progress', 'ck-image-upload-placeholder' );
-			const viewImg = viewFigure.getChild( 0 );
-			viewImg.setAttribute( 'src', placeholder );
-
-			return;
-		}
-
-		// Show progress bar on the top of the image when image is uploading.
-		if ( status == 'uploading' ) {
-			const loader = fileRepository.loaders.get( uploadId );
-
-			if ( loader ) {
-				const progressBar = createProgressBar();
-
-				viewFigure.removeClass( 'ck-infinite-progress', 'ck-image-upload-placeholder' );
-				viewFigure.appendChildren( progressBar );
-
-				// Update progress bar width when uploadedPercent is changed.
-				loader.on( 'change:uploadedPercent', ( evt, name, value ) => {
-					progressBar.setStyle( 'width', value + '%' );
-					editor.editing.view.render();
-				} );
-			}
-
-			return;
-		}
-
-		// Hide progress bar and clean up classes.
-		const progressBar = getProgressBar( viewFigure );
-
-		if ( progressBar ) {
-			progressBar.remove();
-		} else {
-			viewFigure.removeClass( 'ck-infinite-progress' );
-		}
-
-		viewFigure.removeClass( 'ck-appear', 'ck-image-upload-placeholder' );
-	}
-}
-
-// Symbol added to progress bar UIElement to distinguish it from other elements.
-const progressBarSymbol = Symbol( 'progress-bar' );
-
-// Create progress bar element using {@link module:engine/view/uielement~UIElement}.
-//
-// @private
-// @returns {module:engine/view/uielement~UIElement}
-function createProgressBar() {
-	const progressBar = new UIElement( 'div', { class: 'ck-progress-bar' } );
-	progressBar.setCustomProperty( progressBarSymbol, true );
-
-	return progressBar;
-}
-
-// Returns progress bar {@link module:engine/view/uielement~UIElement} from image figure element. Returns `undefined` if
-// progress bar element is not found.
-//
-// @private
-// @param {module:engine/view/element~Element} imageFigure
-// @returns {module:engine/view/uielement~UIElement|undefined}
-function getProgressBar( imageFigure ) {
-	for ( const child of imageFigure.getChildren() ) {
-		if ( child.getCustomProperty( progressBarSymbol ) ) {
-			return child;
-		}
-	}
-}

+ 1 - 1
packages/ckeditor5-upload/src/ui/filedialogbuttonview.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 0 - 67
packages/ckeditor5-upload/src/utils.js

@@ -1,67 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module upload/utils
- */
-
-import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
-
-/**
- * Checks if given file is an image.
- *
- * @param {File} file
- * @returns {Boolean}
- */
-export function isImageType( file ) {
-	const types = /^image\/(jpeg|png|gif|bmp)$/;
-
-	return types.test( file.type );
-}
-
-/**
- * Returns a model position which is optimal (in terms of UX) for inserting an image.
- *
- * For instance, if a selection is in a middle of a paragraph, position before this paragraph
- * will be returned, so that it's not split. If the selection is at the end of a paragraph,
- * position after this paragraph will be returned.
- *
- * Note: If selection is placed in an empty block, that block will be returned. If that position
- * is then passed to {@link module:engine/controller/datacontroller~DataController#insertContent}
- * that block will be fully replaced by the image.
- *
- * @param {module:engine/model/selection~Selection} selection Selection based on which the
- * insertion position should be calculated.
- * @returns {module:engine/model/position~Position} The optimal position.
- */
-export function findOptimalInsertionPosition( selection ) {
-	const selectedElement = selection.getSelectedElement();
-
-	if ( selectedElement ) {
-		return ModelPosition.createAfter( selectedElement );
-	}
-
-	const firstBlock = selection.getSelectedBlocks().next().value;
-
-	if ( firstBlock ) {
-		// If inserting into an empty block – return position in that block. It will get
-		// replaced with the image by insertContent(). #42.
-		if ( firstBlock.isEmpty ) {
-			return ModelPosition.createAt( firstBlock );
-		}
-
-		const positionAfter = ModelPosition.createAfter( firstBlock );
-
-		// If selection is at the end of the block - return position after the block.
-		if ( selection.focus.isTouching( positionAfter ) ) {
-			return positionAfter;
-		}
-
-		// Otherwise return position before the block.
-		return ModelPosition.createBefore( firstBlock );
-	}
-
-	return selection.focus;
-}

+ 3 - 3
packages/ckeditor5-upload/tests/_utils/mocks.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -17,7 +17,7 @@ export const createNativeFileMock = () => ( {
  * AdapterMock class.
  * Simulates adapter behaviour without any server-side communications.
  */
-export class AdapterMock {
+export class UploadAdapterMock {
 	constructor( loader ) {
 		this.loader = loader;
 	}
@@ -123,6 +123,6 @@ export class UploadAdapterPluginMock extends Plugin {
 	init() {
 		const fileRepository = this.editor.plugins.get( 'FileRepository' );
 
-		fileRepository.createAdapter = () => {};
+		fileRepository.createUploadAdapter = () => {};
 	}
 }

+ 1 - 1
packages/ckeditor5-upload/tests/filereader.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 6 - 6
packages/ckeditor5-upload/tests/filerepository.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -11,7 +11,7 @@ import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import FileRepository from '../src/filerepository';
 
 import Collection from '@ckeditor/ckeditor5-utils/src/collection';
-import { createNativeFileMock, AdapterMock, NativeFileReaderMock } from './_utils/mocks';
+import { createNativeFileMock, UploadAdapterMock, NativeFileReaderMock } from './_utils/mocks';
 import log from '@ckeditor/ckeditor5-utils/src/log';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import FileReader from '../src/filereader';
@@ -25,8 +25,8 @@ describe( 'FileRepository', () => {
 		init() {
 			fileRepository = this.editor.plugins.get( 'FileRepository' );
 
-			fileRepository.createAdapter = loader => {
-				adapterMock = new AdapterMock( loader );
+			fileRepository.createUploadAdapter = loader => {
+				adapterMock = new UploadAdapterMock( loader );
 
 				return adapterMock;
 			};
@@ -95,14 +95,14 @@ describe( 'FileRepository', () => {
 		it( 'should return null if adapter is not present', () => {
 			const stub = testUtils.sinon.stub( log, 'error' );
 
-			fileRepository.createAdapter = undefined;
+			fileRepository.createUploadAdapter = undefined;
 
 			expect( fileRepository.createLoader( createNativeFileMock() ) ).to.be.null;
 
 			sinon.assert.calledOnce( stub );
 			sinon.assert.calledWithExactly(
 				stub,
-				'filerepository-no-adapter: Upload adapter is not defined.'
+				'filerepository-no-upload-adapter: Upload adapter is not defined.'
 			);
 		} );
 

+ 0 - 46
packages/ckeditor5-upload/tests/imageupload.js

@@ -1,46 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* globals document */
-
-import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
-import Image from '@ckeditor/ckeditor5-image/src/image';
-import ImageUpload from '../src/imageupload';
-import ImageUploadProgress from '../src/imageuploadprogress';
-import ImageUploadButton from '../src/imageuploadbutton';
-
-import { UploadAdapterPluginMock } from './_utils/mocks';
-
-describe( 'ImageUpload', () => {
-	let editor, editorElement;
-
-	beforeEach( () => {
-		editorElement = document.createElement( 'div' );
-		document.body.appendChild( editorElement );
-
-		return ClassicEditor
-			.create( editorElement, {
-				plugins: [ Image, ImageUpload, UploadAdapterPluginMock ]
-			} )
-			.then( newEditor => {
-				editor = newEditor;
-			} );
-	} );
-
-	afterEach( () => {
-		editorElement.remove();
-
-		return editor.destroy();
-	} );
-
-	it( 'should include ImageUploadProgress', () => {
-		expect( editor.plugins.get( ImageUploadProgress ) ).to.be.instanceOf( ImageUploadProgress );
-	} );
-
-	it( 'should include ImageUploadButton', () => {
-		expect( editor.plugins.get( ImageUploadButton ) ).to.be.instanceOf( ImageUploadButton );
-	} );
-} );
-

+ 0 - 153
packages/ckeditor5-upload/tests/imageuploadbutton.js

@@ -1,153 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* globals document */
-
-import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import Image from '@ckeditor/ckeditor5-image/src/image';
-import FileDialogButtonView from '../src/ui/filedialogbuttonview';
-import FileRepository from '../src/filerepository';
-import ImageUploadButton from '../src/imageuploadbutton';
-import ImageUploadEngine from '../src/imageuploadengine';
-import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
-import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
-
-import { createNativeFileMock, AdapterMock } from './_utils/mocks';
-import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
-
-describe( 'ImageUploadButton', () => {
-	let editor, doc, editorElement, fileRepository;
-
-	class UploadAdapterPluginMock extends Plugin {
-		init() {
-			fileRepository = this.editor.plugins.get( FileRepository );
-			fileRepository.createAdapter = loader => {
-				return new AdapterMock( loader );
-			};
-		}
-	}
-
-	beforeEach( () => {
-		editorElement = document.createElement( 'div' );
-		document.body.appendChild( editorElement );
-
-		return ClassicEditor
-			.create( editorElement, {
-				plugins: [ Paragraph, Image, ImageUploadButton, FileRepository, UploadAdapterPluginMock ]
-			} )
-			.then( newEditor => {
-				editor = newEditor;
-				doc = editor.document;
-
-				// Hide all notifications (prevent alert() calls).
-				const notification = editor.plugins.get( Notification );
-				notification.on( 'show', evt => evt.stop() );
-			} );
-	} );
-
-	afterEach( () => {
-		editorElement.remove();
-
-		return editor.destroy();
-	} );
-
-	it( 'should include ImageUploadEngine', () => {
-		expect( editor.plugins.get( ImageUploadEngine ) ).to.be.instanceOf( ImageUploadEngine );
-	} );
-
-	it( 'should register insertImage button', () => {
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-
-		expect( button ).to.be.instanceOf( FileDialogButtonView );
-	} );
-
-	it( 'should be disabled while ImageUploadCommand is disabled', () => {
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const command = editor.commands.get( 'imageUpload' );
-
-		command.isEnabled = true;
-
-		expect( button.isEnabled ).to.true;
-
-		command.isEnabled = false;
-
-		expect( button.isEnabled ).to.false;
-	} );
-
-	it( 'should execute imageUpload command', () => {
-		const executeStub = sinon.stub( editor, 'execute' );
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const files = [ createNativeFileMock() ];
-
-		button.fire( 'done', files );
-		sinon.assert.calledOnce( executeStub );
-		expect( executeStub.firstCall.args[ 0 ] ).to.equal( 'imageUpload' );
-		expect( executeStub.firstCall.args[ 1 ].file ).to.equal( files[ 0 ] );
-	} );
-
-	it( 'should optimize the insertion position', () => {
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const files = [ createNativeFileMock() ];
-
-		setModelData( doc, '<paragraph>f[]oo</paragraph>' );
-
-		button.fire( 'done', files );
-
-		const id = fileRepository.getLoader( files[ 0 ] ).id;
-
-		expect( getModelData( doc ) ).to.equal(
-			`[<image uploadId="${ id }" uploadStatus="reading"></image>]` +
-			'<paragraph>foo</paragraph>'
-		);
-	} );
-
-	it( 'should correctly insert multiple files', () => {
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const files = [ createNativeFileMock(), createNativeFileMock() ];
-
-		setModelData( doc, '<paragraph>foo[]</paragraph><paragraph>bar</paragraph>' );
-
-		button.fire( 'done', files );
-
-		const id1 = fileRepository.getLoader( files[ 0 ] ).id;
-		const id2 = fileRepository.getLoader( files[ 1 ] ).id;
-
-		expect( getModelData( doc ) ).to.equal(
-			'<paragraph>foo</paragraph>' +
-			`<image uploadId="${ id1 }" uploadStatus="reading"></image>` +
-			`[<image uploadId="${ id2 }" uploadStatus="reading"></image>]` +
-			'<paragraph>bar</paragraph>'
-		);
-	} );
-
-	it( 'should not execute imageUpload if the file is not an image', () => {
-		const executeStub = sinon.stub( editor, 'execute' );
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const file = {
-			type: 'media/mp3',
-			size: 1024
-		};
-
-		button.fire( 'done', [ file ] );
-		sinon.assert.notCalled( executeStub );
-	} );
-
-	it( 'should work even if the FileList does not support iterators', () => {
-		const executeStub = sinon.stub( editor, 'execute' );
-		const button = editor.ui.componentFactory.create( 'insertImage' );
-		const files = {
-			0: createNativeFileMock(),
-			length: 1
-		};
-
-		button.fire( 'done', files );
-		sinon.assert.calledOnce( executeStub );
-		expect( executeStub.firstCall.args[ 0 ] ).to.equal( 'imageUpload' );
-		expect( executeStub.firstCall.args[ 1 ].file ).to.equal( files[ 0 ] );
-	} );
-} );
-

+ 0 - 132
packages/ckeditor5-upload/tests/imageuploadcommand.js

@@ -1,132 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-
-import ImageUploadCommand from '../src/imageuploadcommand';
-import FileRepository from '../src/filerepository';
-
-import { createNativeFileMock, AdapterMock } from './_utils/mocks';
-import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
-import Image from '@ckeditor/ckeditor5-image/src/image/imageengine';
-import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
-import buildModelConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildmodelconverter';
-import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
-
-import log from '@ckeditor/ckeditor5-utils/src/log';
-
-import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
-
-describe( 'ImageUploadCommand', () => {
-	let editor, command, doc, fileRepository;
-
-	testUtils.createSinonSandbox();
-
-	class UploadAdapterPluginMock extends Plugin {
-		init() {
-			fileRepository = this.editor.plugins.get( FileRepository );
-			fileRepository.createAdapter = loader => {
-				return new AdapterMock( loader );
-			};
-		}
-	}
-
-	beforeEach( () => {
-		return VirtualTestEditor
-			.create( {
-				plugins: [ FileRepository, Image, Paragraph, UploadAdapterPluginMock ]
-			} )
-			.then( newEditor => {
-				editor = newEditor;
-				command = new ImageUploadCommand( editor );
-
-				doc = editor.document;
-
-				const schema = doc.schema;
-				schema.allow( { name: 'image', attributes: [ 'uploadId' ], inside: '$root' } );
-				schema.requireAttributes( 'image', [ 'uploadId' ] );
-			} );
-	} );
-
-	afterEach( () => {
-		return editor.destroy();
-	} );
-
-	describe( 'execute()', () => {
-		it( 'should insert image at selection position (includes deleting selected content)', () => {
-			const file = createNativeFileMock();
-			setModelData( doc, '<paragraph>f[o]o</paragraph>' );
-
-			command.execute( { file } );
-
-			const id = fileRepository.getLoader( file ).id;
-			expect( getModelData( doc ) )
-				.to.equal( `<paragraph>f</paragraph>[<image uploadId="${ id }"></image>]<paragraph>o</paragraph>` );
-		} );
-
-		it( 'should insert directly at specified position (options.insertAt)', () => {
-			const file = createNativeFileMock();
-			setModelData( doc, '<paragraph>f[]oo</paragraph>' );
-
-			const insertAt = new ModelPosition( doc.getRoot(), [ 0, 2 ] ); // fo[]o
-
-			command.execute( { file, insertAt } );
-
-			const id = fileRepository.getLoader( file ).id;
-			expect( getModelData( doc ) )
-				.to.equal( `<paragraph>fo</paragraph>[<image uploadId="${ id }"></image>]<paragraph>o</paragraph>` );
-		} );
-
-		it( 'should allow to provide batch instance (options.batch)', () => {
-			const batch = doc.batch();
-			const file = createNativeFileMock();
-			const spy = sinon.spy( batch, 'insert' );
-
-			setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-			command.execute( { batch, file } );
-			const id = fileRepository.getLoader( file ).id;
-
-			expect( getModelData( doc ) ).to.equal( `[<image uploadId="${ id }"></image>]<paragraph>foo</paragraph>` );
-			sinon.assert.calledOnce( spy );
-		} );
-
-		it( 'should not insert image nor crash when image could not be inserted', () => {
-			const file = createNativeFileMock();
-			doc.schema.registerItem( 'other' );
-			doc.schema.allow( { name: '$text', inside: 'other' } );
-			doc.schema.allow( { name: 'other', inside: '$root' } );
-			doc.schema.limits.add( 'other' );
-			buildModelConverter().for( editor.editing.modelToView )
-				.fromElement( 'other' )
-				.toElement( 'p' );
-
-			setModelData( doc, '<other>[]</other>' );
-
-			command.execute( { file } );
-
-			expect( getModelData( doc ) ).to.equal( '<other>[]</other>' );
-		} );
-
-		it( 'should not throw when upload adapter is not set (FileRepository will log an error anyway)', () => {
-			const file = createNativeFileMock();
-
-			fileRepository.createAdapter = undefined;
-
-			const logStub = testUtils.sinon.stub( log, 'error' );
-
-			setModelData( doc, '<paragraph>fo[]o</paragraph>' );
-
-			expect( () => {
-				command.execute( { file } );
-			} ).to.not.throw();
-
-			expect( getModelData( doc ) ).to.equal( '<paragraph>fo[]o</paragraph>' );
-			expect( logStub.calledOnce ).to.be.true;
-		} );
-	} );
-} );

+ 0 - 419
packages/ckeditor5-upload/tests/imageuploadengine.js

@@ -1,419 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* globals window, setTimeout */
-
-import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import ImageEngine from '@ckeditor/ckeditor5-image/src/image/imageengine';
-import ImageUploadEngine from '../src/imageuploadengine';
-import ImageUploadCommand from '../src/imageuploadcommand';
-import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
-import UndoEngine from '@ckeditor/ckeditor5-undo/src/undoengine';
-import DataTransfer from '@ckeditor/ckeditor5-clipboard/src/datatransfer';
-
-import FileRepository from '../src/filerepository';
-import { AdapterMock, createNativeFileMock, NativeFileReaderMock } from './_utils/mocks';
-
-import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
-import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
-import { eventNameToConsumableType } from '@ckeditor/ckeditor5-engine/src/conversion/model-to-view-converters';
-import Range from '@ckeditor/ckeditor5-engine/src/model/range';
-
-import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
-import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
-
-describe( 'ImageUploadEngine', () => {
-	// eslint-disable-next-line max-len
-	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
-	let editor, doc, fileRepository, viewDocument, nativeReaderMock, loader, adapterMock;
-
-	testUtils.createSinonSandbox();
-
-	class UploadAdapterPluginMock extends Plugin {
-		init() {
-			fileRepository = this.editor.plugins.get( FileRepository );
-			fileRepository.createAdapter = newLoader => {
-				loader = newLoader;
-				adapterMock = new AdapterMock( loader );
-
-				return adapterMock;
-			};
-		}
-	}
-
-	beforeEach( () => {
-		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
-			nativeReaderMock = new NativeFileReaderMock();
-
-			return nativeReaderMock;
-		} );
-
-		return ClassicTestEditor
-			.create( {
-				plugins: [ ImageEngine, ImageUploadEngine, Paragraph, UndoEngine, UploadAdapterPluginMock ]
-			} )
-			.then( newEditor => {
-				editor = newEditor;
-				doc = editor.document;
-				viewDocument = editor.editing.view;
-			} );
-	} );
-
-	it( 'should register proper schema rules', () => {
-		expect( doc.schema.check( { name: 'image', attributes: [ 'uploadId' ], inside: '$root' } ) ).to.be.true;
-	} );
-
-	it( 'should register imageUpload command', () => {
-		expect( editor.commands.get( 'imageUpload' ) ).to.be.instanceOf( ImageUploadCommand );
-	} );
-
-	it( 'should execute imageUpload command when image is pasted', () => {
-		const spy = sinon.spy( editor, 'execute' );
-		const fileMock = createNativeFileMock();
-		const dataTransfer = new DataTransfer( { files: [ fileMock ], types: [ 'Files' ] } );
-		setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-		const targetRange = Range.createFromParentsAndOffsets( doc.getRoot(), 1, doc.getRoot(), 1 );
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		sinon.assert.calledOnce( spy );
-		sinon.assert.calledWith( spy, 'imageUpload' );
-
-		const id = fileRepository.getLoader( fileMock ).id;
-		expect( getModelData( doc ) ).to.equal(
-			`<paragraph>foo</paragraph>[<image uploadId="${ id }" uploadStatus="reading"></image>]`
-		);
-	} );
-
-	it( 'should execute imageUpload command with an optimized position when image is pasted', () => {
-		const spy = sinon.spy( editor, 'execute' );
-		const fileMock = createNativeFileMock();
-		const dataTransfer = new DataTransfer( { files: [ fileMock ], types: [ 'Files' ] } );
-		setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-		const paragraph = doc.getRoot().getChild( 0 );
-		const targetRange = Range.createFromParentsAndOffsets( paragraph, 1, paragraph, 1 ); // f[]oo
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		sinon.assert.calledOnce( spy );
-		sinon.assert.calledWith( spy, 'imageUpload' );
-
-		const id = fileRepository.getLoader( fileMock ).id;
-		expect( getModelData( doc ) ).to.equal(
-			`[<image uploadId="${ id }" uploadStatus="reading"></image>]<paragraph>foo</paragraph>`
-		);
-	} );
-
-	it( 'should execute imageUpload command when multiple files image are pasted', () => {
-		const spy = sinon.spy( editor, 'execute' );
-		const files = [ createNativeFileMock(), createNativeFileMock() ];
-		const dataTransfer = new DataTransfer( { files, types: [ 'Files' ] } );
-		setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-		const targetRange = Range.createFromParentsAndOffsets( doc.getRoot(), 1, doc.getRoot(), 1 );
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		sinon.assert.calledTwice( spy );
-		sinon.assert.calledWith( spy, 'imageUpload' );
-
-		const id1 = fileRepository.getLoader( files[ 0 ] ).id;
-		const id2 = fileRepository.getLoader( files[ 1 ] ).id;
-
-		expect( getModelData( doc ) ).to.equal(
-			'<paragraph>foo</paragraph>' +
-			`<image uploadId="${ id1 }" uploadStatus="reading"></image>` +
-			`[<image uploadId="${ id2 }" uploadStatus="reading"></image>]`
-		);
-	} );
-
-	it( 'should not execute imageUpload command when file is not an image', () => {
-		const spy = sinon.spy( editor, 'execute' );
-		const viewDocument = editor.editing.view;
-		const fileMock = {
-			type: 'media/mp3',
-			size: 1024
-		};
-		const dataTransfer = new DataTransfer( { files: [ fileMock ], types: [ 'Files' ] } );
-
-		setModelData( doc, '<paragraph>foo[]</paragraph>' );
-
-		const targetRange = Range.createFromParentsAndOffsets( doc.getRoot(), 1, doc.getRoot(), 1 );
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		sinon.assert.notCalled( spy );
-	} );
-
-	it( 'should not execute imageUpload command when there is non-empty HTML content pasted', () => {
-		const spy = sinon.spy( editor, 'execute' );
-		const fileMock = createNativeFileMock();
-		const dataTransfer = new DataTransfer( {
-			files: [ fileMock ],
-			types: [ 'Files', 'text/html' ],
-			getData: type => type === 'text/html' ? '<p>SomeData</p>' : ''
-		} );
-		setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-		const targetRange = Range.createFromParentsAndOffsets( doc.getRoot(), 1, doc.getRoot(), 1 );
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		sinon.assert.notCalled( spy );
-	} );
-
-	// https://github.com/ckeditor/ckeditor5-upload/issues/70
-	it( 'should not crash on browsers which do not implement DOMStringList as a child class of an Array', () => {
-		const typesDomStringListMock = {
-			length: 2,
-			'0': 'text/html',
-			'1': 'text/plain'
-		};
-		const dataTransfer = new DataTransfer( {
-			types: typesDomStringListMock,
-			getData: type => type === 'text/html' ? '<p>SomeData</p>' : 'SomeData'
-		} );
-		setModelData( doc, '<paragraph>[]foo</paragraph>' );
-
-		const targetRange = doc.selection.getFirstRange();
-		const targetViewRange = editor.editing.mapper.toViewRange( targetRange );
-
-		viewDocument.fire( 'clipboardInput', { dataTransfer, targetRanges: [ targetViewRange ] } );
-
-		// Well, there's no clipboard plugin, so nothing happens.
-		expect( getModelData( doc ) ).to.equal( '<paragraph>[]foo</paragraph>' );
-	} );
-
-	it( 'should not convert image\'s uploadId attribute if is consumed already', () => {
-		editor.editing.modelToView.on( 'addAttribute:uploadId:image', ( evt, data, consumable ) => {
-			consumable.consume( data.item, eventNameToConsumableType( evt.name ) );
-		}, { priority: 'high' } );
-
-		setModelData( doc, '<image uploadId="1234"></image>' );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget" contenteditable="false">' +
-				'<img></img>' +
-			'</figure>]' );
-	} );
-
-	it( 'should use read data once it is present', done => {
-		const file = createNativeFileMock();
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-
-		doc.once( 'changesDone', () => {
-			expect( getViewData( viewDocument ) ).to.equal(
-				'[<figure class="image ck-widget" contenteditable="false">' +
-				`<img src="${ base64Sample }"></img>` +
-				'</figure>]' +
-				'<p>foo bar</p>' );
-			expect( loader.status ).to.equal( 'uploading' );
-
-			done();
-		} );
-
-		expect( loader.status ).to.equal( 'reading' );
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should replace read data with server response once it is present', done => {
-		const file = createNativeFileMock();
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-
-		doc.once( 'changesDone', () => {
-			doc.once( 'changesDone', () => {
-				expect( getViewData( viewDocument ) ).to.equal(
-					'[<figure class="image ck-widget" contenteditable="false"><img src="image.png"></img></figure>]<p>foo bar</p>'
-				);
-				expect( loader.status ).to.equal( 'idle' );
-
-				done();
-			} );
-
-			adapterMock.mockSuccess( { default: 'image.png' } );
-		} );
-
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should fire notification event in case of error', done => {
-		const notification = editor.plugins.get( Notification );
-		const file = createNativeFileMock();
-
-		notification.on( 'show:warning', ( evt, data ) => {
-			expect( data.message ).to.equal( 'Reading error.' );
-			expect( data.title ).to.equal( 'Upload failed' );
-			evt.stop();
-
-			done();
-		}, { priority: 'high' } );
-
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-
-		nativeReaderMock.mockError( 'Reading error.' );
-	} );
-
-	it( 'should not fire notification on abort', done => {
-		const notification = editor.plugins.get( Notification );
-		const file = createNativeFileMock();
-		const spy = testUtils.sinon.spy();
-
-		notification.on( 'show:warning', evt => {
-			spy();
-			evt.stop();
-		}, { priority: 'high' } );
-
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-		nativeReaderMock.abort();
-
-		setTimeout( () => {
-			sinon.assert.notCalled( spy );
-			done();
-		}, 0 );
-	} );
-
-	it( 'should do nothing if image does not have uploadId', () => {
-		setModelData( doc, '<image src="image.png"></image>' );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget" contenteditable="false"><img src="image.png"></img></figure>]'
-		);
-	} );
-
-	it( 'should remove image in case of upload error', done => {
-		const file = createNativeFileMock();
-		const spy = testUtils.sinon.spy();
-		const notification = editor.plugins.get( Notification );
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-
-		notification.on( 'show:warning', evt => {
-			spy();
-			evt.stop();
-		}, { priority: 'high' } );
-
-		editor.execute( 'imageUpload', { file } );
-
-		doc.once( 'changesDone', () => {
-			doc.once( 'changesDone', () => {
-				expect( getModelData( doc ) ).to.equal( '<paragraph>[]foo bar</paragraph>' );
-				sinon.assert.calledOnce( spy );
-
-				done();
-			} );
-		} );
-
-		nativeReaderMock.mockError( 'Upload error.' );
-	} );
-
-	it( 'should abort upload if image is removed', () => {
-		const file = createNativeFileMock();
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-		const abortSpy = testUtils.sinon.spy( loader, 'abort' );
-
-		expect( loader.status ).to.equal( 'reading' );
-		nativeReaderMock.mockSuccess( base64Sample );
-
-		const image = doc.getRoot().getChild( 0 );
-		doc.enqueueChanges( () => {
-			const batch = doc.batch();
-
-			batch.remove( image );
-		} );
-
-		expect( loader.status ).to.equal( 'aborted' );
-		sinon.assert.calledOnce( abortSpy );
-	} );
-
-	it( 'image should be permanently removed if it is removed by user during upload', done => {
-		const file = createNativeFileMock();
-		const notification = editor.plugins.get( Notification );
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-
-		// Prevent popping up alert window.
-		notification.on( 'show:warning', evt => {
-			evt.stop();
-		}, { priority: 'high' } );
-
-		editor.execute( 'imageUpload', { file } );
-
-		doc.once( 'changesDone', () => {
-			// This is called after "manual" remove.
-			doc.once( 'changesDone', () => {
-				// This is called after attributes are removed.
-				let undone = false;
-
-				doc.once( 'changesDone', () => {
-					if ( !undone ) {
-						undone = true;
-
-						// This is called after abort remove.
-						expect( getModelData( doc ) ).to.equal( '<paragraph>[]foo bar</paragraph>' );
-
-						editor.execute( 'undo' );
-
-						// Expect that the image has not been brought back.
-						expect( getModelData( doc ) ).to.equal( '<paragraph>[]foo bar</paragraph>' );
-
-						done();
-					}
-				} );
-			} );
-		} );
-
-		const image = doc.getRoot().getChild( 0 );
-		doc.enqueueChanges( () => {
-			const batch = doc.batch();
-
-			batch.remove( image );
-		} );
-	} );
-
-	it( 'should create responsive image if server return multiple images', done => {
-		const file = createNativeFileMock();
-		setModelData( doc, '<paragraph>{}foo bar</paragraph>' );
-		editor.execute( 'imageUpload', { file } );
-
-		doc.once( 'changesDone', () => {
-			doc.once( 'changesDone', () => {
-				expect( getViewData( viewDocument ) ).to.equal(
-					'[<figure class="image ck-widget" contenteditable="false">' +
-						'<img sizes="100vw" src="image.png" srcset="image-500.png 500w, image-800.png 800w" width="800"></img>' +
-					'</figure>]<p>foo bar</p>'
-				);
-				expect( loader.status ).to.equal( 'idle' );
-
-				done();
-			} );
-
-			adapterMock.mockSuccess( { default: 'image.png', 500: 'image-500.png', 800: 'image-800.png' } );
-		} );
-
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should prevent from browser redirecting when an image is dropped on another image', () => {
-		const spy = testUtils.sinon.spy();
-
-		editor.editing.view.fire( 'dragover', {
-			preventDefault: spy
-		} );
-
-		expect( spy.calledOnce ).to.equal( true );
-	} );
-} );

+ 0 - 197
packages/ckeditor5-upload/tests/imageuploadprogress.js

@@ -1,197 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* globals window */
-
-import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
-
-import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-import ImageEngine from '@ckeditor/ckeditor5-image/src/image/imageengine';
-import ImageUploadEngine from '../src/imageuploadengine';
-import ImageUploadProgress from '../src/imageuploadprogress';
-import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
-import FileRepository from '../src/filerepository';
-
-import { AdapterMock, createNativeFileMock, NativeFileReaderMock } from './_utils/mocks';
-import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
-import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
-import { eventNameToConsumableType } from '@ckeditor/ckeditor5-engine/src/conversion/model-to-view-converters';
-import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
-import svgPlaceholder from '../theme/icons/image_placeholder.svg';
-
-describe( 'ImageUploadProgress', () => {
-	const imagePlaceholder = encodeURIComponent( svgPlaceholder );
-
-	// eslint-disable-next-line max-len
-	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
-	let editor, document, fileRepository, viewDocument, nativeReaderMock, loader, adapterMock;
-
-	class UploadAdapterPluginMock extends Plugin {
-		init() {
-			fileRepository = this.editor.plugins.get( FileRepository );
-			fileRepository.createAdapter = newLoader => {
-				loader = newLoader;
-				adapterMock = new AdapterMock( loader );
-
-				return adapterMock;
-			};
-		}
-	}
-
-	testUtils.createSinonSandbox();
-
-	beforeEach( () => {
-		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
-			nativeReaderMock = new NativeFileReaderMock();
-
-			return nativeReaderMock;
-		} );
-
-		return ClassicTestEditor
-			.create( {
-				plugins: [ ImageEngine, Paragraph, ImageUploadProgress, UploadAdapterPluginMock ]
-			} )
-			.then( newEditor => {
-				editor = newEditor;
-				document = editor.document;
-				viewDocument = editor.editing.view;
-
-				fileRepository = editor.plugins.get( FileRepository );
-				fileRepository.createAdapter = newLoader => {
-					loader = newLoader;
-					adapterMock = new AdapterMock( loader );
-
-					return adapterMock;
-				};
-			} );
-	} );
-
-	it( 'should include ImageUploadEngine', () => {
-		expect( editor.plugins.get( ImageUploadEngine ) ).to.be.instanceOf( ImageUploadEngine );
-	} );
-
-	it( 'should convert image\'s "reading" uploadStatus attribute', () => {
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget ck-appear ck-infinite-progress ck-image-upload-placeholder" contenteditable="false">' +
-				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
-			'</figure>]<p>foo</p>'
-		);
-	} );
-
-	it( 'should convert image\'s "uploading" uploadStatus attribute', done => {
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		document.once( 'changesDone', () => {
-			expect( getViewData( viewDocument ) ).to.equal(
-				'[<figure class="image ck-widget ck-appear" contenteditable="false">' +
-					`<img src="${ base64Sample }"></img>` +
-					'<div class="ck-progress-bar"></div>' +
-				'</figure>]<p>foo</p>'
-			);
-
-			done();
-		} );
-
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should update progressbar width on progress', done => {
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		document.once( 'changesDone', () => {
-			adapterMock.mockProgress( 40, 100 );
-
-			expect( getViewData( viewDocument ) ).to.equal(
-				'[<figure class="image ck-widget ck-appear" contenteditable="false">' +
-				`<img src="${ base64Sample }"></img>` +
-				'<div class="ck-progress-bar" style="width:40%;"></div>' +
-				'</figure>]<p>foo</p>'
-			);
-
-			done();
-		} );
-
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should convert image\'s "complete" uploadStatus attribute', done => {
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		document.once( 'changesDone', () => {
-			document.once( 'changesDone', () => {
-				expect( getViewData( viewDocument ) ).to.equal(
-					'[<figure class="image ck-widget" contenteditable="false">' +
-						'<img src="image.png"></img>' +
-					'</figure>]<p>foo</p>'
-				);
-
-				done();
-			} );
-
-			adapterMock.mockSuccess( { default: 'image.png' } );
-		} );
-
-		nativeReaderMock.mockSuccess( base64Sample );
-	} );
-
-	it( 'should allow to customize placeholder image', () => {
-		const uploadProgress = editor.plugins.get( ImageUploadProgress );
-		uploadProgress.placeholder = base64Sample;
-
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget ck-appear ck-infinite-progress ck-image-upload-placeholder" contenteditable="false">' +
-				`<img src="${ base64Sample }"></img>` +
-			'</figure>]<p>foo</p>'
-		);
-	} );
-
-	it( 'should not process attribute change if it is already consumed', () => {
-		editor.editing.modelToView.on( 'addAttribute:uploadStatus:image', ( evt, data, consumable ) => {
-			consumable.consume( data.item, eventNameToConsumableType( evt.name ) );
-		}, { priority: 'highest' } );
-
-		setModelData( document, '<paragraph>[]foo</paragraph>' );
-		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget" contenteditable="false"><img></img></figure>]<p>foo</p>'
-		);
-	} );
-
-	it( 'should not show progress bar if there is no loader with given uploadId', () => {
-		setModelData( document, '<image uploadId="123" uploadStatus="reading"></image>' );
-
-		const image = document.getRoot().getChild( 0 );
-
-		document.enqueueChanges( () => {
-			document.batch().setAttribute( image, 'uploadStatus', 'uploading' );
-		} );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget ck-appear ck-infinite-progress ck-image-upload-placeholder" contenteditable="false">' +
-				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
-			'</figure>]'
-		);
-
-		document.enqueueChanges( () => {
-			document.batch().setAttribute( image, 'uploadStatus', 'complete' );
-		} );
-
-		expect( getViewData( viewDocument ) ).to.equal(
-			'[<figure class="image ck-widget" contenteditable="false">' +
-				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
-			'</figure>]'
-		);
-	} );
-} );

+ 0 - 2
packages/ckeditor5-upload/tests/manual/imageplaceholder.html

@@ -1,2 +0,0 @@
-<div id="container">
-</div>

+ 0 - 21
packages/ckeditor5-upload/tests/manual/imageplaceholder.js

@@ -1,21 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* global document */
-
-import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
-import ImageEngine from '@ckeditor/ckeditor5-image/src/image/imageengine';
-import ImageUploadEngine from '../../src/imageuploadengine';
-import ImageUploadProgress from '../../src/imageuploadprogress';
-
-ClassicTestEditor.create( { plugins: [ ImageEngine, ImageUploadEngine, ImageUploadProgress ] } )
-	.then( editor => {
-		const imageUploadProgress = editor.plugins.get( ImageUploadProgress );
-		const img = document.createElement( 'img' );
-
-		img.src = imageUploadProgress.placeholder;
-		document.getElementById( 'container' ).appendChild( img );
-	} );
-

+ 0 - 3
packages/ckeditor5-upload/tests/manual/imageplaceholder.md

@@ -1,3 +0,0 @@
-## Image placeholder
-
-Check if image placeholder is visible.

+ 0 - 17
packages/ckeditor5-upload/tests/manual/imageupload.html

@@ -1,17 +0,0 @@
-<div id="editor">
-	<h2>Image upload</h2>
-	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus consequat placerat. Vestibulum id tellus et mauris sagittis tincidunt quis id mauris. Curabitur consectetur lectus sit amet tellus mattis, non lobortis leo interdum.</p>
-</div>
-
-<div id="button-container"></div>
-
-<style>
-	#button-container div {
-		margin-top: 10px;
-	}
-
-	#button-container button {
-		margin-right: 10px;
-	}
-</style>
-

+ 0 - 100
packages/ckeditor5-upload/tests/manual/imageupload.js

@@ -1,100 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/* globals document, console */
-
-import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
-import Enter from '@ckeditor/ckeditor5-enter/src/enter';
-import Typing from '@ckeditor/ckeditor5-typing/src/typing';
-import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
-import Heading from '@ckeditor/ckeditor5-heading/src/heading';
-import Image from '@ckeditor/ckeditor5-image/src/image';
-import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption';
-import Undo from '@ckeditor/ckeditor5-undo/src/undo';
-import Clipboard from '@ckeditor/ckeditor5-clipboard/src/clipboard';
-import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar';
-import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle';
-import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';
-import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';
-import List from '@ckeditor/ckeditor5-list/src/list';
-import ImageUpload from '../../src/imageupload';
-import { AdapterMock } from '../_utils/mocks';
-
-const buttonContainer = document.getElementById( 'button-container' );
-
-ClassicEditor
-	.create( document.querySelector( '#editor' ), {
-		plugins: [
-			Enter, Typing, Paragraph, Heading, Undo, Bold, Italic, Heading, List, Image, ImageToolbar, Clipboard,
-			ImageCaption, ImageStyle, ImageUpload
-		],
-		toolbar: [ 'headings', 'undo', 'redo', 'bold', 'italic', 'bulletedList', 'numberedList', 'insertImage' ],
-		image: {
-			toolbar: [ 'imageStyleFull', 'imageStyleSide', '|', 'imageTextAlternative' ]
-		}
-	} )
-	.then( editor => {
-		// Register fake adapter.
-		editor.plugins.get( 'FileRepository' ).createAdapter = loader => {
-			const adapterMock = new AdapterMock( loader );
-			createProgressButton( loader, adapterMock );
-
-			return adapterMock;
-		};
-	} )
-	.catch( err => {
-		console.error( err.stack );
-	} );
-
-function createProgressButton( loader, adapterMock ) {
-	const fileName = loader.file.name;
-	const container = document.createElement( 'div' );
-	const progressInfo = document.createElement( 'span' );
-	progressInfo.innerHTML = `File: ${ fileName }. Progress: 0%.`;
-	const progressButton = document.createElement( 'button' );
-	const errorButton = document.createElement( 'button' );
-	const abortButton = document.createElement( 'button' );
-	progressButton.innerHTML = 'Upload progress';
-	errorButton.innerHTML = 'Simulate error';
-	abortButton.innerHTML = 'Simulate aborting';
-
-	container.appendChild( progressButton );
-	container.appendChild( errorButton );
-	container.appendChild( abortButton );
-	container.appendChild( progressInfo );
-
-	buttonContainer.appendChild( container );
-
-	let progress = 0;
-	const total = 500;
-	progressButton.addEventListener( 'click', () => {
-		progress += 100;
-		adapterMock.mockProgress( progress, total );
-
-		if ( progress == total ) {
-			disableButtons();
-			adapterMock.mockSuccess( { default: './sample.jpg' } );
-		}
-
-		progressInfo.innerHTML = `File: ${ fileName }. Progress: ${ loader.uploadedPercent }%.`;
-	} );
-
-	errorButton.addEventListener( 'click', () => {
-		adapterMock.mockError( 'Upload error!' );
-		disableButtons();
-	} );
-
-	abortButton.addEventListener( 'click', () => {
-		loader.abort();
-		disableButtons();
-	} );
-
-	function disableButtons() {
-		progressButton.setAttribute( 'disabled', 'true' );
-		errorButton.setAttribute( 'disabled', 'true' );
-		abortButton.setAttribute( 'disabled', 'true' );
-	}
-}
-

+ 0 - 15
packages/ckeditor5-upload/tests/manual/imageupload.md

@@ -1,15 +0,0 @@
-## Image upload
-
-1. Drop an image into editor.
-1. Image should be read and displayed.
-1. Press "Upload progress" button couple times to simulate upload process.
-1. After uploading is complete your image should be replaced with sample image from server.
-
-On the occasionn – when you drop an image on another image in the editor,
-your browser [**should not** redirect to the image](https://github.com/ckeditor/ckeditor5-upload/issues/32).
-
-Repeat all the steps with:
-* dropping multiple images,
-* using toolbar button to add one and multiple images,
-* using `Simulate error` button to stop upload, show error and remove image,
-* using `Simulate aborting` button to stop upload and remove image.

BIN
packages/ckeditor5-upload/tests/manual/sample.jpg


+ 3 - 1
packages/ckeditor5-upload/tests/ui/filedialogbuttonview.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -30,9 +30,11 @@ describe( 'FileDialogButtonView', () => {
 
 			it( 'should open file dialog on execute', () => {
 				const spy = sinon.spy( view._fileInputView, 'open' );
+				const stub = sinon.stub( view._fileInputView.element, 'click' );
 				view.buttonView.fire( 'execute' );
 
 				sinon.assert.calledOnce( spy );
+				stub.restore();
 			} );
 		} );
 

+ 0 - 111
packages/ckeditor5-upload/tests/utils.js

@@ -1,111 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import { isImageType, findOptimalInsertionPosition } from '../src/utils';
-import Document from '@ckeditor/ckeditor5-engine/src/model/document';
-import { setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
-
-describe( 'upload utils', () => {
-	describe( 'isImageType()', () => {
-		it( 'should return true for png mime type', () => {
-			expect( isImageType( { type: 'image/png' } ) ).to.be.true;
-		} );
-
-		it( 'should return true for jpeg mime type', () => {
-			expect( isImageType( { type: 'image/jpeg' } ) ).to.be.true;
-		} );
-
-		it( 'should return true for gif mime type', () => {
-			expect( isImageType( { type: 'image/gif' } ) ).to.be.true;
-		} );
-
-		it( 'should return true for bmp mime type', () => {
-			expect( isImageType( { type: 'image/bmp' } ) ).to.be.true;
-		} );
-
-		it( 'should return false for other mime types', () => {
-			expect( isImageType( { type: 'audio/mp3' } ) ).to.be.false;
-			expect( isImageType( { type: 'video/mpeg' } ) ).to.be.false;
-		} );
-	} );
-
-	describe( 'findOptimalInsertionPosition()', () => {
-		let doc;
-
-		beforeEach( () => {
-			doc = new Document();
-
-			doc.createRoot();
-
-			doc.schema.registerItem( 'paragraph', '$block' );
-			doc.schema.registerItem( 'image' );
-			doc.schema.registerItem( 'span' );
-
-			doc.schema.allow( { name: 'image', inside: '$root' } );
-			doc.schema.objects.add( 'image' );
-
-			doc.schema.allow( { name: 'span', inside: 'paragraph' } );
-			doc.schema.allow( { name: '$text', inside: 'span' } );
-		} );
-
-		it( 'returns position after selected element', () => {
-			setData( doc, '<paragraph>x</paragraph>[<image></image>]<paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 2 ] );
-		} );
-
-		it( 'returns position inside empty block', () => {
-			setData( doc, '<paragraph>x</paragraph><paragraph>[]</paragraph><paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 1, 0 ] );
-		} );
-
-		it( 'returns position before block if at the beginning of that block', () => {
-			setData( doc, '<paragraph>x</paragraph><paragraph>[]foo</paragraph><paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 1 ] );
-		} );
-
-		it( 'returns position before block if in the middle of that block', () => {
-			setData( doc, '<paragraph>x</paragraph><paragraph>f[]oo</paragraph><paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 1 ] );
-		} );
-
-		it( 'returns position after block if at the end of that block', () => {
-			setData( doc, '<paragraph>x</paragraph><paragraph>foo[]</paragraph><paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 2 ] );
-		} );
-
-		// Checking if isTouching() was used.
-		it( 'returns position after block if at the end of that block (deeply nested)', () => {
-			setData( doc, '<paragraph>x</paragraph><paragraph>foo<span>bar[]</span></paragraph><paragraph>y</paragraph>' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 2 ] );
-		} );
-
-		it( 'returns selection focus if not in a block', () => {
-			doc.schema.allow( { name: '$text', inside: '$root' } );
-			setData( doc, 'foo[]bar' );
-
-			const pos = findOptimalInsertionPosition( doc.selection );
-
-			expect( pos.path ).to.deep.equal( [ 3 ] );
-		} );
-	} );
-} );

+ 0 - 1
packages/ckeditor5-upload/theme/icons/image_placeholder.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><g fill="none" fill-rule="evenodd"><rect width="700" height="250" fill="#F7F7F7" rx="4"/><text fill="#5F6F77" font-family="Arial,sans-serif" font-size="24"><tspan x="247.9" y="135">Uploading image…</tspan></text></g></svg>

+ 0 - 65
packages/ckeditor5-upload/theme/imageuploadprogress.scss

@@ -1,65 +0,0 @@
-// Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
-// For licensing, see LICENSE.md or http://ckeditor.com/license
-
-// Infinite progress bar default width.
-$lineWidth: 30px;
-
-figure.image {
-	position: relative;
-	overflow: hidden;
-
-	// Showing animation.
-	&.ck-appear {
-		animation: fadeIn 700ms;
-	}
-
-	// Infinite progress bar on top while image is read.
-	&.ck-infinite-progress::before {
-		content: "";
-		width: $lineWidth;
-		height: 2px;
-		position: absolute;
-		top: 0;
-		right: 0;
-		background: rgba(0, 0, 0, 0.1);
-		animation-name: readingProgressAnimation;
-		animation-duration: 1500ms;
-		animation-iteration-count: infinite;
-		transition-timing-function: linear;
-	}
-
-	&.ck-image-upload-placeholder > img {
-		width: 100%;
-	}
-
-	// Upload progress bar.
-	.ck-progress-bar {
-		height: 2px;
-		width: 0;
-		position: absolute;
-		top: 0;
-		left: 0;
-		background: #6ab5f9;
-		transition: width 100ms;
-	}
-}
-
-@keyframes fadeIn {
-	from { opacity: 0; }
-	to   { opacity: 1; }
-}
-
-@keyframes readingProgressAnimation {
-	0% {
-		width: $lineWidth;
-		right: 0;
-	}
-
-	50% {
-		width: $lineWidth * 1.5;
-	}
-
-	100% {
-		right: 100%;
-	}
-}