suneditor 3.0.0-beta.9 → 3.0.0-rc.2
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.
- package/README.md +65 -57
- package/dist/suneditor-contents.min.css +1 -0
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +110 -61
- package/src/assets/design/color.css +36 -17
- package/src/assets/design/size.css +2 -0
- package/src/assets/icons/defaultIcons.js +17 -2
- package/src/assets/suneditor-contents.css +51 -16
- package/src/assets/suneditor.css +116 -43
- package/src/core/config/contextProvider.js +288 -0
- package/src/core/config/eventManager.js +188 -0
- package/src/core/config/instanceCheck.js +59 -0
- package/src/core/config/optionProvider.js +452 -0
- package/src/core/editor.js +166 -1637
- package/src/core/event/actions/index.js +229 -0
- package/src/core/event/effects/common.registry.js +74 -0
- package/src/core/event/effects/keydown.registry.js +573 -0
- package/src/core/event/effects/ruleHelpers.js +148 -0
- package/src/core/event/eventOrchestrator.js +944 -0
- package/src/core/event/executor.js +27 -0
- package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
- package/src/core/event/handlers/handler_ww_input.js +75 -0
- package/src/core/event/handlers/handler_ww_key.js +228 -0
- package/src/core/event/handlers/handler_ww_mouse.js +166 -0
- package/src/core/event/ports.js +211 -0
- package/src/core/event/reducers/keydown.reducer.js +97 -0
- package/src/core/event/rules/keydown.rule.arrow.js +63 -0
- package/src/core/event/rules/keydown.rule.backspace.js +208 -0
- package/src/core/event/rules/keydown.rule.delete.js +132 -0
- package/src/core/event/rules/keydown.rule.enter.js +150 -0
- package/src/core/event/rules/keydown.rule.tab.js +35 -0
- package/src/core/event/support/defaultLineManager.js +136 -0
- package/src/core/event/support/selectionState.js +204 -0
- package/src/core/kernel/coreKernel.js +320 -0
- package/src/core/kernel/kernelInjector.js +19 -0
- package/src/core/kernel/store.js +173 -0
- package/src/core/{class → logic/dom}/char.js +42 -45
- package/src/core/logic/dom/format.js +1075 -0
- package/src/core/{class → logic/dom}/html.js +743 -624
- package/src/core/logic/dom/inline.js +1847 -0
- package/src/core/logic/dom/listFormat.js +601 -0
- package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
- package/src/core/{class → logic/dom}/offset.js +254 -317
- package/src/core/logic/dom/selection.js +754 -0
- package/src/core/logic/panel/menu.js +389 -0
- package/src/core/logic/panel/toolbar.js +449 -0
- package/src/core/logic/panel/viewer.js +761 -0
- package/src/core/logic/shell/_commandExecutor.js +380 -0
- package/src/core/logic/shell/commandDispatcher.js +241 -0
- package/src/core/logic/shell/component.js +970 -0
- package/src/core/logic/shell/focusManager.js +110 -0
- package/src/core/{base → logic/shell}/history.js +110 -60
- package/src/core/logic/shell/pluginManager.js +363 -0
- package/src/core/logic/shell/shortcuts.js +130 -0
- package/src/core/logic/shell/ui.js +904 -0
- package/src/core/schema/context.js +66 -0
- package/src/core/schema/frameContext.js +160 -0
- package/src/core/schema/options.js +628 -0
- package/src/core/section/constructor.js +194 -500
- package/src/core/section/documentType.js +297 -222
- package/src/events.js +808 -543
- package/src/helper/clipboard.js +27 -16
- package/src/helper/converter.js +100 -78
- package/src/helper/dom/domCheck.js +56 -30
- package/src/helper/dom/domQuery.js +159 -89
- package/src/helper/dom/domUtils.js +114 -49
- package/src/helper/dom/index.js +5 -1
- package/src/helper/env.js +26 -26
- package/src/helper/index.js +1 -1
- package/src/helper/keyCodeMap.js +25 -28
- package/src/helper/numbers.js +4 -8
- package/src/helper/unicode.js +4 -8
- package/src/hooks/base.js +307 -0
- package/src/hooks/params.js +130 -0
- package/src/interfaces/contracts.js +227 -0
- package/src/interfaces/index.js +7 -0
- package/src/interfaces/plugins.js +239 -0
- package/src/langs/ckb.js +4 -4
- package/src/langs/cs.js +4 -4
- package/src/langs/da.js +4 -4
- package/src/langs/de.js +4 -4
- package/src/langs/en.js +4 -4
- package/src/langs/es.js +4 -4
- package/src/langs/fa.js +4 -4
- package/src/langs/fr.js +4 -4
- package/src/langs/he.js +4 -4
- package/src/langs/hu.js +4 -4
- package/src/langs/it.js +4 -4
- package/src/langs/ja.js +4 -4
- package/src/langs/km.js +4 -4
- package/src/langs/ko.js +4 -4
- package/src/langs/lv.js +4 -4
- package/src/langs/nl.js +4 -4
- package/src/langs/pl.js +4 -4
- package/src/langs/pt_br.js +13 -13
- package/src/langs/ro.js +4 -4
- package/src/langs/ru.js +4 -4
- package/src/langs/se.js +4 -4
- package/src/langs/tr.js +4 -4
- package/src/langs/uk.js +4 -4
- package/src/langs/ur.js +4 -4
- package/src/langs/zh_cn.js +4 -4
- package/src/modules/{Browser.js → contract/Browser.js} +119 -128
- package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
- package/src/modules/contract/Controller.js +589 -0
- package/src/modules/{Figure.js → contract/Figure.js} +591 -411
- package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
- package/src/modules/contract/Modal.js +357 -0
- package/src/modules/contract/index.js +9 -0
- package/src/modules/manager/ApiManager.js +197 -0
- package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
- package/src/modules/manager/index.js +5 -0
- package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
- package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
- package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
- package/src/modules/ui/index.js +6 -0
- package/src/plugins/browser/audioGallery.js +23 -26
- package/src/plugins/browser/fileBrowser.js +25 -28
- package/src/plugins/browser/fileGallery.js +20 -23
- package/src/plugins/browser/imageGallery.js +24 -23
- package/src/plugins/browser/videoGallery.js +27 -29
- package/src/plugins/command/blockquote.js +11 -17
- package/src/plugins/command/exportPDF.js +26 -26
- package/src/plugins/command/fileUpload.js +138 -133
- package/src/plugins/command/list_bulleted.js +48 -44
- package/src/plugins/command/list_numbered.js +48 -44
- package/src/plugins/dropdown/align.js +64 -50
- package/src/plugins/dropdown/backgroundColor.js +34 -35
- package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
- package/src/plugins/dropdown/font.js +50 -36
- package/src/plugins/dropdown/fontColor.js +34 -35
- package/src/plugins/dropdown/hr.js +55 -50
- package/src/plugins/dropdown/layout.js +20 -15
- package/src/plugins/dropdown/lineHeight.js +46 -30
- package/src/plugins/dropdown/list.js +32 -33
- package/src/plugins/dropdown/paragraphStyle.js +40 -34
- package/src/plugins/dropdown/table/index.js +915 -0
- package/src/plugins/dropdown/table/render/table.html.js +308 -0
- package/src/plugins/dropdown/table/render/table.menu.js +121 -0
- package/src/plugins/dropdown/table/services/table.cell.js +465 -0
- package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
- package/src/plugins/dropdown/table/services/table.grid.js +504 -0
- package/src/plugins/dropdown/table/services/table.resize.js +463 -0
- package/src/plugins/dropdown/table/services/table.selection.js +466 -0
- package/src/plugins/dropdown/table/services/table.style.js +844 -0
- package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
- package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
- package/src/plugins/dropdown/template.js +20 -15
- package/src/plugins/dropdown/textStyle.js +28 -22
- package/src/plugins/field/mention.js +54 -49
- package/src/plugins/index.js +5 -5
- package/src/plugins/input/fontSize.js +100 -97
- package/src/plugins/input/pageNavigator.js +13 -10
- package/src/plugins/modal/audio.js +208 -219
- package/src/plugins/modal/drawing.js +99 -104
- package/src/plugins/modal/embed.js +323 -312
- package/src/plugins/modal/image/index.js +942 -0
- package/src/plugins/modal/image/render/image.html.js +150 -0
- package/src/plugins/modal/image/services/image.size.js +198 -0
- package/src/plugins/modal/image/services/image.upload.js +216 -0
- package/src/plugins/modal/image/shared/image.constants.js +20 -0
- package/src/plugins/modal/link.js +74 -54
- package/src/plugins/modal/math.js +126 -119
- package/src/plugins/modal/video/index.js +858 -0
- package/src/plugins/modal/video/render/video.html.js +131 -0
- package/src/plugins/modal/video/services/video.size.js +281 -0
- package/src/plugins/modal/video/services/video.upload.js +92 -0
- package/src/plugins/popup/anchor.js +57 -49
- package/src/suneditor.js +73 -61
- package/src/themes/cobalt.css +155 -0
- package/src/themes/dark.css +143 -120
- package/src/typedef.js +214 -63
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/assets/suneditor-contents.css.d.ts +1 -0
- package/types/assets/suneditor.css.d.ts +1 -0
- package/types/core/config/contextProvider.d.ts +148 -0
- package/types/core/config/eventManager.d.ts +68 -0
- package/types/core/config/instanceCheck.d.ts +33 -0
- package/types/core/config/optionProvider.d.ts +147 -0
- package/types/core/editor.d.ts +27 -586
- package/types/core/event/actions/index.d.ts +50 -0
- package/types/core/event/effects/common.registry.d.ts +56 -0
- package/types/core/event/effects/keydown.registry.d.ts +80 -0
- package/types/core/event/effects/ruleHelpers.d.ts +36 -0
- package/types/core/event/eventOrchestrator.d.ts +191 -0
- package/types/core/event/executor.d.ts +13 -0
- package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
- package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
- package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
- package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
- package/types/core/event/ports.d.ts +256 -0
- package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
- package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
- package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
- package/types/core/event/support/defaultLineManager.d.ts +22 -0
- package/types/core/event/support/selectionState.d.ts +29 -0
- package/types/core/kernel/coreKernel.d.ts +219 -0
- package/types/core/kernel/kernelInjector.d.ts +16 -0
- package/types/core/kernel/store.d.ts +170 -0
- package/types/core/logic/dom/char.d.ts +46 -0
- package/types/core/logic/dom/format.d.ts +234 -0
- package/types/core/logic/dom/html.d.ts +290 -0
- package/types/core/logic/dom/inline.d.ts +93 -0
- package/types/core/logic/dom/listFormat.d.ts +101 -0
- package/types/core/logic/dom/nodeTransform.d.ts +110 -0
- package/types/core/logic/dom/offset.d.ts +335 -0
- package/types/core/logic/dom/selection.d.ts +165 -0
- package/types/core/logic/panel/menu.d.ts +93 -0
- package/types/core/logic/panel/toolbar.d.ts +128 -0
- package/types/core/logic/panel/viewer.d.ts +89 -0
- package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
- package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
- package/types/core/logic/shell/component.d.ts +182 -0
- package/types/core/logic/shell/focusManager.d.ts +31 -0
- package/types/core/{base → logic/shell}/history.d.ts +13 -12
- package/types/core/logic/shell/pluginManager.d.ts +115 -0
- package/types/core/logic/shell/shortcuts.d.ts +131 -0
- package/types/core/logic/shell/ui.d.ts +261 -0
- package/types/core/schema/context.d.ts +104 -0
- package/types/core/schema/frameContext.d.ts +320 -0
- package/types/core/schema/options.d.ts +1241 -0
- package/types/core/section/constructor.d.ts +117 -652
- package/types/core/section/documentType.d.ts +43 -61
- package/types/events.d.ts +796 -65
- package/types/helper/clipboard.d.ts +5 -4
- package/types/helper/converter.d.ts +55 -43
- package/types/helper/dom/domCheck.d.ts +27 -19
- package/types/helper/dom/domQuery.d.ts +76 -57
- package/types/helper/dom/domUtils.d.ts +62 -39
- package/types/helper/dom/index.d.ts +87 -1
- package/types/helper/env.d.ts +16 -13
- package/types/helper/index.d.ts +8 -2
- package/types/helper/keyCodeMap.d.ts +24 -23
- package/types/helper/numbers.d.ts +4 -6
- package/types/helper/unicode.d.ts +4 -3
- package/types/hooks/base.d.ts +239 -0
- package/types/hooks/params.d.ts +65 -0
- package/types/index.d.ts +20 -117
- package/types/interfaces/contracts.d.ts +183 -0
- package/types/interfaces/index.d.ts +3 -0
- package/types/interfaces/plugins.d.ts +168 -0
- package/types/langs/_Lang.d.ts +2 -2
- package/types/langs/index.d.ts +2 -2
- package/types/modules/contract/Browser.d.ts +262 -0
- package/types/modules/contract/ColorPicker.d.ts +99 -0
- package/types/modules/contract/Controller.d.ts +204 -0
- package/types/modules/contract/Figure.d.ts +529 -0
- package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
- package/types/modules/contract/Modal.d.ts +62 -0
- package/types/modules/contract/index.d.ts +7 -0
- package/types/modules/manager/ApiManager.d.ts +106 -0
- package/types/modules/manager/FileManager.d.ts +124 -0
- package/types/modules/manager/index.d.ts +3 -0
- package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
- package/types/modules/ui/SelectMenu.d.ts +107 -0
- package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
- package/types/modules/ui/index.d.ts +4 -0
- package/types/plugins/browser/audioGallery.d.ts +33 -41
- package/types/plugins/browser/fileBrowser.d.ts +42 -50
- package/types/plugins/browser/fileGallery.d.ts +33 -41
- package/types/plugins/browser/imageGallery.d.ts +30 -37
- package/types/plugins/browser/videoGallery.d.ts +33 -41
- package/types/plugins/command/blockquote.d.ts +4 -21
- package/types/plugins/command/exportPDF.d.ts +23 -33
- package/types/plugins/command/fileUpload.d.ts +80 -100
- package/types/plugins/command/list_bulleted.d.ts +9 -35
- package/types/plugins/command/list_numbered.d.ts +9 -35
- package/types/plugins/dropdown/align.d.ts +23 -46
- package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
- package/types/plugins/dropdown/blockStyle.d.ts +45 -0
- package/types/plugins/dropdown/font.d.ts +18 -41
- package/types/plugins/dropdown/fontColor.d.ts +35 -53
- package/types/plugins/dropdown/hr.d.ts +26 -52
- package/types/plugins/dropdown/layout.d.ts +19 -25
- package/types/plugins/dropdown/lineHeight.d.ts +21 -39
- package/types/plugins/dropdown/list.d.ts +6 -34
- package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
- package/types/plugins/dropdown/table/index.d.ts +158 -0
- package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
- package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
- package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
- package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
- package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
- package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
- package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
- package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
- package/types/plugins/dropdown/template.d.ts +19 -25
- package/types/plugins/dropdown/textStyle.d.ts +23 -30
- package/types/plugins/field/mention.d.ts +66 -72
- package/types/plugins/index.d.ts +41 -40
- package/types/plugins/input/fontSize.d.ts +57 -96
- package/types/plugins/input/pageNavigator.d.ts +5 -8
- package/types/plugins/modal/audio.d.ts +60 -153
- package/types/plugins/modal/drawing.d.ts +16 -118
- package/types/plugins/modal/embed.d.ts +46 -166
- package/types/plugins/modal/image/index.d.ts +281 -0
- package/types/plugins/modal/image/render/image.html.d.ts +45 -0
- package/types/plugins/modal/image/services/image.size.d.ts +55 -0
- package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
- package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
- package/types/plugins/modal/link.d.ts +46 -66
- package/types/plugins/modal/math.d.ts +17 -86
- package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
- package/types/plugins/modal/video/render/video.html.d.ts +37 -0
- package/types/plugins/modal/video/services/video.size.d.ts +74 -0
- package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
- package/types/plugins/popup/anchor.d.ts +8 -38
- package/types/suneditor.d.ts +55 -24
- package/types/typedef.d.ts +344 -228
- package/CONTRIBUTING.md +0 -186
- package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
- package/src/core/base/eventManager.js +0 -1523
- package/src/core/class/component.js +0 -856
- package/src/core/class/format.js +0 -3433
- package/src/core/class/menu.js +0 -346
- package/src/core/class/selection.js +0 -610
- package/src/core/class/shortcuts.js +0 -98
- package/src/core/class/toolbar.js +0 -431
- package/src/core/class/ui.js +0 -424
- package/src/core/class/viewer.js +0 -750
- package/src/core/section/actives.js +0 -266
- package/src/core/section/context.js +0 -102
- package/src/editorInjector/_classes.js +0 -36
- package/src/editorInjector/_core.js +0 -87
- package/src/editorInjector/index.js +0 -73
- package/src/modules/ApiManager.js +0 -191
- package/src/modules/Controller.js +0 -474
- package/src/modules/Modal.js +0 -346
- package/src/modules/index.js +0 -14
- package/src/plugins/dropdown/table.js +0 -4034
- package/src/plugins/modal/image.js +0 -1376
- package/src/plugins/modal/video.js +0 -1226
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
- package/types/core/base/eventManager.d.ts +0 -401
- package/types/core/class/char.d.ts +0 -61
- package/types/core/class/component.d.ts +0 -213
- package/types/core/class/format.d.ts +0 -623
- package/types/core/class/html.d.ts +0 -430
- package/types/core/class/menu.d.ts +0 -126
- package/types/core/class/nodeTransform.d.ts +0 -93
- package/types/core/class/offset.d.ts +0 -522
- package/types/core/class/selection.d.ts +0 -188
- package/types/core/class/shortcuts.d.ts +0 -142
- package/types/core/class/toolbar.d.ts +0 -189
- package/types/core/class/ui.d.ts +0 -164
- package/types/core/class/viewer.d.ts +0 -140
- package/types/core/section/actives.d.ts +0 -46
- package/types/core/section/context.d.ts +0 -45
- package/types/editorInjector/_classes.d.ts +0 -41
- package/types/editorInjector/_core.d.ts +0 -87
- package/types/editorInjector/index.d.ts +0 -69
- package/types/modules/ApiManager.d.ts +0 -125
- package/types/modules/Browser.d.ts +0 -326
- package/types/modules/ColorPicker.d.ts +0 -135
- package/types/modules/Controller.d.ts +0 -251
- package/types/modules/Figure.d.ts +0 -517
- package/types/modules/FileManager.d.ts +0 -202
- package/types/modules/Modal.d.ts +0 -111
- package/types/modules/ModalAnchorEditor.d.ts +0 -236
- package/types/modules/SelectMenu.d.ts +0 -194
- package/types/modules/index.d.ts +0 -26
- package/types/plugins/dropdown/formatBlock.d.ts +0 -55
- package/types/plugins/dropdown/table.d.ts +0 -627
- package/types/plugins/modal/image.d.ts +0 -451
- /package/{LICENSE → LICENSE.txt} +0 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { dom, env } from '../../helper';
|
|
2
|
+
|
|
3
|
+
const { _w, _d } = env;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {import('../schema/frameContext').FrameContextStore} ConfigFrameContextStore
|
|
7
|
+
* @typedef {import('../schema/context').ContextStore} ConfigContextStore
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {Object} ContextMap
|
|
12
|
+
* @property {(k: keyof ConfigContextStore) => HTMLElement|null} get - Get a DOM element from the context by key.
|
|
13
|
+
* @property {(k: keyof ConfigContextStore, v: HTMLElement) => void} set - Set a DOM element in the context by key.
|
|
14
|
+
* @property {(k: keyof ConfigContextStore) => boolean} has - Check if a key exists in the context.
|
|
15
|
+
* @property {(k: keyof ConfigContextStore) => boolean} delete - Delete a key from the context.
|
|
16
|
+
* @property {() => Object<keyof ConfigContextStore, HTMLElement|null>} [getAll] - Get all DOM elements in the context as an object.
|
|
17
|
+
* @property {number} size - Get context size
|
|
18
|
+
* @property {() => void} clear - Clear all elements in the context.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {Object} FrameContextMap
|
|
23
|
+
* @property {<K extends keyof ConfigFrameContextStore>(k: K) => ConfigFrameContextStore[K]} get - Get a DOM element from the context by key.
|
|
24
|
+
* @property {<K extends keyof ConfigFrameContextStore>(k: K, v: ConfigFrameContextStore[K]) => void} set - Set a DOM element in the context by key.
|
|
25
|
+
* @property {<K extends keyof ConfigFrameContextStore>(k: K) => boolean} has - Check if a key exists in the context.
|
|
26
|
+
* @property {<K extends keyof ConfigFrameContextStore>(k: K) => boolean} delete - Delete a key from the context.
|
|
27
|
+
* @property {() => Object<keyof ConfigFrameContextStore, *>} [getAll] - Get all DOM elements in the context as an object.
|
|
28
|
+
* @property {(newMap: *) => void} [reset] - Reset the context with a new Map.
|
|
29
|
+
* @property {number} size - Get context size
|
|
30
|
+
* @property {() => void} clear - Clear all elements in the context.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @description Provides Map-based access to editor DOM contexts (global and per-frame).
|
|
35
|
+
*/
|
|
36
|
+
export default class ContextProvider {
|
|
37
|
+
/**
|
|
38
|
+
* @description Frame root map
|
|
39
|
+
*/
|
|
40
|
+
#frameRoots;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @description Utility object that manages the editor's runtime context.
|
|
44
|
+
* Provides methods to get, set, and inspect internal context.
|
|
45
|
+
*/
|
|
46
|
+
#contextMap;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @description Utility object that manages the editor's runtime [frame] context.
|
|
50
|
+
* Provides methods to get, set, and inspect internal context.
|
|
51
|
+
* @type {FrameContextMap}
|
|
52
|
+
*/
|
|
53
|
+
#frameContextMap;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @constructor
|
|
57
|
+
* @param {import('../section/constructor').ConstructorReturnType} product
|
|
58
|
+
*/
|
|
59
|
+
constructor(product) {
|
|
60
|
+
this.#frameRoots = product.frameRoots;
|
|
61
|
+
this.#contextMap = this.#CreateContextMap(product.context);
|
|
62
|
+
this.#frameContextMap = this.#CreateFrameContextMap({ value: new Map() });
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @description Frame root key array
|
|
66
|
+
* @type {Array<*>}
|
|
67
|
+
*/
|
|
68
|
+
this.rootKeys = product.rootKeys;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @description Controllers carrier
|
|
72
|
+
* @type {HTMLElement}
|
|
73
|
+
*/
|
|
74
|
+
this.carrierWrapper = product.carrierWrapper;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @description Default icons object
|
|
78
|
+
* @type {Object<string, string>}
|
|
79
|
+
*/
|
|
80
|
+
this.icons = product.icons;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @description loaded language
|
|
84
|
+
* @type {Object<string, *>}
|
|
85
|
+
*/
|
|
86
|
+
this.lang = product.lang;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @description Closest ShadowRoot to editor if found
|
|
90
|
+
* @type {ShadowRoot & { getSelection?: () => Selection }} - Chromium-based browsers (Chrome, Edge, etc.) has a getSelection method on the ShadowRoot
|
|
91
|
+
*/
|
|
92
|
+
this.shadowRoot = null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
get frameRoots() {
|
|
96
|
+
return this.#frameRoots;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
get context() {
|
|
100
|
+
return this.#contextMap;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get frameContext() {
|
|
104
|
+
return this.#frameContextMap;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
init() {
|
|
108
|
+
this.applyToRoots((e) => {
|
|
109
|
+
this.#setEditorParams(e);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @param {SunEditor.FrameContext} rt Root target[key] FrameContext
|
|
115
|
+
*/
|
|
116
|
+
reset(rt) {
|
|
117
|
+
this.#frameContextMap.reset(rt);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @description Execute a function by traversing all root targets.
|
|
122
|
+
* @param {(frameContext: SunEditor.FrameContext, rootKey: string|null, frameRoots: Map<string|null, SunEditor.FrameContext>) => void} f Callback function
|
|
123
|
+
*/
|
|
124
|
+
applyToRoots(f) {
|
|
125
|
+
this.#frameRoots.forEach(f);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @description Set the FrameContext parameters and options
|
|
130
|
+
* @param {SunEditor.FrameContext} e - Frame context object
|
|
131
|
+
*/
|
|
132
|
+
#setEditorParams(e) {
|
|
133
|
+
const frameOptions = e.get('options');
|
|
134
|
+
|
|
135
|
+
e.set('wwComputedStyle', _w.getComputedStyle(e.get('wysiwyg')));
|
|
136
|
+
|
|
137
|
+
if (!frameOptions.get('iframe') && typeof ShadowRoot === 'function') {
|
|
138
|
+
let child = e.get('wysiwygFrame');
|
|
139
|
+
while (child) {
|
|
140
|
+
if (child.shadowRoot) {
|
|
141
|
+
this.shadowRoot = child.shadowRoot;
|
|
142
|
+
break;
|
|
143
|
+
} else if (child instanceof ShadowRoot) {
|
|
144
|
+
this.shadowRoot = child;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
child = /** @type {SunEditor.WysiwygFrame} */ (child.parentNode);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// init, validate
|
|
152
|
+
if (frameOptions.get('iframe')) {
|
|
153
|
+
e.set('_ww', e.get('wysiwygFrame').contentWindow);
|
|
154
|
+
e.set('_wd', e.get('wysiwygFrame').contentDocument);
|
|
155
|
+
e.set('wysiwyg', e.get('_wd').body);
|
|
156
|
+
// e.get('wysiwyg').className += ' ' + options.get('_editableClass');
|
|
157
|
+
if (frameOptions.get('_defaultStyles').editor) e.get('wysiwyg').style.cssText = frameOptions.get('_defaultStyles').editor;
|
|
158
|
+
if (frameOptions.get('height') === 'auto') e.set('_iframeAuto', e.get('_wd').body);
|
|
159
|
+
} else {
|
|
160
|
+
e.set('_ww', _w);
|
|
161
|
+
e.set('_wd', _d);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// wisywig attributes
|
|
165
|
+
const attr = frameOptions.get('editableFrameAttributes');
|
|
166
|
+
for (const k in attr) {
|
|
167
|
+
e.get('wysiwyg').setAttribute(k, attr[k]);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @description Creates a utility wrapper for editor base options.
|
|
173
|
+
* - Provides get, set, has, getAll with internal Map support.
|
|
174
|
+
* @param {*} _context - Origin options object
|
|
175
|
+
* @returns {ContextMap}
|
|
176
|
+
*/
|
|
177
|
+
#CreateContextMap(_context) {
|
|
178
|
+
const store = _context;
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
get(k) {
|
|
182
|
+
return store.get(k);
|
|
183
|
+
},
|
|
184
|
+
set(k, v) {
|
|
185
|
+
return store.set(k, v);
|
|
186
|
+
},
|
|
187
|
+
has(k) {
|
|
188
|
+
return store.has(k);
|
|
189
|
+
},
|
|
190
|
+
delete(k) {
|
|
191
|
+
return store.delete(k);
|
|
192
|
+
},
|
|
193
|
+
getAll() {
|
|
194
|
+
return Object.fromEntries(store.entries());
|
|
195
|
+
},
|
|
196
|
+
get size() {
|
|
197
|
+
return store.size;
|
|
198
|
+
},
|
|
199
|
+
clear() {
|
|
200
|
+
store.clear();
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @description Creates a utility wrapper for editor base options.
|
|
207
|
+
* - Provides get, set, has, getAll with internal Map support.
|
|
208
|
+
* @param {{value: Map}} _frameContext - The editor instance
|
|
209
|
+
* @returns {FrameContextMap}
|
|
210
|
+
*/
|
|
211
|
+
#CreateFrameContextMap(_frameContext) {
|
|
212
|
+
let store = _frameContext.value;
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
/**
|
|
216
|
+
* @template {keyof ConfigFrameContextStore} K
|
|
217
|
+
* @param {K} k
|
|
218
|
+
* @returns {ConfigFrameContextStore[K]}
|
|
219
|
+
*/
|
|
220
|
+
get(k) {
|
|
221
|
+
return store.get(k);
|
|
222
|
+
},
|
|
223
|
+
/**
|
|
224
|
+
* @template {keyof ConfigFrameContextStore} K
|
|
225
|
+
* @param {K} k
|
|
226
|
+
* @param {ConfigFrameContextStore[K]} v
|
|
227
|
+
*/
|
|
228
|
+
set(k, v) {
|
|
229
|
+
return store.set(k, v);
|
|
230
|
+
},
|
|
231
|
+
/**
|
|
232
|
+
* @template {keyof ConfigFrameContextStore} K
|
|
233
|
+
* @param {K} k
|
|
234
|
+
* @returns {boolean}
|
|
235
|
+
*/
|
|
236
|
+
has(k) {
|
|
237
|
+
return store.has(k);
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* @template {keyof ConfigFrameContextStore} K
|
|
241
|
+
* @param {K} k
|
|
242
|
+
* @returns {boolean}
|
|
243
|
+
*/
|
|
244
|
+
delete(k) {
|
|
245
|
+
return store.delete(k);
|
|
246
|
+
},
|
|
247
|
+
getAll() {
|
|
248
|
+
return Object.fromEntries(store.entries());
|
|
249
|
+
},
|
|
250
|
+
/** @param {*} newMap */
|
|
251
|
+
reset(newMap) {
|
|
252
|
+
store = _frameContext.value = newMap;
|
|
253
|
+
},
|
|
254
|
+
get size() {
|
|
255
|
+
return store.size;
|
|
256
|
+
},
|
|
257
|
+
clear() {
|
|
258
|
+
store.clear();
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
_destroy() {
|
|
264
|
+
/** clear frame roots */
|
|
265
|
+
this.applyToRoots((e) => {
|
|
266
|
+
// destroy documentType instance
|
|
267
|
+
const docType = e.get('documentType');
|
|
268
|
+
if (docType) {
|
|
269
|
+
docType._destroy();
|
|
270
|
+
}
|
|
271
|
+
dom.utils.removeItem(e.get('topArea'));
|
|
272
|
+
e.get('options').clear();
|
|
273
|
+
e.clear();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
this.#contextMap.clear();
|
|
277
|
+
this.#frameContextMap.clear();
|
|
278
|
+
this.#frameRoots.clear();
|
|
279
|
+
|
|
280
|
+
dom.utils.removeItem(this.carrierWrapper);
|
|
281
|
+
|
|
282
|
+
this.rootKeys = null;
|
|
283
|
+
this.carrierWrapper = null;
|
|
284
|
+
this.icons = null;
|
|
285
|
+
this.lang = null;
|
|
286
|
+
this.shadowRoot = null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { dom, numbers, env } from '../../helper';
|
|
2
|
+
import { _DragHandle } from '../../modules/ui';
|
|
3
|
+
|
|
4
|
+
const { _w, _d, NO_EVENT } = env;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @description Event manager, editor's all event management class
|
|
8
|
+
*/
|
|
9
|
+
class EventManager {
|
|
10
|
+
#$;
|
|
11
|
+
#frameContext;
|
|
12
|
+
#frameOptions;
|
|
13
|
+
|
|
14
|
+
/** @type {?SunEditor.Event.GlobalInfo} */
|
|
15
|
+
#geckoActiveEvent = null;
|
|
16
|
+
|
|
17
|
+
/** @type {Array<*>} */
|
|
18
|
+
#events = [];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @constructor
|
|
22
|
+
* @param {import('./contextProvider').default} contextProvider
|
|
23
|
+
* @param {import('./optionProvider').default} optionProvider
|
|
24
|
+
* @param {import('../kernel/coreKernel').Deps} $
|
|
25
|
+
*/
|
|
26
|
+
constructor(contextProvider, optionProvider, $) {
|
|
27
|
+
this.#$ = $;
|
|
28
|
+
this.#frameContext = contextProvider.frameContext;
|
|
29
|
+
this.#frameOptions = optionProvider.frameOptions;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @description Events object, call by triggerEvent function
|
|
33
|
+
* @type {SunEditor.Event.Handlers}
|
|
34
|
+
*/
|
|
35
|
+
this.events = optionProvider.options.get('events') || {};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @description Call the event function by injecting self: this.
|
|
39
|
+
* @type {(eventName: string, ...args: *) => Promise<*>}
|
|
40
|
+
*/
|
|
41
|
+
this.triggerEvent = async (eventName, eventData) => {
|
|
42
|
+
// [iframe] wysiwyg is disabled, the event is not called.
|
|
43
|
+
if (dom.check.isNonEditable(eventData?.frameContext?.get('wysiwyg'))) return false;
|
|
44
|
+
|
|
45
|
+
const eventHandler = this.events[eventName];
|
|
46
|
+
if (typeof eventHandler === 'function') {
|
|
47
|
+
try {
|
|
48
|
+
return await eventHandler({ $: this.#$, ...eventData });
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error(`[SUNEDITOR.triggerEvent.${eventName}]`, error);
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return NO_EVENT;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** @type {HTMLInputElement} */
|
|
59
|
+
this.__focusTemp = contextProvider.carrierWrapper.querySelector('.__se__focus__temp__');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @description Register for an event.
|
|
64
|
+
* - Only events registered with this method are unregistered or re-registered when methods such as 'setOptions', 'destroy' are called.
|
|
65
|
+
* @param {*} target Target element
|
|
66
|
+
* @param {string} type Event type
|
|
67
|
+
* @param {EventListenerOrEventListenerObject} listener Event handler
|
|
68
|
+
* @param {boolean|AddEventListenerOptions} [useCapture] Event useCapture option
|
|
69
|
+
* @return {?SunEditor.Event.Info} Registered event information
|
|
70
|
+
*/
|
|
71
|
+
addEvent(target, type, listener, useCapture) {
|
|
72
|
+
if (!target) return null;
|
|
73
|
+
if (target === _w || target === _d || typeof target.length !== 'number' || target.nodeType || (!Array.isArray(target) && target.length < 1)) target = [target];
|
|
74
|
+
if (target.length === 0) return null;
|
|
75
|
+
|
|
76
|
+
const len = target.length;
|
|
77
|
+
for (let i = 0; i < len; i++) {
|
|
78
|
+
target[i].addEventListener(type, listener, useCapture);
|
|
79
|
+
this.#events.push({
|
|
80
|
+
target: target[i],
|
|
81
|
+
type,
|
|
82
|
+
listener,
|
|
83
|
+
useCapture,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
target: len > 1 ? target : target[0],
|
|
89
|
+
type,
|
|
90
|
+
listener,
|
|
91
|
+
useCapture,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @description Remove event
|
|
97
|
+
* @param {SunEditor.Event.Info} params event info = this.addEvent()
|
|
98
|
+
* @returns {undefined|null} Success: null, Not found: undefined
|
|
99
|
+
*/
|
|
100
|
+
removeEvent(params) {
|
|
101
|
+
if (!params) return;
|
|
102
|
+
|
|
103
|
+
let target = params.target;
|
|
104
|
+
const type = params.type;
|
|
105
|
+
const listener = params.listener;
|
|
106
|
+
const useCapture = params.useCapture;
|
|
107
|
+
|
|
108
|
+
if (!target) return;
|
|
109
|
+
if (!numbers.is(target.length) || target.nodeName || (!Array.isArray(target) && target.length < 1)) target = /** @type {Array<Element>} */ ([target]);
|
|
110
|
+
if (target.length === 0) return;
|
|
111
|
+
|
|
112
|
+
for (let i = 0, len = target.length; i < len; i++) {
|
|
113
|
+
target[i].removeEventListener(type, listener, useCapture);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @description Add an event to document.
|
|
121
|
+
* - When created as an Iframe, the same event is added to the document in the Iframe.
|
|
122
|
+
* @param {string} type Event type
|
|
123
|
+
* @param {(...args: *) => *} listener Event listener
|
|
124
|
+
* @param {boolean|AddEventListenerOptions} [useCapture] Use event capture
|
|
125
|
+
* @return {SunEditor.Event.GlobalInfo} Registered event information
|
|
126
|
+
*/
|
|
127
|
+
addGlobalEvent(type, listener, useCapture) {
|
|
128
|
+
if (this.#frameOptions.get('iframe')) {
|
|
129
|
+
this.#frameContext.get('_ww').addEventListener(type, listener, useCapture);
|
|
130
|
+
}
|
|
131
|
+
_w.addEventListener(type, listener, useCapture);
|
|
132
|
+
return {
|
|
133
|
+
type,
|
|
134
|
+
listener,
|
|
135
|
+
useCapture,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @description Remove events from document.
|
|
141
|
+
* - When created as an Iframe, the event of the document inside the Iframe is also removed.
|
|
142
|
+
* @param {string|SunEditor.Event.GlobalInfo} type Event type or (Event info = this.addGlobalEvent())
|
|
143
|
+
* @param {(...args: *) => *} [listener] Event listener
|
|
144
|
+
* @param {boolean|AddEventListenerOptions} [useCapture] Use event capture
|
|
145
|
+
* @returns {undefined|null} Success: null, Not found: undefined
|
|
146
|
+
*/
|
|
147
|
+
removeGlobalEvent(type, listener, useCapture) {
|
|
148
|
+
if (!type) return;
|
|
149
|
+
|
|
150
|
+
if (typeof type === 'object') {
|
|
151
|
+
listener = type.listener;
|
|
152
|
+
useCapture = type.useCapture;
|
|
153
|
+
type = type.type;
|
|
154
|
+
}
|
|
155
|
+
if (this.#frameOptions.get('iframe')) {
|
|
156
|
+
this.#frameContext.get('_ww').removeEventListener(type, listener, useCapture);
|
|
157
|
+
}
|
|
158
|
+
_w.removeEventListener(type, listener, useCapture);
|
|
159
|
+
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @internal
|
|
165
|
+
* @description Gives an active effect when the mouse down event is blocked. (Used when "env.isGecko" is true)
|
|
166
|
+
* @param {Node} target Target element
|
|
167
|
+
*/
|
|
168
|
+
_injectActiveEvent(target) {
|
|
169
|
+
dom.utils.addClass(target, '__se__active');
|
|
170
|
+
this.#geckoActiveEvent = this.addGlobalEvent('mouseup', () => {
|
|
171
|
+
dom.utils.removeClass(target, '__se__active');
|
|
172
|
+
this.#geckoActiveEvent = this.removeGlobalEvent(this.#geckoActiveEvent);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
_init() {
|
|
177
|
+
for (let i = 0, len = this.#events.length, e; i < len; i++) {
|
|
178
|
+
e = this.#events[i];
|
|
179
|
+
e.target.removeEventListener(e.type, e.listener, e.useCapture);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
this.#events = null;
|
|
183
|
+
|
|
184
|
+
this.#geckoActiveEvent &&= this.removeGlobalEvent(this.#geckoActiveEvent);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export default EventManager;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description iframe-safe instanceof check utility class
|
|
3
|
+
*/
|
|
4
|
+
class InstanceCheck {
|
|
5
|
+
#frameContext;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @constructor
|
|
9
|
+
* @param {SunEditor.FrameContext} frameContext - Frame context
|
|
10
|
+
*/
|
|
11
|
+
constructor(frameContext) {
|
|
12
|
+
this.#frameContext = frameContext;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {*} obj
|
|
17
|
+
* @returns {obj is Node}
|
|
18
|
+
*/
|
|
19
|
+
isNode(obj) {
|
|
20
|
+
// Check nodeType first for cross-context compatibility (e.g., elements created from main document in iframe mode)
|
|
21
|
+
return (obj && typeof obj.nodeType === 'number') || obj instanceof this.#getFrameWindow().Node;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {*} obj
|
|
26
|
+
* @returns {obj is Element}
|
|
27
|
+
*/
|
|
28
|
+
isElement(obj) {
|
|
29
|
+
// Check nodeType === 1 for cross-context compatibility
|
|
30
|
+
return (obj && obj.nodeType === 1) || obj instanceof this.#getFrameWindow().Element;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {*} obj
|
|
35
|
+
* @returns {obj is Range}
|
|
36
|
+
*/
|
|
37
|
+
isRange(obj) {
|
|
38
|
+
// Check constructor name for cross-context compatibility
|
|
39
|
+
return (obj && obj.constructor?.name === 'Range') || obj instanceof this.#getFrameWindow().Range;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @param {*} obj
|
|
44
|
+
* @returns {obj is Selection}
|
|
45
|
+
*/
|
|
46
|
+
isSelection(obj) {
|
|
47
|
+
// Check constructor name for cross-context compatibility
|
|
48
|
+
return (obj && obj.constructor?.name === 'Selection') || obj instanceof this.#getFrameWindow().Selection;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @returns {SunEditor.GlobalWindow}
|
|
53
|
+
*/
|
|
54
|
+
#getFrameWindow() {
|
|
55
|
+
return /** @type {SunEditor.GlobalWindow} */ (this.#frameContext.get('_ww'));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export default InstanceCheck;
|