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

Merge branch 'master' into t/ckeditor5/1120

Piotrek Koszuliński 7 лет назад
Родитель
Сommit
f194370c6f
70 измененных файлов с 297 добавлено и 141 удалено
  1. 4 2
      packages/ckeditor5-image/.travis.yml
  2. 19 0
      packages/ckeditor5-image/CHANGELOG.md
  3. 1 1
      packages/ckeditor5-image/README.md
  4. 1 1
      packages/ckeditor5-image/docs/features/image.md
  5. 1 1
      packages/ckeditor5-image/lang/translations/ast.po
  6. 1 1
      packages/ckeditor5-image/lang/translations/cs.po
  7. 1 1
      packages/ckeditor5-image/lang/translations/da.po
  8. 1 1
      packages/ckeditor5-image/lang/translations/de.po
  9. 1 1
      packages/ckeditor5-image/lang/translations/el.po
  10. 1 1
      packages/ckeditor5-image/lang/translations/en-au.po
  11. 1 1
      packages/ckeditor5-image/lang/translations/eo.po
  12. 1 1
      packages/ckeditor5-image/lang/translations/es.po
  13. 1 1
      packages/ckeditor5-image/lang/translations/et.po
  14. 1 1
      packages/ckeditor5-image/lang/translations/eu.po
  15. 1 1
      packages/ckeditor5-image/lang/translations/fa.po
  16. 1 1
      packages/ckeditor5-image/lang/translations/fi.po
  17. 1 1
      packages/ckeditor5-image/lang/translations/fr.po
  18. 1 1
      packages/ckeditor5-image/lang/translations/gl.po
  19. 1 1
      packages/ckeditor5-image/lang/translations/hr.po
  20. 1 1
      packages/ckeditor5-image/lang/translations/hu.po
  21. 1 1
      packages/ckeditor5-image/lang/translations/it.po
  22. 1 1
      packages/ckeditor5-image/lang/translations/ja.po
  23. 1 1
      packages/ckeditor5-image/lang/translations/km.po
  24. 1 1
      packages/ckeditor5-image/lang/translations/kn.po
  25. 1 1
      packages/ckeditor5-image/lang/translations/ko.po
  26. 1 1
      packages/ckeditor5-image/lang/translations/ku.po
  27. 1 1
      packages/ckeditor5-image/lang/translations/nb.po
  28. 1 1
      packages/ckeditor5-image/lang/translations/ne.po
  29. 1 1
      packages/ckeditor5-image/lang/translations/nl.po
  30. 1 1
      packages/ckeditor5-image/lang/translations/pl.po
  31. 1 1
      packages/ckeditor5-image/lang/translations/pt-br.po
  32. 1 1
      packages/ckeditor5-image/lang/translations/pt.po
  33. 1 1
      packages/ckeditor5-image/lang/translations/ro.po
  34. 1 1
      packages/ckeditor5-image/lang/translations/ru.po
  35. 1 1
      packages/ckeditor5-image/lang/translations/si.po
  36. 1 1
      packages/ckeditor5-image/lang/translations/sk.po
  37. 1 1
      packages/ckeditor5-image/lang/translations/sq.po
  38. 1 1
      packages/ckeditor5-image/lang/translations/sv.po
  39. 1 1
      packages/ckeditor5-image/lang/translations/tr.po
  40. 1 1
      packages/ckeditor5-image/lang/translations/ug.po
  41. 1 1
      packages/ckeditor5-image/lang/translations/uk.po
  42. 1 1
      packages/ckeditor5-image/lang/translations/zh-cn.po
  43. 1 1
      packages/ckeditor5-image/lang/translations/zh.po
  44. 20 20
      packages/ckeditor5-image/package.json
  45. 1 1
      packages/ckeditor5-image/src/image/imageediting.js
  46. 1 1
      packages/ckeditor5-image/src/image/utils.js
  47. 3 3
      packages/ckeditor5-image/src/imagecaption/imagecaptionediting.js
  48. 57 27
      packages/ckeditor5-image/src/imageupload/imageuploadprogress.js
  49. 7 0
      packages/ckeditor5-image/tests/image.js
  50. 7 0
      packages/ckeditor5-image/tests/image/converters.js
  51. 7 0
      packages/ckeditor5-image/tests/image/imageediting.js
  52. 2 2
      packages/ckeditor5-image/tests/image/utils.js
  53. 8 0
      packages/ckeditor5-image/tests/imagecaption/imagecaptionediting.js
  54. 2 2
      packages/ckeditor5-image/tests/imagestyle/imagestylecommand.js
  55. 8 2
      packages/ckeditor5-image/tests/imagestyle/imagestyleediting.js
  56. 2 2
      packages/ckeditor5-image/tests/imagestyle/utils.js
  57. 2 2
      packages/ckeditor5-image/tests/imagetextalternative/imagetextalternativecommand.js
  58. 5 2
      packages/ckeditor5-image/tests/imagetextalternative/ui/textalternativeformview.js
  59. 7 0
      packages/ckeditor5-image/tests/imagetoolbar.js
  60. 2 2
      packages/ckeditor5-image/tests/imageupload/imageuploadcommand.js
  61. 4 0
      packages/ckeditor5-image/tests/imageupload/imageuploadediting.js
  62. 44 13
      packages/ckeditor5-image/tests/imageupload/imageuploadprogress.js
  63. 7 0
      packages/ckeditor5-image/tests/integration.js
  64. 1 1
      packages/ckeditor5-image/tests/manual/imageplaceholder.html
  65. 15 7
      packages/ckeditor5-image/tests/manual/imageplaceholder.js
  66. 1 1
      packages/ckeditor5-image/tests/manual/imageplaceholder.md
  67. 1 1
      packages/ckeditor5-image/tests/manual/tickets/142/1.js
  68. 1 1
      packages/ckeditor5-image/theme/icons/image_placeholder.svg
  69. 18 0
      packages/ckeditor5-image/theme/imageuploadloader.css
  70. 0 8
      packages/ckeditor5-image/theme/imageuploadprogress.css

+ 4 - 2
packages/ckeditor5-image/.travis.yml

@@ -1,7 +1,7 @@
 sudo: required
 sudo: required
 dist: trusty
 dist: trusty
 addons:
 addons:
-  firefox: "latest"
+  firefox: latest
   apt:
   apt:
     sources:
     sources:
     - google-chrome
     - google-chrome
@@ -9,12 +9,14 @@ addons:
     - google-chrome-stable
     - google-chrome-stable
 language: node_js
 language: node_js
 node_js:
 node_js:
-- '6'
+- '8'
 cache:
 cache:
 - node_modules
 - node_modules
 before_install:
 before_install:
 - export DISPLAY=:99.0
 - export DISPLAY=:99.0
 - sh -e /etc/init.d/xvfb start
 - sh -e /etc/init.d/xvfb start
+- npm config set package-lock false
+- npm i -g npm@^5.7.1
 install:
 install:
 - npm install @ckeditor/ckeditor5-dev-tests
 - npm install @ckeditor/ckeditor5-dev-tests
 - ckeditor5-dev-tests-install-dependencies
 - ckeditor5-dev-tests-install-dependencies

+ 19 - 0
packages/ckeditor5-image/CHANGELOG.md

