jodit 4.13.24 → 4.13.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +4 -4
  4. package/es2015/jodit.js +62 -16
  5. package/es2015/jodit.min.js +4 -4
  6. package/es2015/plugins/debug/debug.css +1 -1
  7. package/es2015/plugins/debug/debug.js +1 -1
  8. package/es2015/plugins/debug/debug.min.js +1 -1
  9. package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
  10. package/es2015/plugins/speech-recognize/speech-recognize.js +1 -1
  11. package/es2015/plugins/speech-recognize/speech-recognize.min.js +1 -1
  12. package/es2018/jodit.fat.min.js +4 -4
  13. package/es2018/jodit.min.js +4 -4
  14. package/es2018/plugins/debug/debug.min.js +1 -1
  15. package/es2018/plugins/speech-recognize/speech-recognize.min.js +1 -1
  16. package/es2021/jodit.css +1 -1
  17. package/es2021/jodit.fat.min.js +4 -4
  18. package/es2021/jodit.js +61 -15
  19. package/es2021/jodit.min.js +4 -4
  20. package/es2021/plugins/debug/debug.css +1 -1
  21. package/es2021/plugins/debug/debug.js +1 -1
  22. package/es2021/plugins/debug/debug.min.js +1 -1
  23. package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
  24. package/es2021/plugins/speech-recognize/speech-recognize.js +1 -1
  25. package/es2021/plugins/speech-recognize/speech-recognize.min.js +1 -1
  26. package/es2021.en/jodit.css +1 -1
  27. package/es2021.en/jodit.fat.min.js +4 -4
  28. package/es2021.en/jodit.js +61 -15
  29. package/es2021.en/jodit.min.js +25 -25
  30. package/es2021.en/plugins/debug/debug.css +1 -1
  31. package/es2021.en/plugins/debug/debug.js +1 -1
  32. package/es2021.en/plugins/debug/debug.min.js +1 -1
  33. package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
  34. package/es2021.en/plugins/speech-recognize/speech-recognize.js +1 -1
  35. package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +1 -1
  36. package/es5/jodit.css +2 -2
  37. package/es5/jodit.fat.min.js +2 -2
  38. package/es5/jodit.js +62 -16
  39. package/es5/jodit.min.css +2 -2
  40. package/es5/jodit.min.js +2 -2
  41. package/es5/plugins/debug/debug.css +1 -1
  42. package/es5/plugins/debug/debug.js +1 -1
  43. package/es5/plugins/debug/debug.min.js +1 -1
  44. package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
  45. package/es5/plugins/speech-recognize/speech-recognize.js +1 -1
  46. package/es5/plugins/speech-recognize/speech-recognize.min.js +1 -1
  47. package/es5/polyfills.fat.min.js +1 -1
  48. package/es5/polyfills.js +1 -1
  49. package/es5/polyfills.min.js +1 -1
  50. package/esm/core/constants.js +1 -1
  51. package/esm/core/decorators/cache/cache.js +21 -3
  52. package/esm/core/ui/popup/popup.js +13 -1
  53. package/esm/modules/toolbar/button/button.js +19 -11
  54. package/esm/modules/widget/color-picker/color-picker.js +8 -0
  55. package/package.json +1 -1
package/es2021/jodit.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
3
3
  * Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
