roosterjs-content-model-core 9.39.0 → 9.40.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.
Files changed (28) hide show
  1. package/lib/corePlugin/cache/CachePlugin.js +0 -1
  2. package/lib/corePlugin/cache/CachePlugin.js.map +1 -1
  3. package/lib/corePlugin/cache/domIndexerImpl.d.ts +1 -2
  4. package/lib/corePlugin/cache/domIndexerImpl.js +1 -8
  5. package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
  6. package/lib/corePlugin/contextMenu/ContextMenuPlugin.js +5 -5
  7. package/lib/corePlugin/contextMenu/ContextMenuPlugin.js.map +1 -1
  8. package/lib/corePlugin/copyPaste/CopyPastePlugin.js +2 -6
  9. package/lib/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  10. package/lib-amd/corePlugin/cache/CachePlugin.js +0 -1
  11. package/lib-amd/corePlugin/cache/CachePlugin.js.map +1 -1
  12. package/lib-amd/corePlugin/cache/domIndexerImpl.d.ts +1 -2
  13. package/lib-amd/corePlugin/cache/domIndexerImpl.js +1 -8
  14. package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
  15. package/lib-amd/corePlugin/contextMenu/ContextMenuPlugin.js +5 -5
  16. package/lib-amd/corePlugin/contextMenu/ContextMenuPlugin.js.map +1 -1
  17. package/lib-amd/corePlugin/copyPaste/CopyPastePlugin.js +2 -6
  18. package/lib-amd/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  19. package/lib-mjs/corePlugin/cache/CachePlugin.js +0 -1
  20. package/lib-mjs/corePlugin/cache/CachePlugin.js.map +1 -1
  21. package/lib-mjs/corePlugin/cache/domIndexerImpl.d.ts +1 -2
  22. package/lib-mjs/corePlugin/cache/domIndexerImpl.js +1 -8
  23. package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
  24. package/lib-mjs/corePlugin/contextMenu/ContextMenuPlugin.js +5 -5
  25. package/lib-mjs/corePlugin/contextMenu/ContextMenuPlugin.js.map +1 -1
  26. package/lib-mjs/corePlugin/copyPaste/CopyPastePlugin.js +2 -6
  27. package/lib-mjs/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  28. package/package.json +3 -3
