roosterjs-content-model-core 9.49.0 → 9.50.0
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/lib/corePlugin/domEvent/DOMEventPlugin.js +17 -10
- package/lib/corePlugin/domEvent/DOMEventPlugin.js.map +1 -1
- package/lib-amd/corePlugin/domEvent/DOMEventPlugin.js +17 -10
- package/lib-amd/corePlugin/domEvent/DOMEventPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/domEvent/DOMEventPlugin.js +17 -10
- package/lib-mjs/corePlugin/domEvent/DOMEventPlugin.js.map +1 -1
- package/package.json +3 -3
|
@@ -38,17 +38,24 @@ var DOMEventPlugin = /** @class */ (function () {
|
|
|
38
38
|
dragEvent.preventDefault();
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
|
-
this.onDrop = function () {
|
|
42
|
-
var _a
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
this.onDrop = function (e) {
|
|
42
|
+
var _a;
|
|
43
|
+
if (_this.editor) {
|
|
44
|
+
var beforeDropEvent = _this.editor.triggerEvent('beforeDrop', {
|
|
45
|
+
rawEvent: e,
|
|
46
|
+
});
|
|
47
|
+
if (!(beforeDropEvent === null || beforeDropEvent === void 0 ? void 0 : beforeDropEvent.rawEvent.defaultPrevented)) {
|
|
48
|
+
var doc = _this.editor.getDocument();
|
|
49
|
+
(_a = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
|
|
50
|
+
if (_this.editor) {
|
|
51
|
+
_this.editor.takeSnapshot();
|
|
52
|
+
_this.editor.triggerEvent('contentChanged', {
|
|
53
|
+
source: roosterjs_content_model_dom_1.ChangeSource.Drop,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
49
56
|
});
|
|
50
57
|
}
|
|
51
|
-
}
|
|
58
|
+
}
|
|
52
59
|
};
|
|
53
60
|
this.onScroll = function (e) {
|
|
54
61
|
var _a;
|
|
@@ -184,7 +191,7 @@ var DOMEventPlugin = /** @class */ (function () {
|
|
|
184
191
|
compositionend: { beforeDispatch: this.onCompositionEnd },
|
|
185
192
|
// 4. Drag and Drop event
|
|
186
193
|
dragstart: { beforeDispatch: this.onDragStart },
|
|
187
|
-
drop: { beforeDispatch:
|
|
194
|
+
drop: { beforeDispatch: function (event) { return _this.onDrop(event); } },
|
|
188
195
|
// 5. Pointer event
|
|
189
196
|
pointerdown: { beforeDispatch: function (event) { return _this.onPointerDown(event); } },
|
|
190
197
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: this.onDrop },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = () => {\n const doc = this.editor?.getDocument();\n\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: (event: DragEvent) => this.onDrop(event) },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = (e: DragEvent) => {\n if (this.editor) {\n const beforeDropEvent = this.editor.triggerEvent('beforeDrop', {\n rawEvent: e,\n });\n if (!beforeDropEvent?.rawEvent.defaultPrevented) {\n const doc = this.editor.getDocument();\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n }\n }\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
|
@@ -38,17 +38,24 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
|
|
|
38
38
|
dragEvent.preventDefault();
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
|
-
this.onDrop = function () {
|
|
42
|
-
var _a
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
this.onDrop = function (e) {
|
|
42
|
+
var _a;
|
|
43
|
+
if (_this.editor) {
|
|
44
|
+
var beforeDropEvent = _this.editor.triggerEvent('beforeDrop', {
|
|
45
|
+
rawEvent: e,
|
|
46
|
+
});
|
|
47
|
+
if (!(beforeDropEvent === null || beforeDropEvent === void 0 ? void 0 : beforeDropEvent.rawEvent.defaultPrevented)) {
|
|
48
|
+
var doc = _this.editor.getDocument();
|
|
49
|
+
(_a = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
|
|
50
|
+
if (_this.editor) {
|
|
51
|
+
_this.editor.takeSnapshot();
|
|
52
|
+
_this.editor.triggerEvent('contentChanged', {
|
|
53
|
+
source: roosterjs_content_model_dom_1.ChangeSource.Drop,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
49
56
|
});
|
|
50
57
|
}
|
|
51
|
-
}
|
|
58
|
+
}
|
|
52
59
|
};
|
|
53
60
|
this.onScroll = function (e) {
|
|
54
61
|
var _a;
|
|
@@ -184,7 +191,7 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
|
|
|
184
191
|
compositionend: { beforeDispatch: this.onCompositionEnd },
|
|
185
192
|
// 4. Drag and Drop event
|
|
186
193
|
dragstart: { beforeDispatch: this.onDragStart },
|
|
187
|
-
drop: { beforeDispatch:
|
|
194
|
+
drop: { beforeDispatch: function (event) { return _this.onDrop(event); } },
|
|
188
195
|
// 5. Pointer event
|
|
189
196
|
pointerdown: { beforeDispatch: function (event) { return _this.onPointerDown(event); } },
|
|
190
197
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: this.onDrop },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = () => {\n const doc = this.editor?.getDocument();\n\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: (event: DragEvent) => this.onDrop(event) },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = (e: DragEvent) => {\n if (this.editor) {\n const beforeDropEvent = this.editor.triggerEvent('beforeDrop', {\n rawEvent: e,\n });\n if (!beforeDropEvent?.rawEvent.defaultPrevented) {\n const doc = this.editor.getDocument();\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n }\n }\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
|
@@ -35,17 +35,24 @@ var DOMEventPlugin = /** @class */ (function () {
|
|
|
35
35
|
dragEvent.preventDefault();
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
|
-
this.onDrop = function () {
|
|
39
|
-
var _a
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
this.onDrop = function (e) {
|
|
39
|
+
var _a;
|
|
40
|
+
if (_this.editor) {
|
|
41
|
+
var beforeDropEvent = _this.editor.triggerEvent('beforeDrop', {
|
|
42
|
+
rawEvent: e,
|
|
43
|
+
});
|
|
44
|
+
if (!(beforeDropEvent === null || beforeDropEvent === void 0 ? void 0 : beforeDropEvent.rawEvent.defaultPrevented)) {
|
|
45
|
+
var doc = _this.editor.getDocument();
|
|
46
|
+
(_a = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
|
|
47
|
+
if (_this.editor) {
|
|
48
|
+
_this.editor.takeSnapshot();
|
|
49
|
+
_this.editor.triggerEvent('contentChanged', {
|
|
50
|
+
source: ChangeSource.Drop,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
46
53
|
});
|
|
47
54
|
}
|
|
48
|
-
}
|
|
55
|
+
}
|
|
49
56
|
};
|
|
50
57
|
this.onScroll = function (e) {
|
|
51
58
|
var _a;
|
|
@@ -181,7 +188,7 @@ var DOMEventPlugin = /** @class */ (function () {
|
|
|
181
188
|
compositionend: { beforeDispatch: this.onCompositionEnd },
|
|
182
189
|
// 4. Drag and Drop event
|
|
183
190
|
dragstart: { beforeDispatch: this.onDragStart },
|
|
184
|
-
drop: { beforeDispatch:
|
|
191
|
+
drop: { beforeDispatch: function (event) { return _this.onDrop(event); } },
|
|
185
192
|
// 5. Pointer event
|
|
186
193
|
pointerdown: { beforeDispatch: function (event) { return _this.onPointerDown(event); } },
|
|
187
194
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: this.onDrop },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = () => {\n const doc = this.editor?.getDocument();\n\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DOMEventPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/domEvent/DOMEventPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n isCharacterValue,\n isCursorMovingKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMEventPluginState,\n IEditor,\n DOMEventRecord,\n EditorOptions,\n PluginWithState,\n} from 'roosterjs-content-model-types';\n\nconst EventTypeMap: Record<string, 'keyDown' | 'keyUp' | 'keyPress'> = {\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n};\n\n/**\n * DOMEventPlugin handles customized DOM events, including:\n * 1. Keyboard event\n * 2. Mouse event\n * 3. IME state\n * 4. Drop event\n * 5. Focus and blur event\n * 6. Input event\n * 7. Scroll event\n * It contains special handling for Safari since Safari cannot get correct selection when onBlur event is triggered in editor.\n */\nclass DOMEventPlugin implements PluginWithState<DOMEventPluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: DOMEventPluginState;\n private pointerEvent: PointerEvent | null = null;\n private timer = 0;\n\n /**\n * Construct a new instance of DOMEventPlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n isInIME: false,\n scrollContainer: options.scrollContainer || contentDiv,\n mouseDownX: null,\n mouseDownY: null,\n mouseUpEventListerAdded: false,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'DOMEvent';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n const document = this.editor.getDocument();\n const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n // 1. Keyboard event\n keypress: this.keyboardEventHandler,\n keydown: this.keyboardEventHandler,\n keyup: this.keyboardEventHandler,\n input: this.inputEventHandler,\n\n // 2. Mouse event\n mousedown: { beforeDispatch: this.onMouseDown },\n dblclick: { beforeDispatch: (event: MouseEvent) => this.onDoubleClick(event) },\n\n // 3. IME state management\n compositionstart: { beforeDispatch: this.onCompositionStart },\n compositionend: { beforeDispatch: this.onCompositionEnd },\n\n // 4. Drag and Drop event\n dragstart: { beforeDispatch: this.onDragStart },\n drop: { beforeDispatch: (event: DragEvent) => this.onDrop(event) },\n\n // 5. Pointer event\n pointerdown: { beforeDispatch: (event: PointerEvent) => this.onPointerDown(event) },\n };\n\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n\n // 7. Scroll event\n this.state.scrollContainer.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('scroll', this.onScroll);\n document.defaultView?.addEventListener('resize', this.onScroll);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.removeMouseUpEventListener();\n\n const document = this.editor?.getDocument();\n document?.defaultView?.removeEventListener('resize', this.onScroll);\n document?.defaultView?.removeEventListener('scroll', this.onScroll);\n this.state.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n this.pointerEvent = null;\n\n if (this.timer) {\n document?.defaultView?.clearTimeout(this.timer);\n this.timer = 0;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onDragStart = (e: Event) => {\n const dragEvent = e as DragEvent;\n const node = dragEvent.target as Node;\n const element = isNodeOfType(node, 'ELEMENT_NODE') ? node : node.parentElement;\n\n if (element && !element.isContentEditable) {\n dragEvent.preventDefault();\n }\n };\n\n private onDrop = (e: DragEvent) => {\n if (this.editor) {\n const beforeDropEvent = this.editor.triggerEvent('beforeDrop', {\n rawEvent: e,\n });\n if (!beforeDropEvent?.rawEvent.defaultPrevented) {\n const doc = this.editor.getDocument();\n doc?.defaultView?.requestAnimationFrame(() => {\n if (this.editor) {\n this.editor.takeSnapshot();\n this.editor.triggerEvent('contentChanged', {\n source: ChangeSource.Drop,\n });\n }\n });\n }\n }\n };\n\n private onScroll = (e: Event) => {\n this.editor?.triggerEvent('scroll', {\n rawEvent: e,\n scrollContainer: this.state.scrollContainer,\n });\n };\n\n private keyboardEventHandler: DOMEventRecord<KeyboardEvent> = {\n beforeDispatch: event => {\n const eventType = EventTypeMap[event.type];\n\n if (isCharacterValue(event) || isCursorMovingKey(event)) {\n // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown\n // since editor already handles these keys and no need to propagate to parents\n event.stopPropagation();\n }\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing = !isAndroid && (event.isComposing || this.state.isInIME);\n\n if (this.editor && eventType && !isComposing) {\n this.editor.triggerEvent(eventType, {\n rawEvent: event,\n });\n }\n },\n };\n\n private inputEventHandler: DOMEventRecord<Event> = {\n beforeDispatch: event => {\n event.stopPropagation();\n\n const isAndroid = this.editor?.getEnvironment()?.isAndroid ?? false;\n const isComposing =\n !isAndroid && ((event as InputEvent).isComposing || this.state.isInIME);\n\n if (this.editor && !isComposing) {\n this.editor.triggerEvent('input', {\n rawEvent: event as InputEvent,\n });\n }\n },\n };\n\n private onMouseDown = (event: MouseEvent) => {\n if (this.editor) {\n if (!this.state.mouseUpEventListerAdded) {\n this.editor\n .getDocument()\n .addEventListener('mouseup', this.onMouseUp, true /*setCapture*/);\n this.state.mouseUpEventListerAdded = true;\n this.state.mouseDownX = event.pageX;\n this.state.mouseDownY = event.pageY;\n }\n\n this.editor.triggerEvent('mouseDown', {\n rawEvent: event,\n });\n\n if (event.defaultPrevented) {\n this.pointerEvent = null;\n }\n if (this.pointerEvent) {\n this.editor.triggerEvent('pointerDown', {\n rawEvent: this.pointerEvent,\n originalEvent: event,\n });\n }\n }\n };\n\n private onMouseUp = (rawEvent: MouseEvent) => {\n if (this.editor) {\n this.removeMouseUpEventListener();\n this.editor.triggerEvent('mouseUp', {\n rawEvent,\n isClicking:\n this.state.mouseDownX == rawEvent.pageX &&\n this.state.mouseDownY == rawEvent.pageY,\n });\n }\n if (this.pointerEvent) {\n this.pointerEvent = null;\n }\n };\n\n private onDoubleClick = (event: MouseEvent) => {\n if (this.editor) {\n this.editor.triggerEvent('doubleClick', {\n rawEvent: event,\n });\n }\n };\n\n private onCompositionStart = () => {\n this.state.isInIME = true;\n };\n\n private onCompositionEnd = (rawEvent: CompositionEvent) => {\n this.state.isInIME = false;\n this.editor?.triggerEvent('compositionEnd', {\n rawEvent,\n });\n };\n\n private removeMouseUpEventListener() {\n if (this.editor && this.state.mouseUpEventListerAdded) {\n this.state.mouseUpEventListerAdded = false;\n this.editor.getDocument().removeEventListener('mouseup', this.onMouseUp, true);\n }\n }\n\n private onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === 'touch' || e.pointerType === 'pen') {\n this.pointerEvent = e;\n }\n };\n}\n\n/**\n * @internal\n * Create a new instance of DOMEventPlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createDOMEventPlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<DOMEventPluginState> {\n return new DOMEventPlugin(option, contentDiv);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"description": "Core editor for roosterjs",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.1",
|
|
6
|
-
"roosterjs-content-model-dom": "^9.
|
|
7
|
-
"roosterjs-content-model-types": "^9.
|
|
6
|
+
"roosterjs-content-model-dom": "^9.50.0",
|
|
7
|
+
"roosterjs-content-model-types": "^9.50.0"
|
|
8
8
|
},
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.50.0",
|
|
10
10
|
"main": "./lib/index.js",
|
|
11
11
|
"typings": "./lib/index.d.ts",
|
|
12
12
|
"module": "./lib-mjs/index.js",
|