@@ -1,6 +1,25 @@
 Changelog
 Changelog
 =========
 =========
 
 
+## [10.2.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.1.0...v10.2.0) (2018-07-18)
+
+### Features
+
+* Implemented a CSS–styled image upload loader. Closes [#207](https://github.com/ckeditor/ckeditor5-image/issues/207). ([997d39b](https://github.com/ckeditor/ckeditor5-image/commit/997d39b))
+* Introduced `ImageLoadObserver`. Closes [#213](https://github.com/ckeditor/ckeditor5-image/issues/213). ([1128cb8](https://github.com/ckeditor/ckeditor5-image/commit/1128cb8))
+
+### Bug fixes
+
+* Complete upload icon should not be rendered in Edge due to an [Edge's bug](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/105834/). Closes https://github.com/ckeditor/ckeditor5/issues/1066. ([9a62cf1](https://github.com/ckeditor/ckeditor5-image/commit/9a62cf1))
+* The UI should update once the image is loaded. Closes [#142](https://github.com/ckeditor/ckeditor5-image/issues/142). ([dee20c0](https://github.com/ckeditor/ckeditor5-image/commit/dee20c0))
+
+  Used the `EditorUI#update` event instead of `View#render` to attach the UI components (see [ckeditor/ckeditor5-core#130](https://github.com/ckeditor/ckeditor5-core/issues/130)).
+
+### Other changes
+
+* Updated translations. ([e6f77fe](https://github.com/ckeditor/ckeditor5-image/commit/e6f77fe))
+
+
 ## [10.1.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.0.0...v10.1.0) (2018-06-21)
 ## [10.1.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.0.0...v10.1.0) (2018-06-21)
 
 
 ### Features
 ### Features

+ 1 - 1
packages/ckeditor5-image/README.md

@@ -14,7 +14,7 @@ This package implements the image feature for CKEditor 5. The feature is introdu
 
 
 ## Documentation
 ## Documentation
 
 
-See the [`@ckeditor/ckeditor5-image` package](https://docs.ckeditor.com/ckeditor5/latest/api/image.html) page in [CKEditor 5 documentation](https://docs.ckeditor.com/ckeditor5/latest/).
+See the [`@ckeditor/ckeditor5-image` package](https://ckeditor.com/docs/ckeditor5/latest/api/image.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/).
 
 
 ## License
 ## License
 
 

+ 1 - 1
packages/ckeditor5-image/docs/features/image.md

@@ -205,7 +205,7 @@ ClassicEditor
 ```
 ```
 
 
 <info-box info>
 <info-box info>
-	Read more about {@link builds/guides/development/installing-plugins installing plugins}.
+	Read more about {@link builds/guides/integration/installing-plugins installing plugins}.
 </info-box>
 </info-box>
 
 
 ## Common API
 ## Common API

+ 1 - 1
packages/ckeditor5-image/lang/translations/ast.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ast\n"
 "Language-Team: Asturian (https://www.transifex.com/ckeditor/teams/11143/ast/)\n"
 "Language-Team: Asturian (https://www.transifex.com/ckeditor/teams/11143/ast/)\n"
+"Language: ast\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/cs.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: cs\n"
 "Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n"
 "Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n"
+"Language: cs\n"
 "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
 "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/da.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: da\n"
 "Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n"
 "Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n"
+"Language: da\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/de.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: de\n"
 "Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n"
 "Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n"
+"Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/el.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: el\n"
 "Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n"
 "Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n"
+"Language: el\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/en-au.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: en_AU\n"
 "Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n"
 "Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n"
+"Language: en_AU\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/eo.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: eo\n"
 "Language-Team: Esperanto (https://www.transifex.com/ckeditor/teams/11143/eo/)\n"
 "Language-Team: Esperanto (https://www.transifex.com/ckeditor/teams/11143/eo/)\n"
+"Language: eo\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/es.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: es\n"
 "Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n"
 "Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n"
+"Language: es\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/et.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: et\n"
 "Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n"
 "Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n"
+"Language: et\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/eu.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: eu\n"
 "Language-Team: Basque (https://www.transifex.com/ckeditor/teams/11143/eu/)\n"
 "Language-Team: Basque (https://www.transifex.com/ckeditor/teams/11143/eu/)\n"
+"Language: eu\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/fa.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: fa\n"
 "Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n"
 "Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n"
+"Language: fa\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/fi.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: fi\n"
 "Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n"
 "Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n"
+"Language: fi\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/fr.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: fr\n"
 "Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n"
 "Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n"
+"Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/gl.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: gl\n"
 "Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n"
 "Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n"
+"Language: gl\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/hr.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: hr\n"
 "Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n"
 "Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n"
+"Language: 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"
 "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 image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/hu.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: hu\n"
 "Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n"
 "Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n"
+"Language: hu\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/it.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: it\n"
 "Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n"
 "Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n"
+"Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ja.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ja\n"
 "Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n"
 "Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n"
+"Language: ja\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/km.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: km\n"
 "Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n"
 "Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n"
+"Language: km\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/kn.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: kn\n"
 "Language-Team: Kannada (https://www.transifex.com/ckeditor/teams/11143/kn/)\n"
 "Language-Team: Kannada (https://www.transifex.com/ckeditor/teams/11143/kn/)\n"
+"Language: kn\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ko.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ko\n"
 "Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n"
 "Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n"
+"Language: ko\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ku.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ku\n"
 "Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n"
 "Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n"
+"Language: ku\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/nb.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: nb\n"
 "Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n"
 "Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n"
+"Language: nb\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ne.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ne_NP\n"
 "Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n"
 "Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n"
+"Language: ne_NP\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/nl.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: nl\n"
 "Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n"
 "Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n"
+"Language: nl\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/pl.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: pl\n"
 "Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n"
 "Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n"
+"Language: 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"
 "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 image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/pt-br.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: pt_BR\n"
 "Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n"
 "Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/pt.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: pt\n"
 "Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n"
 "Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n"
+"Language: pt\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ro.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ro\n"
 "Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n"
 "Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n"
+"Language: ro\n"
 "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
 "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ru.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ru\n"
 "Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n"
 "Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n"
+"Language: ru\n"
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/si.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: si_LK\n"
 "Language-Team: Sinhala (Sri Lanka) (https://www.transifex.com/ckeditor/teams/11143/si_LK/)\n"
 "Language-Team: Sinhala (Sri Lanka) (https://www.transifex.com/ckeditor/teams/11143/si_LK/)\n"
+"Language: si_LK\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/sk.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: sk\n"
 "Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n"
 "Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n"
+"Language: sk\n"
 "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
 "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/sq.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: sq\n"
 "Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n"
 "Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n"
+"Language: sq\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/sv.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: sv\n"
 "Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n"
 "Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n"
+"Language: sv\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/tr.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: tr\n"
 "Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n"
 "Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n"
+"Language: tr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/ug.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: ug\n"
 "Language-Team: Uighur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n"
 "Language-Team: Uighur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n"
+"Language: ug\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/uk.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: uk\n"
 "Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n"
 "Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n"
+"Language: uk\n"
 "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/zh-cn.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: zh_CN\n"
 "Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n"
 "Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n"
+"Language: zh_CN\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 1 - 1
packages/ckeditor5-image/lang/translations/zh.po

@@ -1,8 +1,8 @@
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 # Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Language: zh_TW\n"
 "Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n"
 "Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n"
+"Language: zh_TW\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 
 msgctxt "Label for the image widget."
 msgctxt "Label for the image widget."

+ 20 - 20
packages/ckeditor5-image/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@ckeditor/ckeditor5-image",
   "name": "@ckeditor/ckeditor5-image",
-  "version": "10.1.0",
+  "version": "10.2.0",
   "description": "Image feature for CKEditor 5.",
   "description": "Image feature for CKEditor 5.",
   "keywords": [
   "keywords": [
     "ckeditor",
     "ckeditor",
@@ -9,33 +9,33 @@
     "ckeditor5-feature"
     "ckeditor5-feature"
   ],
   ],
   "dependencies": {
   "dependencies": {
-    "@ckeditor/ckeditor5-core": "^10.1.0",
-    "@ckeditor/ckeditor5-engine": "^10.1.0",
-    "@ckeditor/ckeditor5-ui": "^10.1.0",
-    "@ckeditor/ckeditor5-utils": "^10.1.0",
-    "@ckeditor/ckeditor5-theme-lark": "^10.1.0",
-    "@ckeditor/ckeditor5-upload": "^10.0.1",
-    "@ckeditor/ckeditor5-widget": "^10.1.0"
+    "@ckeditor/ckeditor5-core": "^11.0.0",
+    "@ckeditor/ckeditor5-engine": "^10.2.0",
+    "@ckeditor/ckeditor5-ui": "^11.0.0",
+    "@ckeditor/ckeditor5-utils": "^10.2.0",
+    "@ckeditor/ckeditor5-theme-lark": "^11.0.0",
+    "@ckeditor/ckeditor5-upload": "^10.0.2",
+    "@ckeditor/ckeditor5-widget": "^10.2.0"
   },
   },
   "devDependencies": {
   "devDependencies": {
-    "@ckeditor/ckeditor5-basic-styles": "^10.0.1",
-    "@ckeditor/ckeditor5-clipboard": "^10.0.1",
-    "@ckeditor/ckeditor5-editor-classic": "^10.0.1",
-    "@ckeditor/ckeditor5-enter": "^10.1.0",
-    "@ckeditor/ckeditor5-essentials": "^10.1.0",
-    "@ckeditor/ckeditor5-heading": "^10.0.1",
-    "@ckeditor/ckeditor5-link": "^10.0.2",
-    "@ckeditor/ckeditor5-list": "^11.0.0",
-    "@ckeditor/ckeditor5-paragraph": "^10.0.1",
-    "@ckeditor/ckeditor5-typing": "^10.0.1",
-    "@ckeditor/ckeditor5-undo": "^10.0.1",
+    "@ckeditor/ckeditor5-basic-styles": "^10.0.2",
+    "@ckeditor/ckeditor5-clipboard": "^10.0.2",
+    "@ckeditor/ckeditor5-editor-classic": "^11.0.0",
+    "@ckeditor/ckeditor5-enter": "^10.1.1",
+    "@ckeditor/ckeditor5-essentials": "^10.1.1",
+    "@ckeditor/ckeditor5-heading": "^10.0.2",
+    "@ckeditor/ckeditor5-link": "^10.0.3",
+    "@ckeditor/ckeditor5-list": "^11.0.1",
+    "@ckeditor/ckeditor5-paragraph": "^10.0.2",
+    "@ckeditor/ckeditor5-typing": "^11.0.0",
+    "@ckeditor/ckeditor5-undo": "^10.0.2",
     "eslint": "^4.15.0",
     "eslint": "^4.15.0",
     "eslint-config-ckeditor5": "^1.0.7",
     "eslint-config-ckeditor5": "^1.0.7",
     "husky": "^0.14.3",
     "husky": "^0.14.3",
     "lint-staged": "^7.0.0"
     "lint-staged": "^7.0.0"
   },
   },
   "engines": {
   "engines": {
-    "node": ">=6.0.0",
+    "node": ">=6.9.0",
     "npm": ">=3.0.0"
     "npm": ">=3.0.0"
   },
   },
   "author": "CKSource (http://cksource.com/)",
   "author": "CKSource (http://cksource.com/)",

+ 1 - 1
packages/ckeditor5-image/src/image/imageediting.js

@@ -114,7 +114,7 @@ export default class ImageEditing extends Plugin {
 // Note that `alt` and `src` attributes are converted separately, so they are not included.
 // Note that `alt` and `src` attributes are converted separately, so they are not included.
 //
 //
 // @private
 // @private
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 // @returns {module:engine/view/containerelement~ContainerElement}
 // @returns {module:engine/view/containerelement~ContainerElement}
 export function createImageViewElement( writer ) {
 export function createImageViewElement( writer ) {
 	const emptyElement = writer.createEmptyElement( 'img' );
 	const emptyElement = writer.createEmptyElement( 'img' );

+ 1 - 1
packages/ckeditor5-image/src/image/utils.js

@@ -18,7 +18,7 @@ const imageSymbol = Symbol( 'isImage' );
  * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.
  * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.
  *
  *
  * @param {module:engine/view/element~Element} viewElement
  * @param {module:engine/view/element~Element} viewElement
- * @param {module:engine/view/writer~Writer} writer An instance of the view writer.
+ * @param {module:engine/view/downcastwriter~DowncastWriter} writer An instance of the view writer.
  * @param {String} label The element's label. It will be concatenated with the image `alt` attribute if one is present.
  * @param {String} label The element's label. It will be concatenated with the image `alt` attribute if one is present.
  * @returns {module:engine/view/element~Element}
  * @returns {module:engine/view/element~Element}
  */
  */

+ 3 - 3
packages/ckeditor5-image/src/imagecaption/imagecaptionediting.js

@@ -88,7 +88,7 @@ export default class ImageCaptionEditing extends Plugin {
 	 * and then visible when the image is selected.
 	 * and then visible when the image is selected.
 	 *
 	 *
 	 * @private
 	 * @private
-	 * @param {module:engine/view/writer~Writer} viewWriter
+	 * @param {module:engine/view/downcastwriter~DowncastWriter} viewWriter
 	 * @returns {Boolean} Returns `true` when the view is updated.
 	 * @returns {Boolean} Returns `true` when the view is updated.
 	 */
 	 */
 	_updateCaptionVisibility( viewWriter ) {
 	_updateCaptionVisibility( viewWriter ) {
@@ -266,7 +266,7 @@ function getParentCaption( node ) {
 //
 //
 // @private
 // @private
 // @param {module:engine/view/containerelement~ContainerElement} caption
 // @param {module:engine/view/containerelement~ContainerElement} caption
-// @param {module:engine/view/writer~Writer} viewWriter
+// @param {module:engine/view/downcastwriter~DowncastWriter} viewWriter
 // @returns {Boolean} Returns `true` if the view was modified.
 // @returns {Boolean} Returns `true` if the view was modified.
 function hideCaptionIfEmpty( caption, viewWriter ) {
 function hideCaptionIfEmpty( caption, viewWriter ) {
 	if ( !caption.childCount && !caption.hasClass( 'ck-hidden' ) ) {
 	if ( !caption.childCount && !caption.hasClass( 'ck-hidden' ) ) {
@@ -281,7 +281,7 @@ function hideCaptionIfEmpty( caption, viewWriter ) {
 //
 //
 // @private
 // @private
 // @param {module:engine/view/containerelement~ContainerElement} caption
 // @param {module:engine/view/containerelement~ContainerElement} caption
-// @param {module:engine/view/writer~Writer} viewWriter
+// @param {module:engine/view/downcastwriter~DowncastWriter} viewWriter
 // @returns {Boolean} Returns `true` if the view was modified.
 // @returns {Boolean} Returns `true` if the view was modified.
 function showCaption( caption, viewWriter ) {
 function showCaption( caption, viewWriter ) {
 	if ( caption.hasClass( 'ck-hidden' ) ) {
 	if ( caption.hasClass( 'ck-hidden' ) ) {

+ 57 - 27
packages/ckeditor5-image/src/imageupload/imageuploadprogress.js

@@ -15,9 +15,11 @@ import uploadingPlaceholder from '../../theme/icons/image_placeholder.svg';
 import UIElement from '@ckeditor/ckeditor5-engine/src/view/uielement';
 import UIElement from '@ckeditor/ckeditor5-engine/src/view/uielement';
 import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 import ViewRange from '@ckeditor/ckeditor5-engine/src/view/range';
 import ViewRange from '@ckeditor/ckeditor5-engine/src/view/range';
+import env from '@ckeditor/ckeditor5-utils/src/env';
 
 
 import '../../theme/imageuploadprogress.css';
 import '../../theme/imageuploadprogress.css';
 import '../../theme/imageuploadicon.css';
 import '../../theme/imageuploadicon.css';
+import '../../theme/imageuploadloader.css';
 
 
 /**
 /**
  * The image upload progress plugin.
  * The image upload progress plugin.
@@ -104,7 +106,8 @@ export default class ImageUploadProgress extends Plugin {
 			return;
 			return;
 		}
 		}
 
 
-		if ( status == 'complete' && fileRepository.loaders.get( uploadId ) ) {
+		// Because in Edge there is no way to show fancy animation of completeIcon we need to skip it.
+		if ( status == 'complete' && fileRepository.loaders.get( uploadId ) && !env.isEdge ) {
 			_showCompleteIcon( viewFigure, viewWriter, editor.editing.view );
 			_showCompleteIcon( viewFigure, viewWriter, editor.editing.view );
 		}
 		}
 
 
@@ -118,10 +121,13 @@ export default class ImageUploadProgress extends Plugin {
 // Symbol added to progress bar UIElement to distinguish it from other elements.
 // Symbol added to progress bar UIElement to distinguish it from other elements.
 const progressBarSymbol = Symbol( 'progress-bar' );
 const progressBarSymbol = Symbol( 'progress-bar' );
 
 
+// Symbol added to placeholder UIElement to distinguish it from other elements.
+const placeholderSymbol = Symbol( 'placeholder' );
+
 // Adds ck-appear class to the image figure if one is not already applied.
 // Adds ck-appear class to the image figure if one is not already applied.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 function _startAppearEffect( viewFigure, writer ) {
 function _startAppearEffect( viewFigure, writer ) {
 	if ( !viewFigure.hasClass( 'ck-appear' ) ) {
 	if ( !viewFigure.hasClass( 'ck-appear' ) ) {
 		writer.addClass( 'ck-appear', viewFigure );
 		writer.addClass( 'ck-appear', viewFigure );
@@ -131,54 +137,53 @@ function _startAppearEffect( viewFigure, writer ) {
 // Removes ck-appear class to the image figure if one is not already removed.
 // Removes ck-appear class to the image figure if one is not already removed.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 function _stopAppearEffect( viewFigure, writer ) {
 function _stopAppearEffect( viewFigure, writer ) {
 	writer.removeClass( 'ck-appear', viewFigure );
 	writer.removeClass( 'ck-appear', viewFigure );
 }
 }
 
 
 // Shows placeholder together with infinite progress bar on given image figure.
 // Shows placeholder together with infinite progress bar on given image figure.
 //
 //
+// @param {String} Data-uri with a svg placeholder.
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 function _showPlaceholder( placeholder, viewFigure, writer ) {
 function _showPlaceholder( placeholder, viewFigure, writer ) {
 	if ( !viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {
 	if ( !viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {
 		writer.addClass( 'ck-image-upload-placeholder', viewFigure );
 		writer.addClass( 'ck-image-upload-placeholder', viewFigure );
 	}
 	}
 
 
-	if ( !viewFigure.hasClass( 'ck-infinite-progress' ) ) {
-		writer.addClass( 'ck-infinite-progress', viewFigure );
-	}
-
 	const viewImg = viewFigure.getChild( 0 );
 	const viewImg = viewFigure.getChild( 0 );
 
 
 	if ( viewImg.getAttribute( 'src' ) !== placeholder ) {
 	if ( viewImg.getAttribute( 'src' ) !== placeholder ) {
 		writer.setAttribute( 'src', placeholder, viewImg );
 		writer.setAttribute( 'src', placeholder, viewImg );
 	}
 	}
+
+	if ( !_getUIElement( viewFigure, placeholderSymbol ) ) {
+		writer.insert( ViewPosition.createAfter( viewImg ), _createPlaceholder( writer ) );
+	}
 }
 }
 
 
 // Removes placeholder together with infinite progress bar on given image figure.
 // Removes placeholder together with infinite progress bar on given image figure.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 function _hidePlaceholder( viewFigure, writer ) {
 function _hidePlaceholder( viewFigure, writer ) {
 	if ( viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {
 	if ( viewFigure.hasClass( 'ck-image-upload-placeholder' ) ) {
 		writer.removeClass( 'ck-image-upload-placeholder', viewFigure );
 		writer.removeClass( 'ck-image-upload-placeholder', viewFigure );
 	}
 	}
 
 
-	if ( viewFigure.hasClass( 'ck-infinite-progress' ) ) {
-		writer.removeClass( 'ck-infinite-progress', viewFigure );
-	}
+	_removeUIElement( viewFigure, writer, placeholderSymbol );
 }
 }
 
 
 // Shows progress bar displaying upload progress.
 // Shows progress bar displaying upload progress.
 // Attaches it to the file loader to update when upload percentace is changed.
 // Attaches it to the file loader to update when upload percentace is changed.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 // @param {module:upload/filerepository~FileLoader} loader
 // @param {module:upload/filerepository~FileLoader} loader
 // @param {module:engine/view/view~View} view
 // @param {module:engine/view/view~View} view
 function _showProgressBar( viewFigure, writer, loader, view ) {
 function _showProgressBar( viewFigure, writer, loader, view ) {
-	const progressBar = createProgressBar( writer );
+	const progressBar = _createProgressBar( writer );
 	writer.insert( ViewPosition.createAt( viewFigure, 'end' ), progressBar );
 	writer.insert( ViewPosition.createAt( viewFigure, 'end' ), progressBar );
 
 
 	// Update progress bar width when uploadedPercent is changed.
 	// Update progress bar width when uploadedPercent is changed.
@@ -192,19 +197,15 @@ function _showProgressBar( viewFigure, writer, loader, view ) {
 // Hides upload progress bar.
 // Hides upload progress bar.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 function _hideProgressBar( viewFigure, writer ) {
 function _hideProgressBar( viewFigure, writer ) {
-	const progressBar = getProgressBar( viewFigure );
-
-	if ( progressBar ) {
-		writer.remove( ViewRange.createOn( progressBar ) );
-	}
+	_removeUIElement( viewFigure, writer, progressBarSymbol );
 }
 }
 
 
 // Shows complete icon and hides after a certain amount of time.
 // Shows complete icon and hides after a certain amount of time.
 //
 //
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
 // @param {module:engine/view/containerelement~ContainerElement} viewFigure
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 // @param {module:engine/view/view~View} view
 // @param {module:engine/view/view~View} view
 function _showCompleteIcon( viewFigure, writer, view ) {
 function _showCompleteIcon( viewFigure, writer, view ) {
 	const completeIcon = new UIElement( 'div', { class: 'ck-image-upload-complete-icon' } );
 	const completeIcon = new UIElement( 'div', { class: 'ck-image-upload-complete-icon' } );
@@ -219,25 +220,54 @@ function _showCompleteIcon( viewFigure, writer, view ) {
 // Create progress bar element using {@link module:engine/view/uielement~UIElement}.
 // Create progress bar element using {@link module:engine/view/uielement~UIElement}.
 //
 //
 // @private
 // @private
-// @param {module:engine/view/writer~Writer} writer
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
 // @returns {module:engine/view/uielement~UIElement}
 // @returns {module:engine/view/uielement~UIElement}
-function createProgressBar( writer ) {
+function _createProgressBar( writer ) {
 	const progressBar = writer.createUIElement( 'div', { class: 'ck-progress-bar' } );
 	const progressBar = writer.createUIElement( 'div', { class: 'ck-progress-bar' } );
+
 	writer.setCustomProperty( progressBarSymbol, true, progressBar );
 	writer.setCustomProperty( progressBarSymbol, true, progressBar );
 
 
 	return progressBar;
 	return progressBar;
 }
 }
 
 
-// Returns progress bar {@link module:engine/view/uielement~UIElement} from image figure element. Returns `undefined` if
-// progress bar element is not found.
+// Create placeholder element using {@link module:engine/view/uielement~UIElement}.
+//
+// @private
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
+// @returns {module:engine/view/uielement~UIElement}
+function _createPlaceholder( writer ) {
+	const placeholder = writer.createUIElement( 'div', { class: 'ck-upload-placeholder-loader' } );
+
+	writer.setCustomProperty( placeholderSymbol, true, placeholder );
+
+	return placeholder;
+}
+
+// Returns {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
+// Returns `undefined` if element is not found.
 //
 //
 // @private
 // @private
 // @param {module:engine/view/element~Element} imageFigure
 // @param {module:engine/view/element~Element} imageFigure
+// @param {Symbol} uniqueProperty
 // @returns {module:engine/view/uielement~UIElement|undefined}
 // @returns {module:engine/view/uielement~UIElement|undefined}
-function getProgressBar( imageFigure ) {
+function _getUIElement( imageFigure, uniqueProperty ) {
 	for ( const child of imageFigure.getChildren() ) {
 	for ( const child of imageFigure.getChildren() ) {
-		if ( child.getCustomProperty( progressBarSymbol ) ) {
+		if ( child.getCustomProperty( uniqueProperty ) ) {
 			return child;
 			return child;
 		}
 		}
 	}
 	}
 }
 }
+
+// Removes {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
+//
+// @private
+// @param {module:engine/view/element~Element} imageFigure
+// @param {module:engine/view/downcastwriter~DowncastWriter} writer
+// @param {Symbol} uniqueProperty
+function _removeUIElement( viewFigure, writer, uniqueProperty ) {
+	const element = _getUIElement( viewFigure, uniqueProperty );
+
+	if ( element ) {
+		writer.remove( ViewRange.createOn( element ) );
+	}
+}

+ 7 - 0
packages/ckeditor5-image/tests/image.js

@@ -12,11 +12,18 @@ import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-util
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import global from '@ckeditor/ckeditor5-utils/src/dom/global';
 import global from '@ckeditor/ckeditor5-utils/src/dom/global';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 
 describe( 'Image', () => {
 describe( 'Image', () => {
 	let editorElement, model, view, editor, document, viewDocument;
 	let editorElement, model, view, editor, document, viewDocument;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		editorElement = global.document.createElement( 'div' );
 		editorElement = global.document.createElement( 'div' );
 		global.document.body.appendChild( editorElement );
 		global.document.body.appendChild( editorElement );
 
 

+ 7 - 0
packages/ckeditor5-image/tests/image/converters.js

@@ -17,11 +17,18 @@ import { upcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversio
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 
 describe( 'Image converters', () => {
 describe( 'Image converters', () => {
 	let editor, model, document, viewDocument;
 	let editor, model, document, viewDocument;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		return VirtualTestEditor.create()
 		return VirtualTestEditor.create()
 			.then( newEditor => {
 			.then( newEditor => {
 				editor = newEditor;
 				editor = newEditor;

+ 7 - 0
packages/ckeditor5-image/tests/image/imageediting.js

@@ -13,11 +13,18 @@ import { getData as getModelData, setData as setModelData } from '@ckeditor/cked
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { isImageWidget } from '../../src/image/utils';
 import { isImageWidget } from '../../src/image/utils';
 import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml';
 import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 
 describe( 'ImageEditing', () => {
 describe( 'ImageEditing', () => {
 	let editor, model, doc, view, viewDocument;
 	let editor, model, doc, view, viewDocument;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		return VirtualTestEditor
 		return VirtualTestEditor
 			.create( {
 			.create( {
 				plugins: [ ImageEditing ]
 				plugins: [ ImageEditing ]

+ 2 - 2
packages/ckeditor5-image/tests/image/utils.js

@@ -6,7 +6,7 @@
 import ViewElement from '@ckeditor/ckeditor5-engine/src/view/element';
 import ViewElement from '@ckeditor/ckeditor5-engine/src/view/element';
 import ViewSelection from '@ckeditor/ckeditor5-engine/src/view/selection';
 import ViewSelection from '@ckeditor/ckeditor5-engine/src/view/selection';
 import ViewDocumentFragment from '@ckeditor/ckeditor5-engine/src/view/documentfragment';
 import ViewDocumentFragment from '@ckeditor/ckeditor5-engine/src/view/documentfragment';
-import ViewWriter from '@ckeditor/ckeditor5-engine/src/view/writer';
+import ViewDowncastWriter from '@ckeditor/ckeditor5-engine/src/view/downcastwriter';
 import ViewDocument from '@ckeditor/ckeditor5-engine/src/view/document';
 import ViewDocument from '@ckeditor/ckeditor5-engine/src/view/document';
 import ViewRange from '@ckeditor/ckeditor5-engine/src/view/range';
 import ViewRange from '@ckeditor/ckeditor5-engine/src/view/range';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
@@ -17,7 +17,7 @@ describe( 'image widget utils', () => {
 	let element, image, writer;
 	let element, image, writer;
 
 
 	beforeEach( () => {
 	beforeEach( () => {
-		writer = new ViewWriter( new ViewDocument() );
+		writer = new ViewDowncastWriter( new ViewDocument() );
 		image = new ViewElement( 'img' );
 		image = new ViewElement( 'img' );
 		element = new ViewElement( 'figure', null, image );
 		element = new ViewElement( 'figure', null, image );
 		toImageWidget( element, writer, 'image widget' );
 		toImageWidget( element, writer, 'image widget' );

+ 8 - 0
packages/ckeditor5-image/tests/imagecaption/imagecaptionediting.js

@@ -18,10 +18,18 @@ import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 
 
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
+
 describe( 'ImageCaptionEditing', () => {
 describe( 'ImageCaptionEditing', () => {
 	let editor, model, doc, view;
 	let editor, model, doc, view;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		return VirtualTestEditor
 		return VirtualTestEditor
 			.create( {
 			.create( {
 				plugins: [ ImageCaptionEditing, ImageEditing, UndoEditing, Paragraph ]
 				plugins: [ ImageCaptionEditing, ImageEditing, UndoEditing, Paragraph ]

+ 2 - 2
packages/ckeditor5-image/tests/imagestyle/imagestylecommand.js

@@ -74,11 +74,11 @@ describe( 'ImageStyleCommand', () => {
 		setData( model, '[<image></image>]' );
 		setData( model, '[<image></image>]' );
 
 
 		model.change( writer => {
 		model.change( writer => {
-			expect( writer.batch.deltas ).to.length( 0 );
+			expect( writer.batch.operations ).to.length( 0 );
 
 
 			command.execute( { value: 'otherStyle' } );
 			command.execute( { value: 'otherStyle' } );
 
 
-			expect( writer.batch.deltas ).to.length.above( 0 );
+			expect( writer.batch.operations ).to.length.above( 0 );
 		} );
 		} );
 	} );
 	} );
 
 

+ 8 - 2
packages/ckeditor5-image/tests/imagestyle/imagestyleediting.js

@@ -12,12 +12,18 @@ import { getData as getModelData, setData as setModelData } from '@ckeditor/cked
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 
 
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
-
-testUtils.createSinonSandbox();
+import env from '@ckeditor/ckeditor5-utils/src/env';
 
 
 describe( 'ImageStyleEditing', () => {
 describe( 'ImageStyleEditing', () => {
 	let editor, model, document, viewDocument;
 	let editor, model, document, viewDocument;
 
 
+	testUtils.createSinonSandbox( 'ImageStyleEditing' );
+
+	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+	} );
+
 	afterEach( () => {
 	afterEach( () => {
 		editor.destroy();
 		editor.destroy();
 	} );
 	} );

+ 2 - 2
packages/ckeditor5-image/tests/imagestyle/utils.js

@@ -13,11 +13,11 @@ import rightIcon from '@ckeditor/ckeditor5-core/theme/icons/object-right.svg';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import { normalizeImageStyles } from '../../src/imagestyle/utils';
 import { normalizeImageStyles } from '../../src/imagestyle/utils';
 
 
-testUtils.createSinonSandbox();
-
 describe( 'ImageStyle utils', () => {
 describe( 'ImageStyle utils', () => {
 	let imageStyles;
 	let imageStyles;
 
 
+	testUtils.createSinonSandbox();
+
 	describe( 'normalizeImageStyles()', () => {
 	describe( 'normalizeImageStyles()', () => {
 		// Since this function is all about normalizing the config object, make sure it doesn't throw
 		// Since this function is all about normalizing the config object, make sure it doesn't throw
 		// if the config is empty (which may happen e.g. if only ImageStyleUI was loaded).
 		// if the config is empty (which may happen e.g. if only ImageStyleUI was loaded).

+ 2 - 2
packages/ckeditor5-image/tests/imagetextalternative/imagetextalternativecommand.js

@@ -77,11 +77,11 @@ describe( 'ImageTextAlternativeCommand', () => {
 		setData( model, '[<image src="image.png"></image>]' );
 		setData( model, '[<image src="image.png"></image>]' );
 
 
 		model.change( writer => {
 		model.change( writer => {
-			expect( writer.batch.deltas ).to.length( 0 );
+			expect( writer.batch.operations ).to.length( 0 );
 
 
 			command.execute( { newValue: 'foo bar' } );
 			command.execute( { newValue: 'foo bar' } );
 
 
-			expect( writer.batch.deltas ).to.length.above( 0 );
+			expect( writer.batch.operations ).to.length.above( 0 );
 		} );
 		} );
 	} );
 	} );
 } );
 } );

+ 5 - 2
packages/ckeditor5-image/tests/imagetextalternative/ui/textalternativeformview.js

@@ -13,13 +13,16 @@ import FocusTracker from '@ckeditor/ckeditor5-utils/src/focustracker';
 import FocusCycler from '@ckeditor/ckeditor5-ui/src/focuscycler';
 import FocusCycler from '@ckeditor/ckeditor5-ui/src/focuscycler';
 import ViewCollection from '@ckeditor/ckeditor5-ui/src/viewcollection';
 import ViewCollection from '@ckeditor/ckeditor5-ui/src/viewcollection';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
-
-testUtils.createSinonSandbox();
+import env from '@ckeditor/ckeditor5-utils/src/env';
 
 
 describe( 'TextAlternativeFormView', () => {
 describe( 'TextAlternativeFormView', () => {
 	let view;
 	let view;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		view = new TextAlternativeFormView( { t: () => {} } );
 		view = new TextAlternativeFormView( { t: () => {} } );
 	} );
 	} );
 
 

+ 7 - 0
packages/ckeditor5-image/tests/imagetoolbar.js

@@ -15,11 +15,18 @@ import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 import Range from '@ckeditor/ckeditor5-engine/src/model/range';
 import Range from '@ckeditor/ckeditor5-engine/src/model/range';
 import View from '@ckeditor/ckeditor5-ui/src/view';
 import View from '@ckeditor/ckeditor5-ui/src/view';
 import { setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 
 describe( 'ImageToolbar', () => {
 describe( 'ImageToolbar', () => {
 	let editor, model, doc, plugin, toolbar, balloon, editorElement;
 	let editor, model, doc, plugin, toolbar, balloon, editorElement;
 
 
+	testUtils.createSinonSandbox();
+
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		editorElement = global.document.createElement( 'div' );
 		editorElement = global.document.createElement( 'div' );
 		global.document.body.appendChild( editorElement );
 		global.document.body.appendChild( editorElement );
 
 

+ 2 - 2
packages/ckeditor5-image/tests/imageupload/imageuploadcommand.js

@@ -87,11 +87,11 @@ describe( 'ImageUploadCommand', () => {
 			setModelData( model, '<paragraph>[]foo</paragraph>' );
 			setModelData( model, '<paragraph>[]foo</paragraph>' );
 
 
 			model.change( writer => {
 			model.change( writer => {
-				expect( writer.batch.deltas ).to.length( 0 );
+				expect( writer.batch.operations ).to.length( 0 );
 
 
 				command.execute( { file } );
 				command.execute( { file } );
 
 
-				expect( writer.batch.deltas ).to.length.above( 0 );
+				expect( writer.batch.operations ).to.length.above( 0 );
 			} );
 			} );
 		} );
 		} );
 
 

+ 4 - 0
packages/ckeditor5-image/tests/imageupload/imageuploadediting.js

@@ -25,6 +25,7 @@ import Range from '@ckeditor/ckeditor5-engine/src/model/range';
 import Position from '@ckeditor/ckeditor5-engine/src/model/position';
 import Position from '@ckeditor/ckeditor5-engine/src/model/position';
 
 
 import log from '@ckeditor/ckeditor5-utils/src/log';
 import log from '@ckeditor/ckeditor5-utils/src/log';
+import env from '@ckeditor/ckeditor5-utils/src/env';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
 import Notification from '@ckeditor/ckeditor5-ui/src/notification/notification';
 
 
@@ -48,6 +49,9 @@ describe( 'ImageUploadEditing', () => {
 	}
 	}
 
 
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
 		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
 			nativeReaderMock = new NativeFileReaderMock();
 			nativeReaderMock = new NativeFileReaderMock();
 
 

+ 44 - 13
packages/ckeditor5-image/tests/imageupload/imageuploadprogress.js

@@ -19,13 +19,14 @@ import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-util
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 import svgPlaceholder from '../../theme/icons/image_placeholder.svg';
 import svgPlaceholder from '../../theme/icons/image_placeholder.svg';
+import env from '@ckeditor/ckeditor5-utils/src/env';
 
 
 describe( 'ImageUploadProgress', () => {
 describe( 'ImageUploadProgress', () => {
 	const imagePlaceholder = encodeURIComponent( svgPlaceholder );
 	const imagePlaceholder = encodeURIComponent( svgPlaceholder );
 
 
 	// eslint-disable-next-line max-len
 	// eslint-disable-next-line max-len
 	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
 	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
-	let editor, model, document, fileRepository, view, nativeReaderMock, loader, adapterMock;
+	let editor, model, doc, fileRepository, view, nativeReaderMock, loader, adapterMock;
 
 
 	class UploadAdapterPluginMock extends Plugin {
 	class UploadAdapterPluginMock extends Plugin {
 		init() {
 		init() {
@@ -42,6 +43,9 @@ describe( 'ImageUploadProgress', () => {
 	testUtils.createSinonSandbox();
 	testUtils.createSinonSandbox();
 
 
 	beforeEach( () => {
 	beforeEach( () => {
+		// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
 		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
 			nativeReaderMock = new NativeFileReaderMock();
 			nativeReaderMock = new NativeFileReaderMock();
 
 
@@ -55,7 +59,7 @@ describe( 'ImageUploadProgress', () => {
 			.then( newEditor => {
 			.then( newEditor => {
 				editor = newEditor;
 				editor = newEditor;
 				model = editor.model;
 				model = editor.model;
-				document = model.document;
+				doc = model.document;
 				view = editor.editing.view;
 				view = editor.editing.view;
 
 
 				fileRepository = editor.plugins.get( FileRepository );
 				fileRepository = editor.plugins.get( FileRepository );
@@ -73,8 +77,9 @@ describe( 'ImageUploadProgress', () => {
 		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
 		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
 
 
 		expect( getViewData( view ) ).to.equal(
 		expect( getViewData( view ) ).to.equal(
-			'[<figure class="ck-appear ck-image-upload-placeholder ck-infinite-progress ck-widget image" contenteditable="false">' +
+			'[<figure class="ck-appear ck-image-upload-placeholder ck-widget image" contenteditable="false">' +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
+				'<div class="ck-upload-placeholder-loader"></div>' +
 			'</figure>]<p>foo</p>'
 			'</figure>]<p>foo</p>'
 		);
 		);
 	} );
 	} );
@@ -103,7 +108,7 @@ describe( 'ImageUploadProgress', () => {
 		const loader = fileRepository.createLoader( file );
 		const loader = fileRepository.createLoader( file );
 
 
 		setModelData( model, '<image></image>' );
 		setModelData( model, '<image></image>' );
-		const image = document.getRoot().getChild( 0 );
+		const image = doc.getRoot().getChild( 0 );
 
 
 		// Set attributes directly on image to simulate instant "uploading" status.
 		// Set attributes directly on image to simulate instant "uploading" status.
 		model.change( writer => {
 		model.change( writer => {
@@ -122,7 +127,7 @@ describe( 'ImageUploadProgress', () => {
 
 
 	it( 'should work correctly when there is no "reading" status and go straight to "uploading" - external changes', () => {
 	it( 'should work correctly when there is no "reading" status and go straight to "uploading" - external changes', () => {
 		setModelData( model, '<image></image>' );
 		setModelData( model, '<image></image>' );
-		const image = document.getRoot().getChild( 0 );
+		const image = doc.getRoot().getChild( 0 );
 
 
 		// Set attributes directly on image to simulate instant "uploading" status.
 		// Set attributes directly on image to simulate instant "uploading" status.
 		model.change( writer => {
 		model.change( writer => {
@@ -131,15 +136,16 @@ describe( 'ImageUploadProgress', () => {
 		} );
 		} );
 
 
 		expect( getViewData( view ) ).to.equal(
 		expect( getViewData( view ) ).to.equal(
-			'[<figure class="ck-appear ck-image-upload-placeholder ck-infinite-progress ck-widget image" contenteditable="false">' +
+			'[<figure class="ck-appear ck-image-upload-placeholder ck-widget image" contenteditable="false">' +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
+				'<div class="ck-upload-placeholder-loader"></div>' +
 			'</figure>]'
 			'</figure>]'
 		);
 		);
 	} );
 	} );
 
 
 	it( 'should "clear" image when uploadId changes to null', () => {
 	it( 'should "clear" image when uploadId changes to null', () => {
 		setModelData( model, '<image></image>' );
 		setModelData( model, '<image></image>' );
-		const image = document.getRoot().getChild( 0 );
+		const image = doc.getRoot().getChild( 0 );
 
 
 		// Set attributes directly on image to simulate instant "uploading" status.
 		// Set attributes directly on image to simulate instant "uploading" status.
 		model.change( writer => {
 		model.change( writer => {
@@ -154,7 +160,7 @@ describe( 'ImageUploadProgress', () => {
 
 
 		expect( getViewData( view ) ).to.equal(
 		expect( getViewData( view ) ).to.equal(
 			'[<figure class="ck-widget image" contenteditable="false">' +
 			'[<figure class="ck-widget image" contenteditable="false">' +
-			`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
+				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
 			'</figure>]'
 			'</figure>]'
 		);
 		);
 	} );
 	} );
@@ -168,8 +174,8 @@ describe( 'ImageUploadProgress', () => {
 
 
 			expect( getViewData( view ) ).to.equal(
 			expect( getViewData( view ) ).to.equal(
 				'[<figure class="ck-appear ck-widget image" contenteditable="false">' +
 				'[<figure class="ck-appear ck-widget image" contenteditable="false">' +
-				`<img src="${ base64Sample }"></img>` +
-				'<div class="ck-progress-bar" style="width:40%"></div>' +
+					`<img src="${ base64Sample }"></img>` +
+					'<div class="ck-progress-bar" style="width:40%"></div>' +
 				'</figure>]<p>foo</p>'
 				'</figure>]<p>foo</p>'
 			);
 			);
 
 
@@ -219,8 +225,9 @@ describe( 'ImageUploadProgress', () => {
 		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
 		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
 
 
 		expect( getViewData( view ) ).to.equal(
 		expect( getViewData( view ) ).to.equal(
-			'[<figure class="ck-appear ck-image-upload-placeholder ck-infinite-progress ck-widget image" contenteditable="false">' +
+			'[<figure class="ck-appear ck-image-upload-placeholder ck-widget image" contenteditable="false">' +
 				`<img src="${ base64Sample }"></img>` +
 				`<img src="${ base64Sample }"></img>` +
+				'<div class="ck-upload-placeholder-loader"></div>' +
 			'</figure>]<p>foo</p>'
 			'</figure>]<p>foo</p>'
 		);
 		);
 	} );
 	} );
@@ -241,15 +248,16 @@ describe( 'ImageUploadProgress', () => {
 	it( 'should not show progress bar and complete icon if there is no loader with given uploadId', () => {
 	it( 'should not show progress bar and complete icon if there is no loader with given uploadId', () => {
 		setModelData( model, '<image uploadId="123" uploadStatus="reading"></image>' );
 		setModelData( model, '<image uploadId="123" uploadStatus="reading"></image>' );
 
 
-		const image = document.getRoot().getChild( 0 );
+		const image = doc.getRoot().getChild( 0 );
 
 
 		model.change( writer => {
 		model.change( writer => {
 			writer.setAttribute( 'uploadStatus', 'uploading', image );
 			writer.setAttribute( 'uploadStatus', 'uploading', image );
 		} );
 		} );
 
 
 		expect( getViewData( view ) ).to.equal(
 		expect( getViewData( view ) ).to.equal(
-			'[<figure class="ck-appear ck-image-upload-placeholder ck-infinite-progress ck-widget image" contenteditable="false">' +
+			'[<figure class="ck-appear ck-image-upload-placeholder ck-widget image" contenteditable="false">' +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
 				`<img src="data:image/svg+xml;utf8,${ imagePlaceholder }"></img>` +
+				'<div class="ck-upload-placeholder-loader"></div>' +
 			'</figure>]'
 			'</figure>]'
 		);
 		);
 
 
@@ -263,4 +271,27 @@ describe( 'ImageUploadProgress', () => {
 			'</figure>]'
 			'</figure>]'
 		);
 		);
 	} );
 	} );
+
+	it( 'should not create completeIcon element when browser is Microsoft Edge', done => {
+		testUtils.sinon.stub( env, 'isEdge' ).get( () => true );
+
+		setModelData( model, '<paragraph>[]foo</paragraph>' );
+		editor.execute( 'imageUpload', { file: createNativeFileMock() } );
+
+		model.document.once( 'change', () => {
+			model.document.once( 'change', () => {
+				expect( getViewData( view ) ).to.equal(
+					'[<figure class="ck-widget image">' +
+						'<img src="image.png"></img>' +
+					'</figure>]<p>foo</p>'
+				);
+
+				done();
+			}, { priority: 'lowest' } );
+
+			adapterMock.mockSuccess( { default: 'image.png' } );
+		} );
+
+		nativeReaderMock.mockSuccess( base64Sample );
+	} );
 } );
 } );

+ 7 - 0
packages/ckeditor5-image/tests/integration.js

@@ -11,12 +11,19 @@ import global from '@ckeditor/ckeditor5-utils/src/dom/global';
 import Image from '../src/image';
 import Image from '../src/image';
 import ImageToolbar from '../src/imagetoolbar';
 import ImageToolbar from '../src/imagetoolbar';
 import View from '@ckeditor/ckeditor5-ui/src/view';
 import View from '@ckeditor/ckeditor5-ui/src/view';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 
 describe( 'ImageToolbar integration', () => {
 describe( 'ImageToolbar integration', () => {
 	describe( 'with the BalloonToolbar', () => {
 	describe( 'with the BalloonToolbar', () => {
 		let balloon, balloonToolbar, newEditor, editorElement;
 		let balloon, balloonToolbar, newEditor, editorElement;
 
 
+		testUtils.createSinonSandbox();
+
 		beforeEach( () => {
 		beforeEach( () => {
+			// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
+			testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
+
 			editorElement = global.document.createElement( 'div' );
 			editorElement = global.document.createElement( 'div' );
 			global.document.body.appendChild( editorElement );
 			global.document.body.appendChild( editorElement );
 
 

+ 1 - 1
packages/ckeditor5-image/tests/manual/imageplaceholder.html

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

+ 15 - 7
packages/ckeditor5-image/tests/manual/imageplaceholder.js

@@ -3,19 +3,27 @@
  * For licensing, see LICENSE.md.
  * For licensing, see LICENSE.md.
  */
  */
 
 
-/* global document */
+/* global document, console, window */
 
 
-import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
 import ImageEditing from '../../src/image/imageediting';
 import ImageEditing from '../../src/image/imageediting';
 import ImageUploadEditing from '../../src/imageupload/imageuploadediting';
 import ImageUploadEditing from '../../src/imageupload/imageuploadediting';
 import ImageUploadProgress from '../../src/imageupload/imageuploadprogress';
 import ImageUploadProgress from '../../src/imageupload/imageuploadprogress';
 
 
-VirtualTestEditor.create( { plugins: [ ImageEditing, ImageUploadEditing, ImageUploadProgress ] } )
+ClassicEditor.create( document.querySelector( '#editor' ), {
+	plugins: [ ImageEditing, ImageUploadEditing, ImageUploadProgress ]
+} )
 	.then( editor => {
 	.then( editor => {
-		const imageUploadProgress = editor.plugins.get( ImageUploadProgress );
-		const img = document.createElement( 'img' );
+		window.editor = editor;
 
 
-		img.src = imageUploadProgress.placeholder;
-		document.getElementById( 'container' ).appendChild( img );
+		editor.model.change( writer => {
+			writer.appendElement( 'image', {
+				uploadId: 'fake',
+				uploadStatus: 'uploading'
+			}, editor.model.document.getRoot() );
+		} );
+	} )
+	.catch( error => {
+		console.error( error );
 	} );
 	} );
 
 

+ 1 - 1
packages/ckeditor5-image/tests/manual/imageplaceholder.md

@@ -1,3 +1,3 @@
 ## Image placeholder
 ## Image placeholder
 
 
-Check if image placeholder is visible.
+Check if the image placeholder is visible and looks OK after window resize.

+ 1 - 1
packages/ckeditor5-image/tests/manual/tickets/142/1.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.
  * For licensing, see LICENSE.md.
  */
  */
 
 

+ 1 - 1
packages/ckeditor5-image/theme/icons/image_placeholder.svg

@@ -1 +1 @@
-<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="#FAFAFA" 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>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><g fill="#FAFAFA" fill-rule="evenodd"><rect width="700" height="250" rx="4"/></g></svg>

+ 18 - 0
packages/ckeditor5-image/theme/imageuploadloader.css

@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+.ck .ck-upload-placeholder-loader {
+	position: absolute;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	top: 0;
+	left: 0;
+
+	&::before {
+		content: '';
+		position: relative;
+	}
+}

+ 0 - 8
packages/ckeditor5-image/theme/imageuploadprogress.css

@@ -12,14 +12,6 @@
 	position: relative;
 	position: relative;
 	overflow: hidden;
 	overflow: hidden;
 
 
-	/* Infinite progress bar on top while the image is read. */
-	&.ck-infinite-progress::before {
-		content: "";
-		position: absolute;
-		top: 0;
-		right: 0;
-	}
-
 	/* Upload progress bar. */
 	/* Upload progress bar. */
 	& .ck-progress-bar {
 	& .ck-progress-bar {
 		position: absolute;
 		position: absolute;