@@ -49,7 +49,6 @@ var CachePlugin = /** @class */ (function () {
49
49
  };
50
50
  this.state = {
51
51
  domIndexer: new domIndexerImpl_1.DomIndexerImpl(option.experimentalFeatures &&
52
- option.experimentalFeatures.indexOf('PersistCache') >= 0, option.experimentalFeatures &&
53
52
  option.experimentalFeatures.indexOf('KeepSelectionMarkerWhenEnteringTextNode') >= 0),
54
53
  textMutationObserver: (0, textMutationObserver_1.createTextMutationObserver)(contentDiv, this.onMutation),
55
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CachePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/CachePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameSelections } from './areSameSelections';\nimport { createParagraphMap } from './ParagraphMapImpl';\nimport { createTextMutationObserver } from './textMutationObserver';\nimport { DomIndexerImpl } from './domIndexerImpl';\nimport { updateCache } from './updateCache';\nimport type { Mutation } from './MutationType';\nimport type {\n CachePluginState,\n IEditor,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\n/**\n * ContentModel cache plugin manages cached Content Model, and refresh the cache when necessary\n */\nclass CachePlugin implements PluginWithState<CachePluginState> {\n private editor: IEditor | null = null;\n private state: CachePluginState;\n\n /**\n * Construct a new instance of CachePlugin class\n * @param option The editor option\n * @param contentDiv The editor content DIV\n */\n constructor(option: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n domIndexer: new DomIndexerImpl(\n option.experimentalFeatures &&\n option.experimentalFeatures.indexOf('PersistCache') >= 0,\n option.experimentalFeatures &&\n option.experimentalFeatures.indexOf(\n 'KeepSelectionMarkerWhenEnteringTextNode'\n ) >= 0\n ),\n textMutationObserver: createTextMutationObserver(contentDiv, this.onMutation),\n };\n\n if (option.enableParagraphMap) {\n this.state.paragraphMap = createParagraphMap();\n }\n }\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Cache';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n this.editor.getDocument().addEventListener('selectionchange', this.onNativeSelectionChange);\n\n this.state.textMutationObserver.startObserving();\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.state.textMutationObserver.stopObserving();\n\n if (this.editor) {\n this.editor\n .getDocument()\n .removeEventListener('selectionchange', this.onNativeSelectionChange);\n this.editor = null;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState(): CachePluginState {\n return this.state;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'logicalRootChanged':\n this.invalidateCache();\n\n this.state.textMutationObserver.stopObserving();\n this.state.textMutationObserver = createTextMutationObserver(\n event.logicalRoot,\n this.onMutation\n );\n this.state.textMutationObserver.startObserving();\n break;\n\n case 'selectionChanged':\n this.updateCachedModel(this.editor);\n break;\n\n case 'contentChanged':\n const { contentModel, selection } = event;\n\n if (contentModel) {\n updateCache(this.state, contentModel, selection);\n } else {\n this.invalidateCache();\n }\n\n break;\n }\n }\n\n private onMutation = (mutation: Mutation) => {\n if (this.editor) {\n switch (mutation.type) {\n case 'childList':\n if (\n !this.state.domIndexer.reconcileChildList(\n mutation.addedNodes,\n mutation.removedNodes\n )\n ) {\n this.invalidateCache();\n }\n break;\n\n case 'text':\n this.updateCachedModel(this.editor, true /*forceUpdate*/);\n break;\n\n case 'elementId':\n const element = mutation.element;\n\n if (!this.state.domIndexer.reconcileElementId(element)) {\n this.invalidateCache();\n }\n\n break;\n\n case 'unknown':\n this.invalidateCache();\n break;\n }\n }\n };\n\n private onNativeSelectionChange = () => {\n if (this.editor?.hasFocus()) {\n this.updateCachedModel(this.editor);\n }\n };\n\n private invalidateCache() {\n if (!this.editor?.isInShadowEdit()) {\n this.state.cachedModel = undefined;\n this.state.cachedSelection = undefined;\n\n // Clear paragraph indexer to prevent stale references to old paragraphs\n // It will be rebuild next time when we create a new Content Model\n this.state.paragraphMap?.clear();\n }\n }\n\n private updateCachedModel(editor: IEditor, forceUpdate?: boolean) {\n if (editor.isInShadowEdit()) {\n return;\n }\n\n const cachedSelection = this.state.cachedSelection;\n this.state.cachedSelection = undefined; // Clear it to force getDOMSelection() retrieve the latest selection range\n\n const newRangeEx = editor.getDOMSelection() || undefined;\n const model = this.state.cachedModel;\n const isSelectionChanged =\n forceUpdate ||\n !cachedSelection ||\n !newRangeEx ||\n !areSameSelections(newRangeEx, cachedSelection);\n\n if (isSelectionChanged) {\n if (\n !model ||\n !newRangeEx ||\n !this.state.domIndexer.reconcileSelection(model, newRangeEx, cachedSelection)\n ) {\n this.invalidateCache();\n } else {\n updateCache(this.state, model, newRangeEx);\n }\n } else {\n this.state.cachedSelection = cachedSelection;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of CachePlugin class.\n * @param option The editor option\n * @param contentDiv The editor content DIV\n */\nexport function createCachePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<CachePluginState> {\n return new CachePlugin(option, contentDiv);\n}\n"]}
1
+ {"version":3,"file":"CachePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/CachePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameSelections } from './areSameSelections';\nimport { createParagraphMap } from './ParagraphMapImpl';\nimport { createTextMutationObserver } from './textMutationObserver';\nimport { DomIndexerImpl } from './domIndexerImpl';\nimport { updateCache } from './updateCache';\nimport type { Mutation } from './MutationType';\nimport type {\n CachePluginState,\n IEditor,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\n/**\n * ContentModel cache plugin manages cached Content Model, and refresh the cache when necessary\n */\nclass CachePlugin implements PluginWithState<CachePluginState> {\n private editor: IEditor | null = null;\n private state: CachePluginState;\n\n /**\n * Construct a new instance of CachePlugin class\n * @param option The editor option\n * @param contentDiv The editor content DIV\n */\n constructor(option: EditorOptions, contentDiv: HTMLDivElement) {\n this.state = {\n domIndexer: new DomIndexerImpl(\n option.experimentalFeatures &&\n option.experimentalFeatures.indexOf(\n 'KeepSelectionMarkerWhenEnteringTextNode'\n ) >= 0\n ),\n textMutationObserver: createTextMutationObserver(contentDiv, this.onMutation),\n };\n\n if (option.enableParagraphMap) {\n this.state.paragraphMap = createParagraphMap();\n }\n }\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Cache';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n this.editor.getDocument().addEventListener('selectionchange', this.onNativeSelectionChange);\n\n this.state.textMutationObserver.startObserving();\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.state.textMutationObserver.stopObserving();\n\n if (this.editor) {\n this.editor\n .getDocument()\n .removeEventListener('selectionchange', this.onNativeSelectionChange);\n this.editor = null;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState(): CachePluginState {\n return this.state;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'logicalRootChanged':\n this.invalidateCache();\n\n this.state.textMutationObserver.stopObserving();\n this.state.textMutationObserver = createTextMutationObserver(\n event.logicalRoot,\n this.onMutation\n );\n this.state.textMutationObserver.startObserving();\n break;\n\n case 'selectionChanged':\n this.updateCachedModel(this.editor);\n break;\n\n case 'contentChanged':\n const { contentModel, selection } = event;\n\n if (contentModel) {\n updateCache(this.state, contentModel, selection);\n } else {\n this.invalidateCache();\n }\n\n break;\n }\n }\n\n private onMutation = (mutation: Mutation) => {\n if (this.editor) {\n switch (mutation.type) {\n case 'childList':\n if (\n !this.state.domIndexer.reconcileChildList(\n mutation.addedNodes,\n mutation.removedNodes\n )\n ) {\n this.invalidateCache();\n }\n break;\n\n case 'text':\n this.updateCachedModel(this.editor, true /*forceUpdate*/);\n break;\n\n case 'elementId':\n const element = mutation.element;\n\n if (!this.state.domIndexer.reconcileElementId(element)) {\n this.invalidateCache();\n }\n\n break;\n\n case 'unknown':\n this.invalidateCache();\n break;\n }\n }\n };\n\n private onNativeSelectionChange = () => {\n if (this.editor?.hasFocus()) {\n this.updateCachedModel(this.editor);\n }\n };\n\n private invalidateCache() {\n if (!this.editor?.isInShadowEdit()) {\n this.state.cachedModel = undefined;\n this.state.cachedSelection = undefined;\n\n // Clear paragraph indexer to prevent stale references to old paragraphs\n // It will be rebuild next time when we create a new Content Model\n this.state.paragraphMap?.clear();\n }\n }\n\n private updateCachedModel(editor: IEditor, forceUpdate?: boolean) {\n if (editor.isInShadowEdit()) {\n return;\n }\n\n const cachedSelection = this.state.cachedSelection;\n this.state.cachedSelection = undefined; // Clear it to force getDOMSelection() retrieve the latest selection range\n\n const newRangeEx = editor.getDOMSelection() || undefined;\n const model = this.state.cachedModel;\n const isSelectionChanged =\n forceUpdate ||\n !cachedSelection ||\n !newRangeEx ||\n !areSameSelections(newRangeEx, cachedSelection);\n\n if (isSelectionChanged) {\n if (\n !model ||\n !newRangeEx ||\n !this.state.domIndexer.reconcileSelection(model, newRangeEx, cachedSelection)\n ) {\n this.invalidateCache();\n } else {\n updateCache(this.state, model, newRangeEx);\n }\n } else {\n this.state.cachedSelection = cachedSelection;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of CachePlugin class.\n * @param option The editor option\n * @param contentDiv The editor content DIV\n */\nexport function createCachePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<CachePluginState> {\n return new CachePlugin(option, contentDiv);\n}\n"]}
@@ -42,9 +42,8 @@ export interface IndexedEntityDelimiter extends Text {
42
42
  * Implementation of DomIndexer
43
43
  */
44
44
  export declare class DomIndexerImpl implements DomIndexer {
45
- private readonly persistCache?;
46
45
  private readonly keepSelectionMarkerWhenEnteringTextNode?;
47
- constructor(persistCache?: boolean | undefined, keepSelectionMarkerWhenEnteringTextNode?: boolean | undefined);
46
+ constructor(keepSelectionMarkerWhenEnteringTextNode?: boolean | undefined);
48
47
  onSegment(segmentNode: Node, paragraph: ContentModelParagraph, segment: ContentModelSegment[]): void;
49
48
  onParagraph(paragraphElement: HTMLElement): void;
50
49
  onTable(tableElement: HTMLTableElement, table: ContentModelTable): void;
@@ -44,8 +44,7 @@ function unindex(node) {
44
44
  * Implementation of DomIndexer
45
45
  */
46
46
  var DomIndexerImpl = /** @class */ (function () {
47
- function DomIndexerImpl(persistCache, keepSelectionMarkerWhenEnteringTextNode) {
48
- this.persistCache = persistCache;
47
+ function DomIndexerImpl(keepSelectionMarkerWhenEnteringTextNode) {
49
48
  this.keepSelectionMarkerWhenEnteringTextNode = keepSelectionMarkerWhenEnteringTextNode;
50
49
  }
51
50
  DomIndexerImpl.prototype.onSegment = function (segmentNode, paragraph, segment) {
@@ -180,9 +179,6 @@ var DomIndexerImpl = /** @class */ (function () {
180
179
  return false;
181
180
  };
182
181
  DomIndexerImpl.prototype.reconcileChildList = function (addedNodes, removedNodes) {
183
- if (!this.persistCache) {
184
- return false;
185
- }
186
182
  var canHandle = true;
187
183
  var context = {
188
184
  segIndex: -1,
@@ -337,9 +333,6 @@ var DomIndexerImpl = /** @class */ (function () {
337
333
  (_a = paragraph.segments).splice.apply(_a, (0, tslib_1.__spreadArray)([firstIndex, lastIndex - firstIndex + 1], (0, tslib_1.__read)(newSegments), false));
338
334
  }
339
335
  this.onSegment(textNode, paragraph, textSegments);
340
- if (!this.persistCache) {
341
- delete paragraph.cachedElement;
342
- }
343
336
  }
344
337
  else if ((first === null || first === void 0 ? void 0 : first.segmentType) == 'Entity' && first == last) {
345
338
  var wrapper = first.wrapper;
@@ -1 +1 @@
1
- {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmptySegmentFormat,\n addCode,\n addLink,\n createParagraph,\n createSelectionMarker,\n createText,\n getObjectKeys,\n isElementOfType,\n isEntityDelimiter,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentFormat,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Export for test only\n */\nexport interface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\n/**\n * @internal Export for test only\n */\nexport interface TableItem {\n table: ContentModelTable;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface BlockEntityDelimiterItem {\n entity: ContentModelEntity;\n parent: ContentModelBlockGroup;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedEntityDelimiter extends Text {\n __roosterjsContentModel: BlockEntityDelimiterItem;\n}\n\n/**\n * Context object used by DomIndexer when reconcile mutations with child list\n */\ninterface ReconcileChildListContext {\n /**\n * Index of segment in current paragraph\n */\n segIndex: number;\n\n /**\n * The current paragraph that we are handling\n */\n paragraph?: ContentModelParagraph;\n\n /**\n * Text node that is added from mutation but has not been handled. This can happen when we first see an added node then later we see a removed one.\n * e.g. Type text in an empty paragraph (&lt;div&gt;&lt;br&gt;&lt;/div&gt;), so a text node will be added and &lt;BR&gt; will be removed.\n * Set to a valid text node means we need to handle it later. If it is finally not handled, that means we need to clear cache\n * Set to undefined (initial value) means no pending text node is hit yet (valid case)\n * Set to null means there was a pending text node which is already handled, so if we see another pending text node,\n * we should clear cache since we don't know how to handle it\n */\n pendingTextNode?: Text | null;\n\n /**\n * Format of the removed segment, this will be used as the format for newly created segment\n */\n format?: ContentModelSegmentFormat;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments) &&\n segments.every(segment => paragraph.segments.includes(segment))\n );\n}\n\nfunction isIndexedDelimiter(node: Node): node is IndexedEntityDelimiter {\n const { entity, parent } = (node as IndexedEntityDelimiter).__roosterjsContentModel ?? {};\n\n return (\n entity?.blockType == 'Entity' &&\n entity.wrapper &&\n parent?.blockGroupType &&\n Array.isArray(parent.blocks)\n );\n}\n\nfunction getIndexedSegmentItem(node: Node | null): SegmentItem | null {\n return node && isIndexedSegment(node) ? node.__roosterjsContentModel : null;\n}\n\nfunction getIndexedTableItem(element: HTMLTableElement): TableItem | null {\n const index = (element as IndexedTableElement).__roosterjsContentModel;\n const table = index?.table;\n\n if (\n table?.blockType == 'Table' &&\n Array.isArray(table.rows) &&\n table.rows.every(\n x => Array.isArray(x?.cells) && x.cells.every(y => y?.blockGroupType == 'TableCell')\n )\n ) {\n return index;\n } else {\n return null;\n }\n}\n\n// Make a node not indexed. Do not export this function since we should not let code outside here know this detail\nfunction unindex(node: Partial<IndexedSegmentNode>) {\n delete node.__roosterjsContentModel;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport class DomIndexerImpl implements DomIndexer {\n constructor(\n private readonly persistCache?: boolean,\n private readonly keepSelectionMarkerWhenEnteringTextNode?: boolean\n ) {}\n\n onSegment(segmentNode: Node, paragraph: ContentModelParagraph, segment: ContentModelSegment[]) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n }\n\n onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = getIndexedSegmentItem(previousText);\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(\n child.__roosterjsContentModel.segments\n );\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n this.onParagraph(child);\n } else {\n previousText = null;\n }\n }\n }\n\n onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { table };\n }\n\n onBlockEntity(entity: ContentModelEntity, group: ContentModelBlockGroup) {\n this.onBlockEntityDelimiter(entity.wrapper.previousSibling, entity, group);\n this.onBlockEntityDelimiter(entity.wrapper.nextSibling, entity, group);\n }\n\n onMergeText(targetText: Text, sourceText: Text) {\n if (isIndexedSegment(targetText) && isIndexedSegment(sourceText)) {\n if (targetText.nextSibling == sourceText) {\n targetText.__roosterjsContentModel.segments.push(\n ...sourceText.__roosterjsContentModel.segments\n );\n\n unindex(sourceText);\n }\n } else {\n unindex(sourceText);\n unindex(targetText);\n }\n }\n\n clearIndex(container: Node) {\n internalClearIndex(container);\n }\n\n reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n ): boolean {\n let selectionMarker: ContentModelSelectionMarker | undefined;\n if (oldSelection) {\n let startNode: Node | undefined;\n\n if (\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n (startNode = oldSelection.start.node) &&\n isNodeOfType(startNode, 'TEXT_NODE') &&\n isIndexedSegment(startNode) &&\n startNode.__roosterjsContentModel.segments.length > 0\n ) {\n this.reconcileTextSelection(startNode);\n } else {\n selectionMarker = this.selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection,\n newSelection\n );\n\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n const indexedImage = getIndexedSegmentItem(newSelection.image);\n const image = indexedImage?.segments[0];\n\n if (image) {\n image.isSelected = true;\n setSelection(model, image);\n\n return true;\n } else {\n return false;\n }\n\n case 'table':\n const indexedTable = getIndexedTableItem(newSelection.table);\n\n if (indexedTable) {\n const firstCell =\n indexedTable.table.rows[newSelection.firstRow]?.cells[\n newSelection.firstColumn\n ];\n const lastCell =\n indexedTable.table.rows[newSelection.lastRow]?.cells[\n newSelection.lastColumn\n ];\n\n if (firstCell && lastCell) {\n setSelection(model, firstCell, lastCell);\n\n return true;\n }\n }\n\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n delete model.hasRevertedRangeSelection;\n\n if (collapsed) {\n return !!this.reconcileNodeSelection(\n startContainer,\n startOffset,\n model.format\n );\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n return (\n isIndexedSegment(startContainer) &&\n !!this.reconcileTextSelection(\n startContainer,\n startOffset,\n endOffset,\n selectionMarker\n )\n );\n } else {\n const marker1 = this.reconcileNodeSelection(startContainer, startOffset);\n const marker2 = this.reconcileNodeSelection(endContainer, endOffset);\n\n if (marker1 && marker2) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n }\n\n reconcileChildList(addedNodes: ArrayLike<Node>, removedNodes: ArrayLike<Node>): boolean {\n if (!this.persistCache) {\n return false;\n }\n\n let canHandle = true;\n const context: ReconcileChildListContext = {\n segIndex: -1,\n };\n\n // First process added nodes\n const addedNode = addedNodes[0];\n\n if (addedNodes.length == 1 && isNodeOfType(addedNode, 'TEXT_NODE')) {\n canHandle = this.reconcileAddedNode(addedNode, context);\n } else if (addedNodes.length > 0) {\n canHandle = false;\n }\n\n // Second, process removed nodes\n const removedNode = removedNodes[0];\n\n if (canHandle && removedNodes.length == 1) {\n canHandle = this.reconcileRemovedNode(removedNode, context);\n } else if (removedNodes.length > 0) {\n canHandle = false;\n }\n\n return canHandle && !context.pendingTextNode;\n }\n\n reconcileElementId(element: HTMLElement) {\n if (isElementOfType(element, 'img')) {\n const indexedImg = getIndexedSegmentItem(element);\n\n if (indexedImg?.segments[0]?.segmentType == 'Image') {\n indexedImg.segments[0].format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else if (isElementOfType(element, 'table')) {\n const indexedTable = getIndexedTableItem(element);\n\n if (indexedTable) {\n indexedTable.table.format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private onBlockEntityDelimiter(\n node: Node | null,\n entity: ContentModelEntity,\n parent: ContentModelBlockGroup\n ) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isEntityDelimiter(node) && node.firstChild) {\n const indexedDelimiter = node.firstChild as IndexedEntityDelimiter;\n\n indexedDelimiter.__roosterjsContentModel = { entity, parent };\n }\n }\n\n private isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n }\n\n private reconcileNodeSelection(\n node: Node,\n offset: number,\n defaultFormat?: ContentModelSegmentFormat\n ): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n if (isIndexedSegment(node)) {\n return this.reconcileTextSelection(node, offset);\n } else if (isIndexedDelimiter(node)) {\n return this.reconcileDelimiterSelection(node, defaultFormat);\n } else {\n return undefined;\n }\n } else if (offset >= node.childNodes.length) {\n return this.insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return this.insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n }\n\n private insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n const segmentItem = node && getIndexedSegmentItem(node);\n\n if (segmentItem) {\n const { paragraph, segments } = segmentItem;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n }\n\n private reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number,\n selectionMarker?: ContentModelSelectionMarker\n ) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(selectionMarker?.format ?? first.format);\n newSegments.push(marker);\n\n if (startOffset < (textNode.nodeValue ?? '').length) {\n if (first.link) {\n addLink(marker, first.link);\n }\n\n if (first.code) {\n addCode(marker, first.code);\n }\n }\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker'\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker'\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n this.onSegment(textNode, paragraph, textSegments);\n\n if (!this.persistCache) {\n delete paragraph.cachedElement;\n }\n } else if (first?.segmentType == 'Entity' && first == last) {\n const wrapper = first.wrapper;\n const index = paragraph.segments.indexOf(first);\n const delimiter = textNode.parentElement;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n const marker = createSelectionMarker(\n selectionMarker?.format ??\n (paragraph.segments[isAfter ? index + 1 : index - 1] ?? first).format\n );\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n\n selectable = marker;\n }\n }\n\n return selectable;\n }\n\n private reconcileDelimiterSelection(\n node: IndexedEntityDelimiter,\n defaultFormat?: ContentModelSegmentFormat\n ) {\n let marker: ContentModelSelectionMarker | undefined;\n\n const { entity, parent } = node.__roosterjsContentModel;\n const index = parent.blocks.indexOf(entity);\n const delimiter = node.parentElement;\n const wrapper = entity.wrapper;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n marker = createSelectionMarker(defaultFormat);\n\n const para = createParagraph(\n true /*isImplicit*/,\n undefined /*blockFormat*/,\n defaultFormat\n );\n\n para.segments.push(marker);\n parent.blocks.splice(isBefore ? index : index + 1, 0, para);\n }\n\n return marker;\n }\n\n private reconcileAddedNode(node: Text, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let index = -1;\n let existingSegment: ContentModelSegment;\n const { previousSibling, nextSibling } = node;\n\n if (\n (segmentItem = getIndexedSegmentItem(getLastLeaf(previousSibling))) &&\n (existingSegment = segmentItem.segments[segmentItem.segments.length - 1]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment before current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index + 1, node, existingSegment.format);\n } else if (\n (segmentItem = getIndexedSegmentItem(getFirstLeaf(nextSibling))) &&\n (existingSegment = segmentItem.segments[0]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment after current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index, node, existingSegment.format);\n } else if (context.paragraph && context.segIndex >= 0) {\n // When there is indexed paragraph from removed nodes, we can use it as the insert index\n this.indexNode(context.paragraph, context.segIndex, node, context.format);\n } else if (context.pendingTextNode === undefined) {\n // When we can't find the insert index, set current node as pending node\n // so later we can pick it up when we have enough info when processing removed node\n // Only do this when pendingTextNode is undefined. If it is null it means there was already a pending node before\n // and in that case we should return false since we can't handle two pending text node\n context.pendingTextNode = node;\n } else {\n return false;\n }\n\n return true;\n }\n\n private reconcileRemovedNode(node: Node, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let removingSegment: ContentModelSegment;\n\n if (\n context.segIndex < 0 &&\n !context.paragraph && // No previous removed segment or related paragraph found, and\n (segmentItem = getIndexedSegmentItem(node)) && // The removed node is indexed, and\n (removingSegment = segmentItem.segments[0]) // There is at least one related segment\n ) {\n // Now we can remove the indexed segment from the paragraph, and remember it, later we may need to use it\n context.format = removingSegment.format;\n context.paragraph = segmentItem.paragraph;\n context.segIndex = segmentItem.paragraph.segments.indexOf(segmentItem.segments[0]);\n\n if (context.segIndex < 0) {\n // Indexed segment is not under paragraph, something wrong happens, we cannot keep handling\n return false;\n }\n\n for (let i = 0; i < segmentItem.segments.length; i++) {\n const index = segmentItem.paragraph.segments.indexOf(segmentItem.segments[i]);\n\n if (index >= 0) {\n segmentItem.paragraph.segments.splice(index, 1);\n }\n }\n\n if (context.pendingTextNode) {\n // If we have pending text node added but not indexed, do it now\n this.indexNode(\n context.paragraph,\n context.segIndex,\n context.pendingTextNode,\n segmentItem.segments[0].format\n );\n\n // Set to null since we have processed it.\n // Next time we see a pending node we know we have already processed one so it is a situation we cannot handle\n context.pendingTextNode = null;\n }\n\n return true;\n } else {\n return false;\n }\n }\n\n private indexNode(\n paragraph: ContentModelParagraph,\n index: number,\n textNode: Text,\n format?: ContentModelSegmentFormat\n ) {\n const copiedFormat = format ? { ...format } : undefined;\n\n if (copiedFormat) {\n getObjectKeys(copiedFormat).forEach(key => {\n if (EmptySegmentFormat[key] === undefined) {\n delete copiedFormat[key];\n }\n });\n }\n\n const text = createText(textNode.textContent ?? '', copiedFormat);\n\n paragraph.segments.splice(index, 0, text);\n this.onSegment(textNode, paragraph, [text]);\n }\n\n private selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection: CacheSelection,\n newSelection: DOMSelection\n ): ContentModelSelectionMarker | undefined {\n // For CJK keyboard input on mobile, we may have a situation like this:\n // User toggle bold/italic/underline on an empty div, the pending format will be applied on the selection marker\n // then type some text, the selection move to the text node and the selection marker will be recreated during the reconciliation and lose its original formatting\n // In this case, we need to keep the original formatting of the selection marker to match the pending format\n\n if (\n this.keepSelectionMarkerWhenEnteringTextNode &&\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n newSelection.type == 'range' &&\n isNodeOfType(newSelection.range.commonAncestorContainer, 'TEXT_NODE') &&\n newSelection.range.commonAncestorContainer.parentElement == oldSelection.start.node &&\n isIndexedSegment(newSelection.range.commonAncestorContainer) &&\n newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph.segments[0]\n .segmentType == 'SelectionMarker'\n ) {\n return newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph\n .segments[0];\n }\n return undefined;\n }\n}\n\nfunction getLastLeaf(node: Node | null): Node | null {\n while (node?.lastChild) {\n node = node.lastChild;\n }\n\n return node;\n}\n\nfunction getFirstLeaf(node: Node | null): Node | null {\n while (node?.firstChild) {\n node = node.firstChild;\n }\n\n return node;\n}\n\nfunction internalClearIndex(container: Node) {\n unindex(container as IndexedSegmentNode);\n\n for (let node = container.firstChild; node; node = node.nextSibling) {\n internalClearIndex(node);\n }\n}\n"]}
1
+ {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmptySegmentFormat,\n addCode,\n addLink,\n createParagraph,\n createSelectionMarker,\n createText,\n getObjectKeys,\n isElementOfType,\n isEntityDelimiter,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentFormat,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Export for test only\n */\nexport interface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\n/**\n * @internal Export for test only\n */\nexport interface TableItem {\n table: ContentModelTable;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface BlockEntityDelimiterItem {\n entity: ContentModelEntity;\n parent: ContentModelBlockGroup;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedEntityDelimiter extends Text {\n __roosterjsContentModel: BlockEntityDelimiterItem;\n}\n\n/**\n * Context object used by DomIndexer when reconcile mutations with child list\n */\ninterface ReconcileChildListContext {\n /**\n * Index of segment in current paragraph\n */\n segIndex: number;\n\n /**\n * The current paragraph that we are handling\n */\n paragraph?: ContentModelParagraph;\n\n /**\n * Text node that is added from mutation but has not been handled. This can happen when we first see an added node then later we see a removed one.\n * e.g. Type text in an empty paragraph (&lt;div&gt;&lt;br&gt;&lt;/div&gt;), so a text node will be added and &lt;BR&gt; will be removed.\n * Set to a valid text node means we need to handle it later. If it is finally not handled, that means we need to clear cache\n * Set to undefined (initial value) means no pending text node is hit yet (valid case)\n * Set to null means there was a pending text node which is already handled, so if we see another pending text node,\n * we should clear cache since we don't know how to handle it\n */\n pendingTextNode?: Text | null;\n\n /**\n * Format of the removed segment, this will be used as the format for newly created segment\n */\n format?: ContentModelSegmentFormat;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments) &&\n segments.every(segment => paragraph.segments.includes(segment))\n );\n}\n\nfunction isIndexedDelimiter(node: Node): node is IndexedEntityDelimiter {\n const { entity, parent } = (node as IndexedEntityDelimiter).__roosterjsContentModel ?? {};\n\n return (\n entity?.blockType == 'Entity' &&\n entity.wrapper &&\n parent?.blockGroupType &&\n Array.isArray(parent.blocks)\n );\n}\n\nfunction getIndexedSegmentItem(node: Node | null): SegmentItem | null {\n return node && isIndexedSegment(node) ? node.__roosterjsContentModel : null;\n}\n\nfunction getIndexedTableItem(element: HTMLTableElement): TableItem | null {\n const index = (element as IndexedTableElement).__roosterjsContentModel;\n const table = index?.table;\n\n if (\n table?.blockType == 'Table' &&\n Array.isArray(table.rows) &&\n table.rows.every(\n x => Array.isArray(x?.cells) && x.cells.every(y => y?.blockGroupType == 'TableCell')\n )\n ) {\n return index;\n } else {\n return null;\n }\n}\n\n// Make a node not indexed. Do not export this function since we should not let code outside here know this detail\nfunction unindex(node: Partial<IndexedSegmentNode>) {\n delete node.__roosterjsContentModel;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport class DomIndexerImpl implements DomIndexer {\n constructor(private readonly keepSelectionMarkerWhenEnteringTextNode?: boolean) {}\n\n onSegment(segmentNode: Node, paragraph: ContentModelParagraph, segment: ContentModelSegment[]) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n }\n\n onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = getIndexedSegmentItem(previousText);\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(\n child.__roosterjsContentModel.segments\n );\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n this.onParagraph(child);\n } else {\n previousText = null;\n }\n }\n }\n\n onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { table };\n }\n\n onBlockEntity(entity: ContentModelEntity, group: ContentModelBlockGroup) {\n this.onBlockEntityDelimiter(entity.wrapper.previousSibling, entity, group);\n this.onBlockEntityDelimiter(entity.wrapper.nextSibling, entity, group);\n }\n\n onMergeText(targetText: Text, sourceText: Text) {\n if (isIndexedSegment(targetText) && isIndexedSegment(sourceText)) {\n if (targetText.nextSibling == sourceText) {\n targetText.__roosterjsContentModel.segments.push(\n ...sourceText.__roosterjsContentModel.segments\n );\n\n unindex(sourceText);\n }\n } else {\n unindex(sourceText);\n unindex(targetText);\n }\n }\n\n clearIndex(container: Node) {\n internalClearIndex(container);\n }\n\n reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n ): boolean {\n let selectionMarker: ContentModelSelectionMarker | undefined;\n if (oldSelection) {\n let startNode: Node | undefined;\n\n if (\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n (startNode = oldSelection.start.node) &&\n isNodeOfType(startNode, 'TEXT_NODE') &&\n isIndexedSegment(startNode) &&\n startNode.__roosterjsContentModel.segments.length > 0\n ) {\n this.reconcileTextSelection(startNode);\n } else {\n selectionMarker = this.selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection,\n newSelection\n );\n\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n const indexedImage = getIndexedSegmentItem(newSelection.image);\n const image = indexedImage?.segments[0];\n\n if (image) {\n image.isSelected = true;\n setSelection(model, image);\n\n return true;\n } else {\n return false;\n }\n\n case 'table':\n const indexedTable = getIndexedTableItem(newSelection.table);\n\n if (indexedTable) {\n const firstCell =\n indexedTable.table.rows[newSelection.firstRow]?.cells[\n newSelection.firstColumn\n ];\n const lastCell =\n indexedTable.table.rows[newSelection.lastRow]?.cells[\n newSelection.lastColumn\n ];\n\n if (firstCell && lastCell) {\n setSelection(model, firstCell, lastCell);\n\n return true;\n }\n }\n\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n delete model.hasRevertedRangeSelection;\n\n if (collapsed) {\n return !!this.reconcileNodeSelection(\n startContainer,\n startOffset,\n model.format\n );\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n return (\n isIndexedSegment(startContainer) &&\n !!this.reconcileTextSelection(\n startContainer,\n startOffset,\n endOffset,\n selectionMarker\n )\n );\n } else {\n const marker1 = this.reconcileNodeSelection(startContainer, startOffset);\n const marker2 = this.reconcileNodeSelection(endContainer, endOffset);\n\n if (marker1 && marker2) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n }\n\n reconcileChildList(addedNodes: ArrayLike<Node>, removedNodes: ArrayLike<Node>): boolean {\n let canHandle = true;\n const context: ReconcileChildListContext = {\n segIndex: -1,\n };\n\n // First process added nodes\n const addedNode = addedNodes[0];\n\n if (addedNodes.length == 1 && isNodeOfType(addedNode, 'TEXT_NODE')) {\n canHandle = this.reconcileAddedNode(addedNode, context);\n } else if (addedNodes.length > 0) {\n canHandle = false;\n }\n\n // Second, process removed nodes\n const removedNode = removedNodes[0];\n\n if (canHandle && removedNodes.length == 1) {\n canHandle = this.reconcileRemovedNode(removedNode, context);\n } else if (removedNodes.length > 0) {\n canHandle = false;\n }\n\n return canHandle && !context.pendingTextNode;\n }\n\n reconcileElementId(element: HTMLElement) {\n if (isElementOfType(element, 'img')) {\n const indexedImg = getIndexedSegmentItem(element);\n\n if (indexedImg?.segments[0]?.segmentType == 'Image') {\n indexedImg.segments[0].format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else if (isElementOfType(element, 'table')) {\n const indexedTable = getIndexedTableItem(element);\n\n if (indexedTable) {\n indexedTable.table.format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private onBlockEntityDelimiter(\n node: Node | null,\n entity: ContentModelEntity,\n parent: ContentModelBlockGroup\n ) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isEntityDelimiter(node) && node.firstChild) {\n const indexedDelimiter = node.firstChild as IndexedEntityDelimiter;\n\n indexedDelimiter.__roosterjsContentModel = { entity, parent };\n }\n }\n\n private isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n }\n\n private reconcileNodeSelection(\n node: Node,\n offset: number,\n defaultFormat?: ContentModelSegmentFormat\n ): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n if (isIndexedSegment(node)) {\n return this.reconcileTextSelection(node, offset);\n } else if (isIndexedDelimiter(node)) {\n return this.reconcileDelimiterSelection(node, defaultFormat);\n } else {\n return undefined;\n }\n } else if (offset >= node.childNodes.length) {\n return this.insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return this.insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n }\n\n private insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n const segmentItem = node && getIndexedSegmentItem(node);\n\n if (segmentItem) {\n const { paragraph, segments } = segmentItem;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n }\n\n private reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number,\n selectionMarker?: ContentModelSelectionMarker\n ) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(selectionMarker?.format ?? first.format);\n newSegments.push(marker);\n\n if (startOffset < (textNode.nodeValue ?? '').length) {\n if (first.link) {\n addLink(marker, first.link);\n }\n\n if (first.code) {\n addCode(marker, first.code);\n }\n }\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker'\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker'\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n this.onSegment(textNode, paragraph, textSegments);\n } else if (first?.segmentType == 'Entity' && first == last) {\n const wrapper = first.wrapper;\n const index = paragraph.segments.indexOf(first);\n const delimiter = textNode.parentElement;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n const marker = createSelectionMarker(\n selectionMarker?.format ??\n (paragraph.segments[isAfter ? index + 1 : index - 1] ?? first).format\n );\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n\n selectable = marker;\n }\n }\n\n return selectable;\n }\n\n private reconcileDelimiterSelection(\n node: IndexedEntityDelimiter,\n defaultFormat?: ContentModelSegmentFormat\n ) {\n let marker: ContentModelSelectionMarker | undefined;\n\n const { entity, parent } = node.__roosterjsContentModel;\n const index = parent.blocks.indexOf(entity);\n const delimiter = node.parentElement;\n const wrapper = entity.wrapper;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n marker = createSelectionMarker(defaultFormat);\n\n const para = createParagraph(\n true /*isImplicit*/,\n undefined /*blockFormat*/,\n defaultFormat\n );\n\n para.segments.push(marker);\n parent.blocks.splice(isBefore ? index : index + 1, 0, para);\n }\n\n return marker;\n }\n\n private reconcileAddedNode(node: Text, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let index = -1;\n let existingSegment: ContentModelSegment;\n const { previousSibling, nextSibling } = node;\n\n if (\n (segmentItem = getIndexedSegmentItem(getLastLeaf(previousSibling))) &&\n (existingSegment = segmentItem.segments[segmentItem.segments.length - 1]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment before current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index + 1, node, existingSegment.format);\n } else if (\n (segmentItem = getIndexedSegmentItem(getFirstLeaf(nextSibling))) &&\n (existingSegment = segmentItem.segments[0]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment after current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index, node, existingSegment.format);\n } else if (context.paragraph && context.segIndex >= 0) {\n // When there is indexed paragraph from removed nodes, we can use it as the insert index\n this.indexNode(context.paragraph, context.segIndex, node, context.format);\n } else if (context.pendingTextNode === undefined) {\n // When we can't find the insert index, set current node as pending node\n // so later we can pick it up when we have enough info when processing removed node\n // Only do this when pendingTextNode is undefined. If it is null it means there was already a pending node before\n // and in that case we should return false since we can't handle two pending text node\n context.pendingTextNode = node;\n } else {\n return false;\n }\n\n return true;\n }\n\n private reconcileRemovedNode(node: Node, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let removingSegment: ContentModelSegment;\n\n if (\n context.segIndex < 0 &&\n !context.paragraph && // No previous removed segment or related paragraph found, and\n (segmentItem = getIndexedSegmentItem(node)) && // The removed node is indexed, and\n (removingSegment = segmentItem.segments[0]) // There is at least one related segment\n ) {\n // Now we can remove the indexed segment from the paragraph, and remember it, later we may need to use it\n context.format = removingSegment.format;\n context.paragraph = segmentItem.paragraph;\n context.segIndex = segmentItem.paragraph.segments.indexOf(segmentItem.segments[0]);\n\n if (context.segIndex < 0) {\n // Indexed segment is not under paragraph, something wrong happens, we cannot keep handling\n return false;\n }\n\n for (let i = 0; i < segmentItem.segments.length; i++) {\n const index = segmentItem.paragraph.segments.indexOf(segmentItem.segments[i]);\n\n if (index >= 0) {\n segmentItem.paragraph.segments.splice(index, 1);\n }\n }\n\n if (context.pendingTextNode) {\n // If we have pending text node added but not indexed, do it now\n this.indexNode(\n context.paragraph,\n context.segIndex,\n context.pendingTextNode,\n segmentItem.segments[0].format\n );\n\n // Set to null since we have processed it.\n // Next time we see a pending node we know we have already processed one so it is a situation we cannot handle\n context.pendingTextNode = null;\n }\n\n return true;\n } else {\n return false;\n }\n }\n\n private indexNode(\n paragraph: ContentModelParagraph,\n index: number,\n textNode: Text,\n format?: ContentModelSegmentFormat\n ) {\n const copiedFormat = format ? { ...format } : undefined;\n\n if (copiedFormat) {\n getObjectKeys(copiedFormat).forEach(key => {\n if (EmptySegmentFormat[key] === undefined) {\n delete copiedFormat[key];\n }\n });\n }\n\n const text = createText(textNode.textContent ?? '', copiedFormat);\n\n paragraph.segments.splice(index, 0, text);\n this.onSegment(textNode, paragraph, [text]);\n }\n\n private selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection: CacheSelection,\n newSelection: DOMSelection\n ): ContentModelSelectionMarker | undefined {\n // For CJK keyboard input on mobile, we may have a situation like this:\n // User toggle bold/italic/underline on an empty div, the pending format will be applied on the selection marker\n // then type some text, the selection move to the text node and the selection marker will be recreated during the reconciliation and lose its original formatting\n // In this case, we need to keep the original formatting of the selection marker to match the pending format\n\n if (\n this.keepSelectionMarkerWhenEnteringTextNode &&\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n newSelection.type == 'range' &&\n isNodeOfType(newSelection.range.commonAncestorContainer, 'TEXT_NODE') &&\n newSelection.range.commonAncestorContainer.parentElement == oldSelection.start.node &&\n isIndexedSegment(newSelection.range.commonAncestorContainer) &&\n newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph.segments[0]\n .segmentType == 'SelectionMarker'\n ) {\n return newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph\n .segments[0];\n }\n return undefined;\n }\n}\n\nfunction getLastLeaf(node: Node | null): Node | null {\n while (node?.lastChild) {\n node = node.lastChild;\n }\n\n return node;\n}\n\nfunction getFirstLeaf(node: Node | null): Node | null {\n while (node?.firstChild) {\n node = node.firstChild;\n }\n\n return node;\n}\n\nfunction internalClearIndex(container: Node) {\n unindex(container as IndexedSegmentNode);\n\n for (let node = container.firstChild; node; node = node.nextSibling) {\n internalClearIndex(node);\n }\n}\n"]}
@@ -21,20 +21,20 @@ var ContextMenuPlugin = /** @class */ (function () {
21
21
  var _a;
22
22
  if (_this.editor) {
23
23
  var allItems_1 = [];
24
- var mouseEvent = e;
24
+ var mouseEvent_1 = e;
25
25
  var pointerEvent = e;
26
26
  // ContextMenu event can be triggered from mouse right click or keyboard (e.g. Shift+F10 on Windows)
27
27
  // Need to check if this is from keyboard, we need to get target node from selection because in that case
28
28
  // event.target is always the element that attached context menu event, here it will be editor content div.
29
- var targetNode_1 = mouseEvent.button == ContextMenuButton
30
- ? mouseEvent.target
29
+ var targetNode_1 = mouseEvent_1.button == ContextMenuButton
30
+ ? mouseEvent_1.target
31
31
  : (pointerEvent === null || pointerEvent === void 0 ? void 0 : pointerEvent.pointerType) === 'touch' || (pointerEvent === null || pointerEvent === void 0 ? void 0 : pointerEvent.pointerType) === 'pen'
32
32
  ? pointerEvent.target
33
33
  : _this.getFocusedNode(_this.editor);
34
34
  if (targetNode_1) {
35
35
  _this.state.contextMenuProviders.forEach(function (provider) {
36
36
  var _a;
37
- var items = (_a = provider.getContextMenuItems(targetNode_1)) !== null && _a !== void 0 ? _a : [];
37
+ var items = (_a = provider.getContextMenuItems(targetNode_1, mouseEvent_1)) !== null && _a !== void 0 ? _a : [];
38
38
  if ((items === null || items === void 0 ? void 0 : items.length) > 0) {
39
39
  if (allItems_1.length > 0) {
40
40
  allItems_1.push(null);
@@ -44,7 +44,7 @@ var ContextMenuPlugin = /** @class */ (function () {
44
44
  });
45
45
  }
46
46
  (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.triggerEvent('contextMenu', {
47
- rawEvent: mouseEvent,
47
+ rawEvent: mouseEvent_1,
48
48
  items: allItems_1,
49
49
  });
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenuPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/contextMenu/ContextMenuPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSelectionRootNode } from 'roosterjs-content-model-dom';\nimport type {\n ContextMenuPluginState,\n ContextMenuProvider,\n IEditor,\n PluginWithState,\n EditorOptions,\n DOMEventRecord,\n} from 'roosterjs-content-model-types';\n\nconst ContextMenuButton = 2;\n\n/**\n * Edit Component helps handle Content edit features\n */\nclass ContextMenuPlugin implements PluginWithState<ContextMenuPluginState> {\n private editor: IEditor | null = null;\n private state: ContextMenuPluginState;\n private disposer: (() => void) | null = null;\n\n /**\n * Construct a new instance of EditPlugin\n * @param options The editor options\n */\n constructor(options: EditorOptions) {\n this.state = {\n contextMenuProviders:\n options.plugins?.filter<ContextMenuProvider<any>>(isContextMenuProvider) || [],\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'ContextMenu';\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 const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n contextmenu: {\n beforeDispatch: (event: MouseEvent | PointerEvent) =>\n this.onContextMenuEvent(event),\n },\n };\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onContextMenuEvent = (e: MouseEvent | PointerEvent) => {\n if (this.editor) {\n const allItems: any[] = [];\n const mouseEvent = e as MouseEvent;\n const pointerEvent = e as PointerEvent;\n\n // ContextMenu event can be triggered from mouse right click or keyboard (e.g. Shift+F10 on Windows)\n // Need to check if this is from keyboard, we need to get target node from selection because in that case\n // event.target is always the element that attached context menu event, here it will be editor content div.\n const targetNode =\n mouseEvent.button == ContextMenuButton\n ? (mouseEvent.target as Node)\n : pointerEvent?.pointerType === 'touch' || pointerEvent?.pointerType === 'pen'\n ? (pointerEvent.target as Node)\n : this.getFocusedNode(this.editor);\n\n if (targetNode) {\n this.state.contextMenuProviders.forEach(provider => {\n const items = provider.getContextMenuItems(targetNode) ?? [];\n if (items?.length > 0) {\n if (allItems.length > 0) {\n allItems.push(null);\n }\n\n allItems.push(...items);\n }\n });\n }\n\n this.editor?.triggerEvent('contextMenu', {\n rawEvent: mouseEvent,\n items: allItems,\n });\n }\n };\n\n private getFocusedNode(editor: IEditor) {\n const selection = editor.getDOMSelection();\n\n if (selection) {\n if (selection.type == 'range') {\n selection.range.collapse(true /*toStart*/);\n }\n\n return getSelectionRootNode(selection) || null;\n } else {\n return null;\n }\n }\n}\n\nfunction isContextMenuProvider(source: unknown): source is ContextMenuProvider<any> {\n return !!(<ContextMenuProvider<any>>source)?.getContextMenuItems;\n}\n\n/**\n * @internal\n * Create a new instance of EditPlugin.\n */\nexport function createContextMenuPlugin(\n options: EditorOptions\n): PluginWithState<ContextMenuPluginState> {\n return new ContextMenuPlugin(options);\n}\n"]}
1
+ {"version":3,"file":"ContextMenuPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/contextMenu/ContextMenuPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSelectionRootNode } from 'roosterjs-content-model-dom';\nimport type {\n ContextMenuPluginState,\n ContextMenuProvider,\n IEditor,\n PluginWithState,\n EditorOptions,\n DOMEventRecord,\n} from 'roosterjs-content-model-types';\n\nconst ContextMenuButton = 2;\n\n/**\n * Edit Component helps handle Content edit features\n */\nclass ContextMenuPlugin implements PluginWithState<ContextMenuPluginState> {\n private editor: IEditor | null = null;\n private state: ContextMenuPluginState;\n private disposer: (() => void) | null = null;\n\n /**\n * Construct a new instance of EditPlugin\n * @param options The editor options\n */\n constructor(options: EditorOptions) {\n this.state = {\n contextMenuProviders:\n options.plugins?.filter<ContextMenuProvider<any>>(isContextMenuProvider) || [],\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'ContextMenu';\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 const eventHandlers: Partial<\n { [P in keyof HTMLElementEventMap]: DOMEventRecord<HTMLElementEventMap[P]> }\n > = {\n contextmenu: {\n beforeDispatch: (event: MouseEvent | PointerEvent) =>\n this.onContextMenuEvent(event),\n },\n };\n this.disposer = this.editor.attachDomEvent(<Record<string, DOMEventRecord>>eventHandlers);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.disposer?.();\n this.disposer = null;\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onContextMenuEvent = (e: MouseEvent | PointerEvent) => {\n if (this.editor) {\n const allItems: any[] = [];\n const mouseEvent = e as MouseEvent;\n const pointerEvent = e as PointerEvent;\n\n // ContextMenu event can be triggered from mouse right click or keyboard (e.g. Shift+F10 on Windows)\n // Need to check if this is from keyboard, we need to get target node from selection because in that case\n // event.target is always the element that attached context menu event, here it will be editor content div.\n const targetNode =\n mouseEvent.button == ContextMenuButton\n ? (mouseEvent.target as Node)\n : pointerEvent?.pointerType === 'touch' || pointerEvent?.pointerType === 'pen'\n ? (pointerEvent.target as Node)\n : this.getFocusedNode(this.editor);\n\n if (targetNode) {\n this.state.contextMenuProviders.forEach(provider => {\n const items = provider.getContextMenuItems(targetNode, mouseEvent) ?? [];\n if (items?.length > 0) {\n if (allItems.length > 0) {\n allItems.push(null);\n }\n\n allItems.push(...items);\n }\n });\n }\n\n this.editor?.triggerEvent('contextMenu', {\n rawEvent: mouseEvent,\n items: allItems,\n });\n }\n };\n\n private getFocusedNode(editor: IEditor) {\n const selection = editor.getDOMSelection();\n\n if (selection) {\n if (selection.type == 'range') {\n selection.range.collapse(true /*toStart*/);\n }\n\n return getSelectionRootNode(selection) || null;\n } else {\n return null;\n }\n }\n}\n\nfunction isContextMenuProvider(source: unknown): source is ContextMenuProvider<any> {\n return !!(<ContextMenuProvider<any>>source)?.getContextMenuItems;\n}\n\n/**\n * @internal\n * Create a new instance of EditPlugin.\n */\nexport function createContextMenuPlugin(\n options: EditorOptions\n): PluginWithState<ContextMenuPluginState> {\n return new ContextMenuPlugin(options);\n}\n"]}
@@ -22,7 +22,6 @@ var CopyPastePlugin = /** @class */ (function () {
22
22
  var _this = this;
23
23
  this.editor = null;
24
24
  this.disposer = null;
25
- this.customCopyCutEnabled = false;
26
25
  this.onPaste = function (event) {
27
26
  if (_this.editor && isClipboardEvent(event)) {
28
27
  var editor_1 = _this.editor;
@@ -67,7 +66,6 @@ var CopyPastePlugin = /** @class */ (function () {
67
66
  beforeDispatch: function (e) { return _this.onCutCopy(e, true /*isCut*/); },
68
67
  },
69
68
  });
70
- this.customCopyCutEnabled = editor.isExperimentalFeatureEnabled('CustomCopyCut');
71
69
  };
72
70
  /**
73
71
  * Dispose this plugin
@@ -128,7 +126,7 @@ var CopyPastePlugin = /** @class */ (function () {
128
126
  rawEvent: event,
129
127
  isCut: isCut,
130
128
  }).range;
131
- if (this.customCopyCutEnabled && isClipboardEvent(event)) {
129
+ if (isClipboardEvent(event)) {
132
130
  event.preventDefault();
133
131
  var text = (0, roosterjs_content_model_dom_1.contentModelToText)(pasteModel);
134
132
  (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.setData('text/html', tempDiv_1.innerHTML);
@@ -174,9 +172,7 @@ var CopyPastePlugin = /** @class */ (function () {
174
172
  tempDiv.style.left = '0';
175
173
  tempDiv.style.userSelect = 'text';
176
174
  tempDiv.contentEditable = 'true';
177
- if (!this.customCopyCutEnabled) {
178
- doc.body.appendChild(tempDiv);
179
- }
175
+ doc.body.appendChild(tempDiv);
180
176
  this.state.tempDiv = tempDiv;
181
177
  }
182
178
  var div = this.state.tempDiv;
@@ -1 +1 @@
1
- {"version":3,"file":"CopyPastePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/CopyPastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from '../../coreApi/setDOMSelection/addRangeToSelection';\nimport { adjustImageSelectionOnSafari } from './utils/adjustImageSelectionOnSafari';\nimport { deleteEmptyList } from './utils/deleteEmptyList';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport { paste } from '../../command/paste/paste';\nimport { pruneUnselectedModel } from './utils/pruneUnselectedModel';\nimport {\n ChangeSource,\n contentModelToDom,\n contentModelToText,\n createModelToDomContext,\n deleteSelection,\n extractClipboardItems,\n getSelectedCells,\n isElementOfType,\n isNodeOfType,\n iterateSelections,\n moveChildNodes,\n normalizeContentModel,\n toArray,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type {\n ClipboardData,\n CopyPastePluginState,\n ContentModelTable,\n DOMSelection,\n IEditor,\n OnNodeCreated,\n EditorOptions,\n PluginWithState,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSegment,\n ReadonlyTableSelectionContext,\n} from 'roosterjs-content-model-types';\n\nconst TEMP_DIV_ID = 'roosterJS_copyCutTempDiv';\n\n/**\n * Copy and paste plugin for handling onCopy and onPaste event\n */\nclass CopyPastePlugin implements PluginWithState<CopyPastePluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: CopyPastePluginState;\n private customCopyCutEnabled: boolean = false;\n\n /**\n * Construct a new instance of CopyPastePlugin\n * @param option The editor option\n */\n constructor(option: EditorOptions) {\n this.state = {\n allowedCustomPasteType: option.allowedCustomPasteType || [],\n tempDiv: null,\n defaultPasteType: option.defaultPasteType,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'CopyPaste';\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 this.disposer = this.editor.attachDomEvent({\n paste: {\n beforeDispatch: e => this.onPaste(e),\n },\n copy: {\n beforeDispatch: e => this.onCutCopy(e, false /*isCut*/),\n },\n cut: {\n beforeDispatch: e => this.onCutCopy(e, true /*isCut*/),\n },\n });\n this.customCopyCutEnabled = editor.isExperimentalFeatureEnabled('CustomCopyCut');\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n if (this.state.tempDiv) {\n this.state.tempDiv.parentNode?.removeChild(this.state.tempDiv);\n this.state.tempDiv = null;\n }\n\n if (this.disposer) {\n this.disposer();\n }\n this.disposer = null;\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onCutCopy(event: Event, isCut: boolean) {\n if (!this.editor) {\n return;\n }\n\n const doc = this.editor.getDocument();\n const selection = this.editor.getDOMSelection();\n\n adjustImageSelectionOnSafari(this.editor, selection);\n\n if (selection && (selection.type != 'range' || !selection.range.collapsed)) {\n const pasteModel = this.editor.getContentModelCopy('disconnected');\n\n pruneUnselectedModel(pasteModel);\n\n if (selection.type === 'table') {\n iterateSelections(pasteModel, (_, tableContext) => {\n if (tableContext?.table) {\n preprocessTable(tableContext.table);\n\n return true;\n }\n return false;\n });\n } else if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n\n const tempDiv = this.getTempDiv(this.editor.getDocument());\n const context = createModelToDomContext();\n\n context.onNodeCreated = onNodeCreated;\n\n const selectionForCopy = contentModelToDom(\n tempDiv.ownerDocument,\n tempDiv,\n pasteModel,\n context\n );\n\n let newRange: Range | null = selectionForCopy\n ? domSelectionToRange(doc, selectionForCopy)\n : null;\n\n if (newRange) {\n newRange = this.editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event as ClipboardEvent,\n isCut,\n }).range;\n\n if (this.customCopyCutEnabled && isClipboardEvent(event)) {\n event.preventDefault();\n const text = contentModelToText(pasteModel);\n event.clipboardData?.setData('text/html', tempDiv.innerHTML);\n event.clipboardData?.setData('text/plain', text);\n } else if (newRange) {\n addRangeToSelection(doc, newRange);\n }\n\n doc.defaultView?.requestAnimationFrame(() => {\n if (!this.editor) {\n return;\n }\n\n cleanUpAndRestoreSelection(tempDiv);\n this.editor.setDOMSelection(selection);\n this.editor.focus();\n\n if (isCut) {\n this.editor.formatContentModel(\n (model, context) => {\n if (\n deleteSelection(model, [deleteEmptyList], context)\n .deleteResult == 'range'\n ) {\n normalizeContentModel(model);\n }\n\n return true;\n },\n {\n apiName: 'cut',\n changeSource: ChangeSource.Cut,\n }\n );\n }\n });\n } else {\n cleanUpAndRestoreSelection(tempDiv);\n }\n }\n }\n\n private onPaste = (event: Event) => {\n if (this.editor && isClipboardEvent(event)) {\n const editor = this.editor;\n\n const dataTransfer = event.clipboardData;\n\n if (shouldPreventDefaultPaste(dataTransfer, editor)) {\n event.preventDefault();\n extractClipboardItems(\n toArray(dataTransfer!.items),\n this.state.allowedCustomPasteType\n ).then((clipboardData: ClipboardData) => {\n if (!editor.isDisposed()) {\n paste(editor, clipboardData, this.state.defaultPasteType);\n }\n });\n }\n }\n };\n\n private getTempDiv(doc: Document) {\n if (!this.state.tempDiv) {\n const tempDiv = doc.createElement('div');\n\n tempDiv.style.width = '600px';\n tempDiv.style.height = '1px';\n tempDiv.style.overflow = 'hidden';\n tempDiv.style.position = 'fixed';\n tempDiv.style.top = '0';\n tempDiv.style.left = '0';\n tempDiv.style.userSelect = 'text';\n tempDiv.contentEditable = 'true';\n\n if (!this.customCopyCutEnabled) {\n doc.body.appendChild(tempDiv);\n }\n\n this.state.tempDiv = tempDiv;\n }\n\n const div = this.state.tempDiv;\n\n div.style.backgroundColor = 'white';\n div.style.color = 'black';\n div.childNodes.forEach(node => div.removeChild(node));\n\n div.style.display = '';\n div.id = TEMP_DIV_ID;\n div.focus();\n\n return div;\n }\n}\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function adjustSelectionForCopyCut(pasteModel: ContentModelDocument) {\n let selectionMarker: ContentModelSegment | undefined;\n let firstBlock: ContentModelParagraph | undefined;\n let tableContext: ReadonlyTableSelectionContext | undefined;\n\n iterateSelections(pasteModel, (_, tableCtxt, block, segments) => {\n if (selectionMarker) {\n if (tableCtxt != tableContext && firstBlock?.segments.includes(selectionMarker)) {\n firstBlock.segments.splice(firstBlock.segments.indexOf(selectionMarker), 1);\n }\n return true;\n }\n\n const marker = segments?.find(segment => segment.segmentType == 'SelectionMarker');\n if (!selectionMarker && marker) {\n tableContext = tableCtxt;\n firstBlock = block?.blockType == 'Paragraph' ? block : undefined;\n selectionMarker = marker;\n }\n\n return false;\n });\n}\n\nfunction cleanUpAndRestoreSelection(tempDiv: HTMLDivElement) {\n tempDiv.style.backgroundColor = '';\n tempDiv.style.color = '';\n tempDiv.style.display = 'none';\n moveChildNodes(tempDiv);\n}\n\nfunction isClipboardEvent(event: Event): event is ClipboardEvent {\n return !!(event as ClipboardEvent).clipboardData;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function preprocessTable(table: ContentModelTable) {\n const sel = getSelectedCells(table);\n table.rows = table.rows\n .map(row => {\n return {\n ...row,\n cells: row.cells.filter(cell => cell.isSelected),\n };\n })\n .filter(row => row.cells.length > 0);\n\n delete table.format.width;\n\n table.widths = sel\n ? table.widths.filter((_, index) => index >= sel?.firstColumn && index <= sel?.lastColumn)\n : [];\n}\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function shouldPreventDefaultPaste(\n dataTransfer: DataTransfer | null,\n editor: IEditor\n): boolean {\n if (!dataTransfer?.items) {\n return false;\n }\n\n if (!editor.getEnvironment().isAndroid) {\n return true;\n }\n\n // On Android, the clipboard data from Office apps is a file, which can't be loaded\n // so we have to allow the default browser behavior\n return toArray(dataTransfer.items).some(item => {\n const { type } = item;\n const isNormalFile = item.kind === 'file' && type !== '';\n const isText = type.indexOf('text/') === 0;\n return isNormalFile || isText;\n });\n}\n\n/**\n * @internal\n * Create a new instance of CopyPastePlugin\n * @param option The editor option\n */\nexport function createCopyPastePlugin(\n option: EditorOptions\n): PluginWithState<CopyPastePluginState> {\n return new CopyPastePlugin(option);\n}\n"]}
1
+ {"version":3,"file":"CopyPastePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/CopyPastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from '../../coreApi/setDOMSelection/addRangeToSelection';\nimport { adjustImageSelectionOnSafari } from './utils/adjustImageSelectionOnSafari';\nimport { deleteEmptyList } from './utils/deleteEmptyList';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport { paste } from '../../command/paste/paste';\nimport { pruneUnselectedModel } from './utils/pruneUnselectedModel';\nimport {\n ChangeSource,\n contentModelToDom,\n contentModelToText,\n createModelToDomContext,\n deleteSelection,\n extractClipboardItems,\n getSelectedCells,\n isElementOfType,\n isNodeOfType,\n iterateSelections,\n moveChildNodes,\n normalizeContentModel,\n toArray,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type {\n ClipboardData,\n CopyPastePluginState,\n ContentModelTable,\n DOMSelection,\n IEditor,\n OnNodeCreated,\n EditorOptions,\n PluginWithState,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSegment,\n ReadonlyTableSelectionContext,\n} from 'roosterjs-content-model-types';\n\nconst TEMP_DIV_ID = 'roosterJS_copyCutTempDiv';\n\n/**\n * Copy and paste plugin for handling onCopy and onPaste event\n */\nclass CopyPastePlugin implements PluginWithState<CopyPastePluginState> {\n private editor: IEditor | null = null;\n private disposer: (() => void) | null = null;\n private state: CopyPastePluginState;\n\n /**\n * Construct a new instance of CopyPastePlugin\n * @param option The editor option\n */\n constructor(option: EditorOptions) {\n this.state = {\n allowedCustomPasteType: option.allowedCustomPasteType || [],\n tempDiv: null,\n defaultPasteType: option.defaultPasteType,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'CopyPaste';\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 this.disposer = this.editor.attachDomEvent({\n paste: {\n beforeDispatch: e => this.onPaste(e),\n },\n copy: {\n beforeDispatch: e => this.onCutCopy(e, false /*isCut*/),\n },\n cut: {\n beforeDispatch: e => this.onCutCopy(e, true /*isCut*/),\n },\n });\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n if (this.state.tempDiv) {\n this.state.tempDiv.parentNode?.removeChild(this.state.tempDiv);\n this.state.tempDiv = null;\n }\n\n if (this.disposer) {\n this.disposer();\n }\n this.disposer = null;\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onCutCopy(event: Event, isCut: boolean) {\n if (!this.editor) {\n return;\n }\n\n const doc = this.editor.getDocument();\n const selection = this.editor.getDOMSelection();\n\n adjustImageSelectionOnSafari(this.editor, selection);\n\n if (selection && (selection.type != 'range' || !selection.range.collapsed)) {\n const pasteModel = this.editor.getContentModelCopy('disconnected');\n\n pruneUnselectedModel(pasteModel);\n\n if (selection.type === 'table') {\n iterateSelections(pasteModel, (_, tableContext) => {\n if (tableContext?.table) {\n preprocessTable(tableContext.table);\n\n return true;\n }\n return false;\n });\n } else if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n\n const tempDiv = this.getTempDiv(this.editor.getDocument());\n const context = createModelToDomContext();\n\n context.onNodeCreated = onNodeCreated;\n\n const selectionForCopy = contentModelToDom(\n tempDiv.ownerDocument,\n tempDiv,\n pasteModel,\n context\n );\n\n let newRange: Range | null = selectionForCopy\n ? domSelectionToRange(doc, selectionForCopy)\n : null;\n\n if (newRange) {\n newRange = this.editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event as ClipboardEvent,\n isCut,\n }).range;\n\n if (isClipboardEvent(event)) {\n event.preventDefault();\n const text = contentModelToText(pasteModel);\n event.clipboardData?.setData('text/html', tempDiv.innerHTML);\n event.clipboardData?.setData('text/plain', text);\n } else if (newRange) {\n addRangeToSelection(doc, newRange);\n }\n\n doc.defaultView?.requestAnimationFrame(() => {\n if (!this.editor) {\n return;\n }\n\n cleanUpAndRestoreSelection(tempDiv);\n this.editor.setDOMSelection(selection);\n this.editor.focus();\n\n if (isCut) {\n this.editor.formatContentModel(\n (model, context) => {\n if (\n deleteSelection(model, [deleteEmptyList], context)\n .deleteResult == 'range'\n ) {\n normalizeContentModel(model);\n }\n\n return true;\n },\n {\n apiName: 'cut',\n changeSource: ChangeSource.Cut,\n }\n );\n }\n });\n } else {\n cleanUpAndRestoreSelection(tempDiv);\n }\n }\n }\n\n private onPaste = (event: Event) => {\n if (this.editor && isClipboardEvent(event)) {\n const editor = this.editor;\n\n const dataTransfer = event.clipboardData;\n\n if (shouldPreventDefaultPaste(dataTransfer, editor)) {\n event.preventDefault();\n extractClipboardItems(\n toArray(dataTransfer!.items),\n this.state.allowedCustomPasteType\n ).then((clipboardData: ClipboardData) => {\n if (!editor.isDisposed()) {\n paste(editor, clipboardData, this.state.defaultPasteType);\n }\n });\n }\n }\n };\n\n private getTempDiv(doc: Document) {\n if (!this.state.tempDiv) {\n const tempDiv = doc.createElement('div');\n\n tempDiv.style.width = '600px';\n tempDiv.style.height = '1px';\n tempDiv.style.overflow = 'hidden';\n tempDiv.style.position = 'fixed';\n tempDiv.style.top = '0';\n tempDiv.style.left = '0';\n tempDiv.style.userSelect = 'text';\n tempDiv.contentEditable = 'true';\n doc.body.appendChild(tempDiv);\n\n this.state.tempDiv = tempDiv;\n }\n\n const div = this.state.tempDiv;\n\n div.style.backgroundColor = 'white';\n div.style.color = 'black';\n div.childNodes.forEach(node => div.removeChild(node));\n\n div.style.display = '';\n div.id = TEMP_DIV_ID;\n div.focus();\n\n return div;\n }\n}\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function adjustSelectionForCopyCut(pasteModel: ContentModelDocument) {\n let selectionMarker: ContentModelSegment | undefined;\n let firstBlock: ContentModelParagraph | undefined;\n let tableContext: ReadonlyTableSelectionContext | undefined;\n\n iterateSelections(pasteModel, (_, tableCtxt, block, segments) => {\n if (selectionMarker) {\n if (tableCtxt != tableContext && firstBlock?.segments.includes(selectionMarker)) {\n firstBlock.segments.splice(firstBlock.segments.indexOf(selectionMarker), 1);\n }\n return true;\n }\n\n const marker = segments?.find(segment => segment.segmentType == 'SelectionMarker');\n if (!selectionMarker && marker) {\n tableContext = tableCtxt;\n firstBlock = block?.blockType == 'Paragraph' ? block : undefined;\n selectionMarker = marker;\n }\n\n return false;\n });\n}\n\nfunction cleanUpAndRestoreSelection(tempDiv: HTMLDivElement) {\n tempDiv.style.backgroundColor = '';\n tempDiv.style.color = '';\n tempDiv.style.display = 'none';\n moveChildNodes(tempDiv);\n}\n\nfunction isClipboardEvent(event: Event): event is ClipboardEvent {\n return !!(event as ClipboardEvent).clipboardData;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function preprocessTable(table: ContentModelTable) {\n const sel = getSelectedCells(table);\n table.rows = table.rows\n .map(row => {\n return {\n ...row,\n cells: row.cells.filter(cell => cell.isSelected),\n };\n })\n .filter(row => row.cells.length > 0);\n\n delete table.format.width;\n\n table.widths = sel\n ? table.widths.filter((_, index) => index >= sel?.firstColumn && index <= sel?.lastColumn)\n : [];\n}\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport function shouldPreventDefaultPaste(\n dataTransfer: DataTransfer | null,\n editor: IEditor\n): boolean {\n if (!dataTransfer?.items) {\n return false;\n }\n\n if (!editor.getEnvironment().isAndroid) {\n return true;\n }\n\n // On Android, the clipboard data from Office apps is a file, which can't be loaded\n // so we have to allow the default browser behavior\n return toArray(dataTransfer.items).some(item => {\n const { type } = item;\n const isNormalFile = item.kind === 'file' && type !== '';\n const isText = type.indexOf('text/') === 0;\n return isNormalFile || isText;\n });\n}\n\n/**\n * @internal\n * Create a new instance of CopyPastePlugin\n * @param option The editor option\n */\nexport function createCopyPastePlugin(\n option: EditorOptions\n): PluginWithState<CopyPastePluginState> {\n return new CopyPastePlugin(option);\n}\n"]}
@@ -45,7 +45,6 @@ define(["require", "exports", "./areSameSelections", "./ParagraphMapImpl", "./te
45
45
  };
46
46
  this.state = {
47
47
  domIndexer: new domIndexerImpl_1.DomIndexerImpl(option.experimentalFeatures &&
48
- option.experimentalFeatures.indexOf('PersistCache') >= 0, option.experimentalFeatures &&
49
48
  option.experimentalFeatures.indexOf('KeepSelectionMarkerWhenEnteringTextNode') >= 0),
50
49
  textMutationObserver: (0, textMutationObserver_1.createTextMutationObserver)(contentDiv, this.onMutation),
51
50
  };