4
- * Version: v4.13.24
4
+ * Version: v4.13.26
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -1843,7 +1843,7 @@ __webpack_require__.r(__webpack_exports__);
1843
1843
  * ```
1844
1844
  * @packageDocumentation
1845
1845
  * @module constants
1846
- */ const APP_VERSION = "4.13.24";
1846
+ */ const APP_VERSION = "4.13.26";
1847
1847
  // prettier-ignore
1848
1848
  const ES = "es2021";
1849
1849
  const IS_ES_MODERN = true;
@@ -2441,20 +2441,41 @@ class Create {
2441
2441
  return value;
2442
2442
  };
2443
2443
  }
2444
+ function getOwnerDocument(component) {
2445
+ const od = component.od;
2446
+ return od ?? document;
2447
+ }
2444
2448
  function cacheHTML(target, _, descriptor) {
2445
2449
  const fn = descriptor.value;
2446
2450
  if (!(0,jodit_core_helpers_checker__WEBPACK_IMPORTED_MODULE_2__.isFunction)(fn)) {
2447
2451
  throw (0,jodit_core_helpers_utils_error_error__WEBPACK_IMPORTED_MODULE_3__.error)('Handler must be a Function');
2448
2452
  }
2449
2453
  let useCache = true;
2450
- const cached = new WeakMap();
2454
+ /**
2455
+ * The cache is keyed by the owner document first and only then by the
2456
+ * component class. A page can create editors inside different documents
2457
+ * (iframes) and destroy those documents later: a template cached from a
2458
+ * dead document would otherwise be cloned for every subsequent editor,
2459
+ * whose buttons then never react to clicks.
2460
+ */ const cached = new WeakMap();
2451
2461
  descriptor.value = function(...attrs) {
2452
- if (useCache && cached.has(this.constructor)) {
2453
- return cached.get(this.constructor)?.cloneNode(true);
2462
+ const doc = getOwnerDocument(this);
2463
+ const docCache = cached.get(doc);
2464
+ if (useCache && docCache?.has(this.constructor)) {
2465
+ return docCache.get(this.constructor)?.cloneNode(true);
2454
2466
  }
2455
2467
  const value = fn.apply(this, attrs);
2456
2468
  if (useCache && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(value)) {
2457
- cached.set(this.constructor, value);
2469
+ if (docCache) {
2470
+ docCache.set(this.constructor, value);
2471
+ } else {
2472
+ cached.set(doc, new WeakMap([
2473
+ [
2474
+ this.constructor,
2475
+ value
2476
+ ]
2477
+ ]));
2478
+ }
2458
2479
  }
2459
2480
  return useCache ? value.cloneNode(true) : value;
2460
2481
  };
@@ -16444,6 +16465,15 @@ class Popup extends jodit_core_ui_group_group__WEBPACK_IMPORTED_MODULE_9__.UIGro
16444
16465
  this.j.e.fire(this, 'beforeClose');
16445
16466
  this.j.e.fire('beforePopupClose', this);
16446
16467
  this.__removeGlobalListeners();
16468
+ // Blur a focused control (e.g. the color picker hex input) before
16469
+ // the container goes away. Chrome fires `blur`/`change` for a
16470
+ // removed focused element in the middle of `removeChild`, Firefox
16471
+ // does not fire them at all. Blurring first makes both browsers
16472
+ // run those handlers while the popup is still in the DOM. See #1458
16473
+ const { activeElement } = this.od;
16474
+ if (activeElement && activeElement !== this.container && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_4__.Dom.isOrContains(this.container, activeElement) && (0,jodit_core_helpers__WEBPACK_IMPORTED_MODULE_6__.isFunction)(activeElement.blur)) {
16475
+ activeElement.blur();
16476
+ }
16447
16477
  jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_4__.Dom.safeRemove(this.container);
16448
16478
  return this;
16449
16479
  }
@@ -24073,15 +24103,23 @@ class ToolbarButton extends jodit_core_ui_button__WEBPACK_IMPORTED_MODULE_19__.U
24073
24103
  return this.openedPopup;
24074
24104
  }
24075
24105
  __closePopup() {
24076
- if (this.openedPopup) {
24077
- this.j.e.off(this.ow, 'mousedown touchstart', this.onOutsideClick).off('escape closeAllPopups', this.onOutsideClick);
24078
- this.state.activated = false;
24079
- this.openedPopup.close();
24080
- this.openedPopup.destruct();
24081
- this.openedPopup = null;
24082
- if (this.trigger) {
24083
- (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_17__.attr)(this.trigger, 'aria-expanded', false);
24084
- }
24106
+ const popup = this.openedPopup;
24107
+ if (!popup) {
24108
+ return;
24109
+ }
24110
+ // Detach first: removing a popup that holds the focused element
24111
+ // makes Chrome fire `blur`/`change` on it synchronously, and a
24112
+ // handler there may call the popup's `close` callback again.
24113
+ // A re-entrant call must be a no-op, otherwise it destructs the
24114
+ // popup while the outer `removeChild` is still running and Chrome
24115
+ // throws NotFoundError. See #1458
24116
+ this.openedPopup = null;
24117
+ this.j.e.off(this.ow, 'mousedown touchstart', this.onOutsideClick).off('escape closeAllPopups', this.onOutsideClick);
24118
+ this.state.activated = false;
24119
+ popup.close();
24120
+ popup.destruct();
24121
+ if (this.trigger) {
24122
+ (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_17__.attr)(this.trigger, 'aria-expanded', false);
24085
24123
  }
24086
24124
  }
24087
24125
  /**
@@ -25428,8 +25466,15 @@ jodit_core_ui__WEBPACK_IMPORTED_MODULE_2__.Icon.set('palette', (_palette_svg__WE
25428
25466
  const { extra } = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.refs)(form);
25429
25467
  extra.appendChild(editor.c.fromHTML(`<div class="${cn}__hex"><input data-ref="hexInput" type="text" spellcheck="false" aria-label="HEX" placeholder="#FF0000" value="${valueHex || ''}"/></div>`));
25430
25468
  const { hexInput } = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.refs)(form);
25469
+ // Enter applies the value and closes the popup; removing the focused
25470
+ // input then makes Chrome fire `change` on it, which would apply the
25471
+ // same color a second time and toggle it off again. See #1459
25472
+ let appliedHexValue = null;
25431
25473
  const applyHexInput = ()=>{
25432
25474
  const raw = hexInput.value.trim();
25475
+ if (raw === appliedHexValue) {
25476
+ return;
25477
+ }
25433
25478
  const isHex = /^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(raw);
25434
25479
  const isRgb = /^rgba?\([\d\s.,%]+\)$/i.test(raw);
25435
25480
  if (!isHex && !isRgb) {
@@ -25437,6 +25482,7 @@ jodit_core_ui__WEBPACK_IMPORTED_MODULE_2__.Icon.set('palette', (_palette_svg__WE
25437
25482
  }
25438
25483
  const color = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.normalizeColor)(isHex && !raw.startsWith('#') ? '#' + raw : raw);
25439
25484
  if (color && (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.isFunction)(callback)) {
25485
+ appliedHexValue = raw;
25440
25486
  callback(color);
25441
25487
  }
25442
25488
  };