roosterjs 8.25.0 → 8.26.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.
@@ -2247,7 +2247,7 @@ function changeCapitalization(editor, capitalization, language) {
2247
2247
  }
2248
2248
  }
2249
2249
  }
2250
- });
2250
+ }, 'changeCapitalization');
2251
2251
  function getCapitalizedText(originalText, language) {
2252
2252
  switch (capitalization) {
2253
2253
  case "lowercase" /* Lowercase */:
@@ -2317,7 +2317,7 @@ function changeFontSize(editor, change, fontSizes) {
2317
2317
  if (lineHeight != 'normal') {
2318
2318
  element.style.lineHeight = 'normal';
2319
2319
  }
2320
- });
2320
+ }, 'changeFontSize');
2321
2321
  }
2322
2322
  exports.default = changeFontSize;
2323
2323
  /**
@@ -2396,6 +2396,7 @@ exports.default = clearBlockFormat;
2396
2396
  Object.defineProperty(exports, "__esModule", { value: true });
2397
2397
  var blockFormat_1 = __webpack_require__(/*! ../utils/blockFormat */ "./packages/roosterjs-editor-api/lib/utils/blockFormat.ts");
2398
2398
  var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/roosterjs-editor-api/lib/utils/execCommand.ts");
2399
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
2399
2400
  var setBackgroundColor_1 = __webpack_require__(/*! ./setBackgroundColor */ "./packages/roosterjs-editor-api/lib/format/setBackgroundColor.ts");
2400
2401
  var setFontName_1 = __webpack_require__(/*! ./setFontName */ "./packages/roosterjs-editor-api/lib/format/setFontName.ts");
2401
2402
  var setFontSize_1 = __webpack_require__(/*! ./setFontSize */ "./packages/roosterjs-editor-api/lib/format/setFontSize.ts");
@@ -2511,7 +2512,7 @@ function clearAutoDetectFormat(editor) {
2511
2512
  * @param editor The editor instance
2512
2513
  */
2513
2514
  function clearBlockFormat(editor) {
2514
- editor.addUndoSnapshot(function () {
2515
+ (0, formatUndoSnapshot_1.default)(editor, function () {
2515
2516
  (0, blockFormat_1.default)(editor, function (region) {
2516
2517
  var blocks = (0, roosterjs_editor_dom_1.getSelectedBlockElementsInRegion)(region);
2517
2518
  var nodes = (0, roosterjs_editor_dom_1.collapseNodesInRegion)(region, blocks);
@@ -2530,7 +2531,7 @@ function clearBlockFormat(editor) {
2530
2531
  nodes.forEach(clearNodeFormat);
2531
2532
  });
2532
2533
  setDefaultFormat(editor);
2533
- }, "Format" /* Format */);
2534
+ }, 'clearBlockFormat');
2534
2535
  }
2535
2536
  function clearInlineFormat(editor) {
2536
2537
  editor.focus();
@@ -2540,6 +2541,7 @@ function clearInlineFormat(editor) {
2540
2541
  return node.removeAttribute('class');
2541
2542
  });
2542
2543
  setDefaultFormat(editor);
2544
+ return 'clearInlineFormat';
2543
2545
  }, "Format" /* Format */);
2544
2546
  }
2545
2547
  function setDefaultFormat(editor) {
@@ -2723,11 +2725,13 @@ function createLink(editor, link, altText, displayText, target) {
2723
2725
  editor.getDocument().execCommand("createLink" /* CreateLink */, false, normalizedUrl_1);
2724
2726
  var traverser = editor.getSelectionTraverser();
2725
2727
  var currentInline = traverser.getNextInlineElement();
2728
+ // list for removing unwanted lines
2729
+ var deletionInlineList = [];
2726
2730
  while (currentInline) {
2727
- var a = currentInline.getContainerNode();
2728
- a.parentElement.removeChild(a);
2731
+ deletionInlineList.push(currentInline.getContainerNode());
2729
2732
  currentInline = traverser.getNextInlineElement();
2730
2733
  }
2734
+ deletionInlineList.forEach(function (node) { return editor.deleteNode(node); });
2731
2735
  anchor = getAnchorNodeAtCursor(editor);
2732
2736
  updateAnchorDisplayText(anchor, displayText);
2733
2737
  }
@@ -2928,6 +2932,7 @@ exports.default = insertEntity;
2928
2932
  "use strict";
2929
2933
 
2930
2934
  Object.defineProperty(exports, "__esModule", { value: true });
2935
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
2931
2936
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
2932
2937
  function insertImage(editor, imageFile, attributes) {
2933
2938
  if (typeof imageFile == 'string') {
@@ -2943,7 +2948,7 @@ function insertImage(editor, imageFile, attributes) {
2943
2948
  }
2944
2949
  exports.default = insertImage;
2945
2950
  function insertImageWithSrc(editor, src, attributes) {
2946
- editor.addUndoSnapshot(function () {
2951
+ (0, formatUndoSnapshot_1.default)(editor, function () {
2947
2952
  var image = editor.getDocument().createElement('img');
2948
2953
  image.src = src;
2949
2954
  if (attributes) {
@@ -2953,7 +2958,7 @@ function insertImageWithSrc(editor, src, attributes) {
2953
2958
  }
2954
2959
  image.style.maxWidth = '100%';
2955
2960
  editor.insertNode(image);
2956
- }, "Format" /* Format */);
2961
+ }, 'insertImage');
2957
2962
  }
2958
2963
 
2959
2964
 
@@ -2969,6 +2974,7 @@ function insertImageWithSrc(editor, src, attributes) {
2969
2974
  "use strict";
2970
2975
 
2971
2976
  Object.defineProperty(exports, "__esModule", { value: true });
2977
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
2972
2978
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
2973
2979
  /**
2974
2980
  * Remove link at selection. If no links at selection, do nothing.
@@ -2978,10 +2984,10 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
2978
2984
  */
2979
2985
  function removeLink(editor) {
2980
2986
  editor.focus();
2981
- editor.addUndoSnapshot(function (start, end) {
2987
+ (0, formatUndoSnapshot_1.default)(editor, function (start, end) {
2982
2988
  editor.queryElements('a[href]', 1 /* OnSelection */, roosterjs_editor_dom_1.unwrap);
2983
2989
  editor.select(start, end);
2984
- }, "Format" /* Format */);
2990
+ }, 'removeLink');
2985
2991
  }
2986
2992
  exports.default = removeLink;
2987
2993
 
@@ -3045,6 +3051,7 @@ exports.default = replaceWithNode;
3045
3051
  "use strict";
3046
3052
 
3047
3053
  Object.defineProperty(exports, "__esModule", { value: true });
3054
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3048
3055
  /**
3049
3056
  * Rotate an element visually
3050
3057
  * @param editor The editor instance
@@ -3053,9 +3060,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3053
3060
  */
3054
3061
  function rotateElement(editor, element, angle) {
3055
3062
  if (element) {
3056
- editor.addUndoSnapshot(function () {
3063
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3057
3064
  element.style.transform = "rotate(" + angle + "deg)";
3058
- }, "Format" /* Format */);
3065
+ }, 'rotateElement');
3059
3066
  }
3060
3067
  }
3061
3068
  exports.default = rotateElement;
@@ -3075,6 +3082,7 @@ exports.default = rotateElement;
3075
3082
  Object.defineProperty(exports, "__esModule", { value: true });
3076
3083
  var blockFormat_1 = __webpack_require__(/*! ../utils/blockFormat */ "./packages/roosterjs-editor-api/lib/utils/blockFormat.ts");
3077
3084
  var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/roosterjs-editor-api/lib/utils/execCommand.ts");
3085
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3078
3086
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3079
3087
  /**
3080
3088
  * Set content alignment
@@ -3083,7 +3091,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
3083
3091
  * Alignment.Center, Alignment.Left, Alignment.Right
3084
3092
  */
3085
3093
  function setAlignment(editor, alignment) {
3086
- editor.addUndoSnapshot(function () {
3094
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3087
3095
  var selection = editor.getSelectionRangeEx();
3088
3096
  var isATable = selection && selection.type === 1 /* TableSelection */;
3089
3097
  var elementAtCursor = editor.getElementAtCursor();
@@ -3099,7 +3107,7 @@ function setAlignment(editor, alignment) {
3099
3107
  else {
3100
3108
  alignText(editor, alignment);
3101
3109
  }
3102
- }, "Format" /* Format */);
3110
+ }, 'rotateElement');
3103
3111
  }
3104
3112
  exports.default = setAlignment;
3105
3113
  /**
@@ -3154,7 +3162,7 @@ function alignList(editor, alignment) {
3154
3162
  var startNode = blocks[0].getStartNode();
3155
3163
  var vList = (0, roosterjs_editor_dom_1.createVListFromRegion)(region, true /*includeSiblingLists*/, startNode);
3156
3164
  vList.setAlignment(start, end, alignment);
3157
- });
3165
+ }, undefined /* beforeRunCallback */, 'alignList');
3158
3166
  }
3159
3167
 
3160
3168
 
@@ -3185,7 +3193,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
3185
3193
  function setBackgroundColor(editor, color) {
3186
3194
  (0, applyInlineStyle_1.default)(editor, function (element, isInnerNode) {
3187
3195
  (0, roosterjs_editor_dom_1.setColor)(element, isInnerNode ? '' : color, true /*isBackground*/, editor.isDarkMode());
3188
- });
3196
+ }, 'setBackgroundColor');
3189
3197
  }
3190
3198
  exports.default = setBackgroundColor;
3191
3199
 
@@ -3203,6 +3211,7 @@ exports.default = setBackgroundColor;
3203
3211
 
3204
3212
  Object.defineProperty(exports, "__esModule", { value: true });
3205
3213
  var collapseSelectedBlocks_1 = __webpack_require__(/*! ../utils/collapseSelectedBlocks */ "./packages/roosterjs-editor-api/lib/utils/collapseSelectedBlocks.ts");
3214
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3206
3215
  /**
3207
3216
  * Change direction for the blocks/paragraph at selection
3208
3217
  * @param editor The editor instance
@@ -3211,13 +3220,13 @@ var collapseSelectedBlocks_1 = __webpack_require__(/*! ../utils/collapseSelected
3211
3220
  */
3212
3221
  function setDirection(editor, direction) {
3213
3222
  editor.focus();
3214
- editor.addUndoSnapshot(function (start, end) {
3223
+ (0, formatUndoSnapshot_1.default)(editor, function (start, end) {
3215
3224
  (0, collapseSelectedBlocks_1.default)(editor, function (element) {
3216
3225
  element.setAttribute('dir', direction == 0 /* LeftToRight */ ? 'ltr' : 'rtl');
3217
3226
  element.style.textAlign = direction == 0 /* LeftToRight */ ? 'left' : 'right';
3218
3227
  });
3219
3228
  editor.select(start, end);
3220
- }, "Format" /* Format */);
3229
+ }, 'setDirection');
3221
3230
  }
3222
3231
  exports.default = setDirection;
3223
3232
 
@@ -3246,7 +3255,7 @@ function setFontName(editor, fontName) {
3246
3255
  // (http://www.w3schools.com/tags/tag_font.asp).
3247
3256
  (0, applyListItemWrap_1.default)(editor, 'font-family', function (element, isInnerNode) {
3248
3257
  element.style.fontFamily = isInnerNode ? '' : fontName;
3249
- });
3258
+ }, 'setFontName');
3250
3259
  }
3251
3260
  exports.default = setFontName;
3252
3261
 
@@ -3280,7 +3289,7 @@ function setFontSize(editor, fontSize) {
3280
3289
  if (lineHeight != 'normal') {
3281
3290
  element.style.lineHeight = 'normal';
3282
3291
  }
3283
- });
3292
+ }, 'setFontSize');
3284
3293
  }
3285
3294
  exports.default = setFontSize;
3286
3295
 
@@ -3297,6 +3306,7 @@ exports.default = setFontSize;
3297
3306
  "use strict";
3298
3307
 
3299
3308
  Object.defineProperty(exports, "__esModule", { value: true });
3309
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3300
3310
  /**
3301
3311
  * Set image alt text for all selected images at selection. If no images is contained
3302
3312
  * in selection, do nothing.
@@ -3308,11 +3318,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3308
3318
  */
3309
3319
  function setImageAltText(editor, altText) {
3310
3320
  editor.focus();
3311
- editor.addUndoSnapshot(function () {
3321
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3312
3322
  editor.queryElements('img', 1 /* OnSelection */, function (node) {
3313
3323
  return node.setAttribute('alt', altText);
3314
3324
  });
3315
- }, "Format" /* Format */);
3325
+ }, 'setImageAltText');
3316
3326
  }
3317
3327
  exports.default = setImageAltText;
3318
3328
 
@@ -3385,7 +3395,7 @@ function setIndentation(editor, indentation) {
3385
3395
  return false;
3386
3396
  }
3387
3397
  return true;
3388
- });
3398
+ }, 'setIndentation');
3389
3399
  }
3390
3400
  exports.default = setIndentation;
3391
3401
  function indent(region, blocks) {
@@ -3431,6 +3441,7 @@ function shouldHandleWithBlockquotes(indentation, editor, startNode) {
3431
3441
  "use strict";
3432
3442
 
3433
3443
  Object.defineProperty(exports, "__esModule", { value: true });
3444
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3434
3445
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3435
3446
  /**
3436
3447
  * Resets Ordered List Numbering back to the value of the parameter startNumber
@@ -3440,7 +3451,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
3440
3451
  */
3441
3452
  function setOrderedListNumbering(editor, separator, startNumber) {
3442
3453
  if (startNumber === void 0) { startNumber = 1; }
3443
- editor.addUndoSnapshot(function () {
3454
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3444
3455
  editor.focus();
3445
3456
  var regions = editor.getSelectedRegions();
3446
3457
  if (regions[0]) {
@@ -3450,7 +3461,7 @@ function setOrderedListNumbering(editor, separator, startNumber) {
3450
3461
  vList.writeBack();
3451
3462
  }
3452
3463
  }
3453
- }, "Format" /* Format */);
3464
+ }, 'setOrderedListNumbering');
3454
3465
  }
3455
3466
  exports.default = setOrderedListNumbering;
3456
3467
 
@@ -3485,7 +3496,7 @@ function setTextColor(editor, color, shouldApplyInlineStyle) {
3485
3496
  if (!shouldApplyInlineStyle || shouldApplyInlineStyle(element)) {
3486
3497
  (0, roosterjs_editor_dom_1.setColor)(element, isInnerNode ? '' : color, false /*isBackground*/, editor.isDarkMode());
3487
3498
  }
3488
- });
3499
+ }, 'setTextColor');
3489
3500
  }
3490
3501
  exports.default = setTextColor;
3491
3502
 
@@ -3521,7 +3532,7 @@ function toggleBlockQuote(editor, styler) {
3521
3532
  (0, blockWrap_1.default)(editor, function (nodes) {
3522
3533
  var wrapper = (0, roosterjs_editor_dom_1.wrap)(nodes, BLOCKQUOTE_TAG);
3523
3534
  (styler || DEFAULT_STYLER)(wrapper);
3524
- }, function () { return editor.queryElements('blockquote', 1 /* OnSelection */, roosterjs_editor_dom_1.unwrap).length == 0; });
3535
+ }, function () { return editor.queryElements('blockquote', 1 /* OnSelection */, roosterjs_editor_dom_1.unwrap).length == 0; }, 'toggleBlockQuote');
3525
3536
  }
3526
3537
  exports.default = toggleBlockQuote;
3527
3538
 
@@ -3548,7 +3559,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3548
3559
  * @param editor The editor instance
3549
3560
  */
3550
3561
  function toggleBold(editor) {
3551
- (0, execCommand_1.default)(editor, "bold" /* Bold */);
3562
+ (0, execCommand_1.default)(editor, "bold" /* Bold */, 'toggleBold');
3552
3563
  }
3553
3564
  exports.default = toggleBold;
3554
3565
 
@@ -3617,7 +3628,7 @@ function toggleCodeBlock(editor, styler) {
3617
3628
  (0, roosterjs_editor_dom_1.unwrap)(parent_1);
3618
3629
  }
3619
3630
  }).length == 0;
3620
- });
3631
+ }, 'toggleCodeBlock');
3621
3632
  }
3622
3633
  exports.default = toggleCodeBlock;
3623
3634
 
@@ -3634,6 +3645,7 @@ exports.default = toggleCodeBlock;
3634
3645
  "use strict";
3635
3646
 
3636
3647
  Object.defineProperty(exports, "__esModule", { value: true });
3648
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3637
3649
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3638
3650
  /**
3639
3651
  * Toggle header at selection
@@ -3644,7 +3656,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
3644
3656
  */
3645
3657
  function toggleHeader(editor, level) {
3646
3658
  level = Math.min(Math.max(Math.round(level), 0), 6);
3647
- editor.addUndoSnapshot(function () {
3659
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3648
3660
  editor.focus();
3649
3661
  var wrapped = false;
3650
3662
  editor.queryElements('H1,H2,H3,H4,H5,H6', 1 /* OnSelection */, function (header) {
@@ -3671,7 +3683,7 @@ function toggleHeader(editor, level) {
3671
3683
  }
3672
3684
  editor.getDocument().execCommand("formatBlock" /* FormatBlock */, false, "<H" + level + ">");
3673
3685
  }
3674
- }, "Format" /* Format */);
3686
+ }, 'toggleHeader');
3675
3687
  }
3676
3688
  exports.default = toggleHeader;
3677
3689
 
@@ -3698,7 +3710,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3698
3710
  * @param editor The editor instance
3699
3711
  */
3700
3712
  function toggleItalic(editor) {
3701
- (0, execCommand_1.default)(editor, "italic" /* Italic */);
3713
+ (0, execCommand_1.default)(editor, "italic" /* Italic */, 'toggleItalic');
3702
3714
  }
3703
3715
  exports.default = toggleItalic;
3704
3716
 
@@ -3754,7 +3766,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3754
3766
  * @param editor The editor instance
3755
3767
  */
3756
3768
  function toggleStrikethrough(editor) {
3757
- (0, execCommand_1.default)(editor, "strikeThrough" /* StrikeThrough */);
3769
+ (0, execCommand_1.default)(editor, "strikeThrough" /* StrikeThrough */, 'toggleStrikethrough');
3758
3770
  }
3759
3771
  exports.default = toggleStrikethrough;
3760
3772
 
@@ -3783,7 +3795,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3783
3795
  * @param editor The editor instance
3784
3796
  */
3785
3797
  function toggleSubscript(editor) {
3786
- (0, execCommand_1.default)(editor, "subscript" /* Subscript */);
3798
+ (0, execCommand_1.default)(editor, "subscript" /* Subscript */, 'toggleSubscript');
3787
3799
  }
3788
3800
  exports.default = toggleSubscript;
3789
3801
 
@@ -3812,7 +3824,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3812
3824
  * @param editor The editor instance
3813
3825
  */
3814
3826
  function toggleSuperscript(editor) {
3815
- (0, execCommand_1.default)(editor, "superscript" /* Superscript */);
3827
+ (0, execCommand_1.default)(editor, "superscript" /* Superscript */, 'toggleSuperscript');
3816
3828
  }
3817
3829
  exports.default = toggleSuperscript;
3818
3830
 
@@ -3839,7 +3851,7 @@ var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/
3839
3851
  * @param editor The editor instance
3840
3852
  */
3841
3853
  function toggleUnderline(editor) {
3842
- (0, execCommand_1.default)(editor, "underline" /* Underline */);
3854
+ (0, execCommand_1.default)(editor, "underline" /* Underline */, 'toggleUnderline');
3843
3855
  }
3844
3856
  exports.default = toggleUnderline;
3845
3857
 
@@ -3949,6 +3961,7 @@ Object.defineProperty(exports, "experimentCommitListChains", { enumerable: true,
3949
3961
  "use strict";
3950
3962
 
3951
3963
  Object.defineProperty(exports, "__esModule", { value: true });
3964
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3952
3965
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3953
3966
  var TEMP_BACKGROUND_COLOR = 'originalBackgroundColor';
3954
3967
  var CELL_SHADE = 'cellShade';
@@ -3959,7 +3972,7 @@ var CELL_SHADE = 'cellShade';
3959
3972
  **/
3960
3973
  function applyCellShading(editor, color) {
3961
3974
  editor.focus();
3962
- editor.addUndoSnapshot(function () {
3975
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3963
3976
  var regions = editor.getSelectedRegions();
3964
3977
  regions.forEach(function (region) {
3965
3978
  if ((0, roosterjs_editor_dom_1.safeInstanceOf)(region.rootNode, 'HTMLTableCellElement')) {
@@ -3969,7 +3982,7 @@ function applyCellShading(editor, color) {
3969
3982
  region.rootNode.style.backgroundColor;
3970
3983
  }
3971
3984
  });
3972
- });
3985
+ }, 'applyCellShading');
3973
3986
  }
3974
3987
  exports.default = applyCellShading;
3975
3988
 
@@ -3986,6 +3999,7 @@ exports.default = applyCellShading;
3986
3999
  "use strict";
3987
4000
 
3988
4001
  Object.defineProperty(exports, "__esModule", { value: true });
4002
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3989
4003
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3990
4004
  /**
3991
4005
  * Edit table with given operation. If there is no table at cursor then no op.
@@ -3995,7 +4009,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
3995
4009
  function editTable(editor, operation) {
3996
4010
  var td = editor.getElementAtCursor('TD,TH');
3997
4011
  if (td) {
3998
- editor.addUndoSnapshot(function () {
4012
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3999
4013
  var vtable = new roosterjs_editor_dom_1.VTable(td);
4000
4014
  saveTableSelection(editor, vtable);
4001
4015
  vtable.edit(operation);
@@ -4004,7 +4018,7 @@ function editTable(editor, operation) {
4004
4018
  editor.focus();
4005
4019
  var cellToSelect = calculateCellToSelect(operation, vtable.row, vtable.col);
4006
4020
  editor.select(vtable.getCell(cellToSelect.newRow, cellToSelect.newCol).td, 0 /* Begin */);
4007
- }, "Format" /* Format */);
4021
+ }, 'editTable');
4008
4022
  }
4009
4023
  }
4010
4024
  exports.default = editTable;
@@ -4052,6 +4066,7 @@ function saveTableSelection(editor, vtable) {
4052
4066
  "use strict";
4053
4067
 
4054
4068
  Object.defineProperty(exports, "__esModule", { value: true });
4069
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
4055
4070
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4056
4071
  /**
4057
4072
  * Format table
@@ -4062,14 +4077,14 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4062
4077
  function formatTable(editor, format, table) {
4063
4078
  table = table || editor.getElementAtCursor('TABLE');
4064
4079
  if (table) {
4065
- editor.addUndoSnapshot(function (start, end) {
4080
+ (0, formatUndoSnapshot_1.default)(editor, function (start, end) {
4066
4081
  var vtable = new roosterjs_editor_dom_1.VTable(table);
4067
4082
  vtable.applyFormat(format);
4068
4083
  vtable.writeBack();
4069
4084
  editor.transformToDarkColor(vtable.table);
4070
4085
  editor.focus();
4071
4086
  editor.select(start, end);
4072
- }, "Format" /* Format */);
4087
+ }, 'formatTable');
4073
4088
  }
4074
4089
  }
4075
4090
  exports.default = formatTable;
@@ -4087,6 +4102,7 @@ exports.default = formatTable;
4087
4102
  "use strict";
4088
4103
 
4089
4104
  Object.defineProperty(exports, "__esModule", { value: true });
4105
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
4090
4106
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4091
4107
  /**
4092
4108
  * Insert table into editor at current selection
@@ -4115,7 +4131,7 @@ function insertTable(editor, columns, rows, format) {
4115
4131
  }
4116
4132
  }
4117
4133
  editor.focus();
4118
- editor.addUndoSnapshot(function () {
4134
+ (0, formatUndoSnapshot_1.default)(editor, function () {
4119
4135
  var vtable = new roosterjs_editor_dom_1.VTable(table);
4120
4136
  vtable.applyFormat(format);
4121
4137
  vtable.writeBack();
@@ -4123,7 +4139,7 @@ function insertTable(editor, columns, rows, format) {
4123
4139
  editor.runAsync(function (editor) {
4124
4140
  return editor.select(new roosterjs_editor_dom_1.Position(table, 0 /* Begin */).normalize());
4125
4141
  });
4126
- }, "Format" /* Format */);
4142
+ }, 'insertTable');
4127
4143
  }
4128
4144
  exports.default = insertTable;
4129
4145
  function getTableCellWidth(columns) {
@@ -4151,6 +4167,7 @@ function getTableCellWidth(columns) {
4151
4167
  "use strict";
4152
4168
 
4153
4169
  Object.defineProperty(exports, "__esModule", { value: true });
4170
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ./formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
4154
4171
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4155
4172
  var ZERO_WIDTH_SPACE = '\u200B';
4156
4173
  /**
@@ -4159,7 +4176,7 @@ var ZERO_WIDTH_SPACE = '\u200B';
4159
4176
  * @param editor The editor instance
4160
4177
  * @param callback The callback function to apply style
4161
4178
  */
4162
- function applyInlineStyle(editor, callback) {
4179
+ function applyInlineStyle(editor, callback, apiName) {
4163
4180
  editor.focus();
4164
4181
  var selection = editor.getSelectionRangeEx();
4165
4182
  if (selection && selection.areAllCollapsed) {
@@ -4192,7 +4209,7 @@ function applyInlineStyle(editor, callback) {
4192
4209
  else {
4193
4210
  // This is start and end node that get the style. The start and end needs to be recorded so that selection
4194
4211
  // can be re-applied post-applying style
4195
- editor.addUndoSnapshot(function () {
4212
+ (0, formatUndoSnapshot_1.default)(editor, function () {
4196
4213
  var firstNode;
4197
4214
  var lastNode;
4198
4215
  selection.ranges.forEach(function (range) {
@@ -4211,7 +4228,7 @@ function applyInlineStyle(editor, callback) {
4211
4228
  if (firstNode && lastNode && selection.type == 0 /* Normal */) {
4212
4229
  editor.select(firstNode, -2 /* Before */, lastNode, -3 /* After */);
4213
4230
  }
4214
- }, "Format" /* Format */);
4231
+ }, apiName);
4215
4232
  }
4216
4233
  }
4217
4234
  exports.default = applyInlineStyle;
@@ -4238,7 +4255,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4238
4255
  * @param styleName Name of the style to apply to the list item
4239
4256
  * @param formatCallback callback to apply the style to each element
4240
4257
  */
4241
- function applyListItemStyleWrap(editor, styleName, formatCallback) {
4258
+ function applyListItemStyleWrap(editor, styleName, formatCallback, apiName) {
4242
4259
  var parentNodes = [];
4243
4260
  (0, applyInlineStyle_1.default)(editor, function (element, isInnerNode) {
4244
4261
  formatCallback(element, isInnerNode);
@@ -4246,7 +4263,7 @@ function applyListItemStyleWrap(editor, styleName, formatCallback) {
4246
4263
  if (parent && parentNodes.indexOf(parent) === -1) {
4247
4264
  parentNodes.push(parent);
4248
4265
  }
4249
- });
4266
+ }, apiName);
4250
4267
  applyStyleToListItems(parentNodes, [styleName]);
4251
4268
  }
4252
4269
  exports.default = applyListItemStyleWrap;
@@ -4278,14 +4295,15 @@ function applyStyleToListItems(parentNodes, styles) {
4278
4295
 
4279
4296
  Object.defineProperty(exports, "__esModule", { value: true });
4280
4297
  var experimentCommitListChains_1 = __webpack_require__(/*! ../experiment/experimentCommitListChains */ "./packages/roosterjs-editor-api/lib/experiment/experimentCommitListChains.ts");
4298
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ./formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
4281
4299
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4282
4300
  /**
4283
4301
  * Split selection into regions, and perform a block-wise formatting action for each region.
4284
4302
  */
4285
- function blockFormat(editor, callback, beforeRunCallback) {
4303
+ function blockFormat(editor, callback, beforeRunCallback, apiName) {
4286
4304
  editor.focus();
4287
4305
  var selection = editor.getSelectionRangeEx();
4288
- editor.addUndoSnapshot(function (start, end) {
4306
+ (0, formatUndoSnapshot_1.default)(editor, function (start, end) {
4289
4307
  if (!beforeRunCallback || beforeRunCallback()) {
4290
4308
  var regions = editor.getSelectedRegions();
4291
4309
  var chains_1 = roosterjs_editor_dom_1.VListChain.createListChains(regions, start === null || start === void 0 ? void 0 : start.node);
@@ -4298,7 +4316,7 @@ function blockFormat(editor, callback, beforeRunCallback) {
4298
4316
  else if (selection.type == 1 /* TableSelection */) {
4299
4317
  editor.select(selection.table, selection.coordinates);
4300
4318
  }
4301
- }, "Format" /* Format */);
4319
+ }, apiName);
4302
4320
  }
4303
4321
  exports.default = blockFormat;
4304
4322
 
@@ -4326,7 +4344,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4326
4344
  * @param beforeRunCallback A callback function to run before looping all regions. If it returns false,
4327
4345
  * the loop for regions will be skipped
4328
4346
  */
4329
- function blockWrap(editor, wrapFunction, beforeRunCallback) {
4347
+ function blockWrap(editor, wrapFunction, beforeRunCallback, apiName) {
4330
4348
  (0, blockFormat_1.default)(editor, function (region) {
4331
4349
  var blocks = (0, roosterjs_editor_dom_1.getSelectedBlockElementsInRegion)(region, true /*createBlockIfEmpty*/);
4332
4350
  var nodes = (0, roosterjs_editor_dom_1.collapseNodesInRegion)(region, blocks);
@@ -4347,7 +4365,7 @@ function blockWrap(editor, wrapFunction, beforeRunCallback) {
4347
4365
  }
4348
4366
  wrapFunction(nodes);
4349
4367
  }
4350
- }, beforeRunCallback);
4368
+ }, beforeRunCallback, apiName);
4351
4369
  }
4352
4370
  exports.default = blockWrap;
4353
4371
 
@@ -4407,6 +4425,7 @@ function isEmptyBlockUnderTR(block) {
4407
4425
  "use strict";
4408
4426
 
4409
4427
  Object.defineProperty(exports, "__esModule", { value: true });
4428
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ./formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
4410
4429
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4411
4430
  /**
4412
4431
  * @internal
@@ -4418,7 +4437,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4418
4437
  * @param doWorkaroundForList Optional, set to true to do workaround for list in order to keep current format.
4419
4438
  * Default value is false.
4420
4439
  */
4421
- function execCommand(editor, command) {
4440
+ function execCommand(editor, command, apiName) {
4422
4441
  editor.focus();
4423
4442
  var formatter = function () { return editor.getDocument().execCommand(command, false, null); };
4424
4443
  var selection = editor.getSelectionRangeEx();
@@ -4435,7 +4454,7 @@ function execCommand(editor, command) {
4435
4454
  }
4436
4455
  }
4437
4456
  else {
4438
- editor.addUndoSnapshot(function () {
4457
+ (0, formatUndoSnapshot_1.default)(editor, function () {
4439
4458
  var tempRange;
4440
4459
  selection.ranges.forEach(function (range) {
4441
4460
  if (selection.type == 1 /* TableSelection */) {
@@ -4447,12 +4466,40 @@ function execCommand(editor, command) {
4447
4466
  if (tempRange && selection.type == 1 /* TableSelection */) {
4448
4467
  editor.select(selection.table, selection.coordinates);
4449
4468
  }
4450
- }, "Format" /* Format */);
4469
+ }, apiName);
4451
4470
  }
4452
4471
  }
4453
4472
  exports.default = execCommand;
4454
4473
 
4455
4474
 
4475
+ /***/ }),
4476
+
4477
+ /***/ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts":
4478
+ /*!***********************************************************************!*\
4479
+ !*** ./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts ***!
4480
+ \***********************************************************************/
4481
+ /*! no static exports found */
4482
+ /***/ (function(module, exports, __webpack_require__) {
4483
+
4484
+ "use strict";
4485
+
4486
+ Object.defineProperty(exports, "__esModule", { value: true });
4487
+ /**
4488
+ * @internal
4489
+ * Execute add undo snapshot for the Format APIs
4490
+ * @param editor The editor instance
4491
+ * @param command Optional, The callback function to perform formatting, returns a data object which will be used as the data field in ContentChangedEvent if changeSource is not null.
4492
+ * @param apiName Optional, name of the API that was is going to be executed.
4493
+ * Default value is false.
4494
+ */
4495
+ function formatUndoSnapshot(editor, callback, apiName) {
4496
+ editor.addUndoSnapshot(callback, "Format" /* Format */, undefined /* canUndoByBackspace */, apiName && {
4497
+ formatApiName: apiName,
4498
+ });
4499
+ }
4500
+ exports.default = formatUndoSnapshot;
4501
+
4502
+
4456
4503
  /***/ }),
4457
4504
 
4458
4505
  /***/ "./packages/roosterjs-editor-api/lib/utils/toggleListType.ts":
@@ -4501,7 +4548,7 @@ function toggleListType(editor, listType, startNumber, includeSiblingLists, orde
4501
4548
  }
4502
4549
  vList.writeBack();
4503
4550
  }
4504
- });
4551
+ }, undefined /* beforeRunCallback */, 'toggleListType');
4505
4552
  }
4506
4553
  exports.default = toggleListType;
4507
4554
 
@@ -4539,8 +4586,10 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4539
4586
  * @param callback The editing callback, accepting current selection start and end position, returns an optional object used as the data field of ContentChangedEvent.
4540
4587
  * @param changeSource The ChangeSource string of ContentChangedEvent. @default ChangeSource.Format. Set to null to avoid triggering ContentChangedEvent
4541
4588
  * @param canUndoByBackspace True if this action can be undone when user press Backspace key (aka Auto Complete).
4589
+ * @param formatApiName Optional parameter to provide the ContentChangeEvent which FormatApi was invoked.
4542
4590
  */
4543
- var addUndoSnapshot = function (core, callback, changeSource, canUndoByBackspace) {
4591
+ var addUndoSnapshot = function (core, callback, changeSource, canUndoByBackspace, additionalData) {
4592
+ if (additionalData === void 0) { additionalData = undefined; }
4544
4593
  var undoState = core.undo;
4545
4594
  var isNested = undoState.isNested;
4546
4595
  var data;
@@ -4567,6 +4616,7 @@ var addUndoSnapshot = function (core, callback, changeSource, canUndoByBackspace
4567
4616
  eventType: 7 /* ContentChanged */,
4568
4617
  source: changeSource,
4569
4618
  data: data,
4619
+ additionalData: additionalData,
4570
4620
  };
4571
4621
  core.api.triggerEvent(core, event_1, true /*broadcast*/);
4572
4622
  }
@@ -6194,7 +6244,7 @@ var CopyPastePlugin = /** @class */ (function () {
6194
6244
  function CopyPastePlugin(options) {
6195
6245
  var _this = this;
6196
6246
  this.onPaste = function (event) {
6197
- var _a;
6247
+ var _a, _b;
6198
6248
  var range;
6199
6249
  (0, roosterjs_editor_dom_1.extractClipboardEvent)(event, function (clipboardData) { var _a; return (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.paste(clipboardData); }, {
6200
6250
  allowLinkPreview: (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.isFeatureEnabled("PasteWithLinkPreview" /* PasteWithLinkPreview */),
@@ -6207,7 +6257,7 @@ var CopyPastePlugin = /** @class */ (function () {
6207
6257
  removeTempDiv: function (div) {
6208
6258
  _this.cleanUpAndRestoreSelection(div, range, false /* isCopy */);
6209
6259
  },
6210
- });
6260
+ }, (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getSelectionRange());
6211
6261
  };
6212
6262
  this.state = {
6213
6263
  allowedCustomPasteType: options.allowedCustomPasteType || [],
@@ -8967,12 +9017,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
8967
9017
  var extractClipboardItems_1 = __webpack_require__(/*! ./extractClipboardItems */ "./packages/roosterjs-editor-dom/lib/clipboard/extractClipboardItems.ts");
8968
9018
  var extractClipboardItemsForIE_1 = __webpack_require__(/*! ./extractClipboardItemsForIE */ "./packages/roosterjs-editor-dom/lib/clipboard/extractClipboardItemsForIE.ts");
8969
9019
  var toArray_1 = __webpack_require__(/*! ../jsUtils/toArray */ "./packages/roosterjs-editor-dom/lib/jsUtils/toArray.ts");
9020
+ var Browser_1 = __webpack_require__(/*! ../utils/Browser */ "./packages/roosterjs-editor-dom/lib/utils/Browser.ts");
8970
9021
  /**
8971
9022
  * @deprecated Use extractClipboardItems and extractClipboardItemsForIE instead
8972
9023
  * Extract a Clipboard event
8973
9024
  * @param event The paste event
8974
9025
  * @param callback Callback function when data is ready
8975
9026
  * @param options Options to retrieve more items from the event, including HTML string and other customized items
9027
+ * @param rangeBeforePaste Optional range to be removed when pasting in Android
8976
9028
  * @returns An object with the following properties:
8977
9029
  * types: Available types from the clipboard event
8978
9030
  * text: Plain text from the clipboard event
@@ -8981,19 +9033,27 @@ var toArray_1 = __webpack_require__(/*! ../jsUtils/toArray */ "./packages/rooste
8981
9033
  * When set to undefined, it means can't retrieve HTML string, there may be HTML string but direct retrieving is
8982
9034
  * not supported by browser.
8983
9035
  */
8984
- function extractClipboardEvent(event, callback, options) {
9036
+ function extractClipboardEvent(event, callback, options, rangeBeforePaste) {
8985
9037
  var _a;
8986
9038
  var dataTransfer = event.clipboardData ||
8987
9039
  ((_a = event.target.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView).clipboardData;
8988
9040
  if (dataTransfer.items) {
8989
9041
  event.preventDefault();
8990
- (0, extractClipboardItems_1.default)((0, toArray_1.default)(dataTransfer.items), options).then(callback);
9042
+ (0, extractClipboardItems_1.default)((0, toArray_1.default)(dataTransfer.items), options).then(function (clipboardData) {
9043
+ removeContents(rangeBeforePaste);
9044
+ callback(clipboardData);
9045
+ });
8991
9046
  }
8992
9047
  else {
8993
9048
  (0, extractClipboardItemsForIE_1.default)(dataTransfer, callback, options);
8994
9049
  }
8995
9050
  }
8996
9051
  exports.default = extractClipboardEvent;
9052
+ function removeContents(range) {
9053
+ if (Browser_1.Browser.isAndroid && range) {
9054
+ range.deleteContents();
9055
+ }
9056
+ }
8997
9057
 
8998
9058
 
8999
9059
  /***/ }),
@@ -9952,12 +10012,14 @@ var unwrap_1 = __webpack_require__(/*! ../utils/unwrap */ "./packages/roosterjs-
9952
10012
  var VTable_1 = __webpack_require__(/*! ../table/VTable */ "./packages/roosterjs-editor-dom/lib/table/VTable.ts");
9953
10013
  var wrap_1 = __webpack_require__(/*! ../utils/wrap */ "./packages/roosterjs-editor-dom/lib/utils/wrap.ts");
9954
10014
  var splitParentNode_1 = __webpack_require__(/*! ../utils/splitParentNode */ "./packages/roosterjs-editor-dom/lib/utils/splitParentNode.ts");
10015
+ var NOT_EDITABLE_SELECTOR = '[contenteditable=false]';
9955
10016
  var adjustSteps = [
9956
10017
  adjustInsertPositionForHyperLink,
9957
10018
  adjustInsertPositionForStructuredNode,
9958
10019
  adjustInsertPositionForParagraph,
9959
10020
  adjustInsertPositionForVoidElement,
9960
10021
  adjustInsertPositionForMoveCursorOutOfALink,
10022
+ adjustInsertPositionForNotEditableNode,
9961
10023
  ];
9962
10024
  /**
9963
10025
  * Adjust position for A tag don't be nested inside another A tag.
@@ -10097,6 +10159,26 @@ function adjustInsertPositionForMoveCursorOutOfALink(root, nodeToInsert, positio
10097
10159
  }
10098
10160
  return position;
10099
10161
  }
10162
+ /**
10163
+ * Adjust the position cursor out of a not contenteditable element.
10164
+ */
10165
+ function adjustInsertPositionForNotEditableNode(root, nodeToInsert, position, range) {
10166
+ if (!position.element.isContentEditable) {
10167
+ var nonEditableElement = void 0;
10168
+ var lastNonEditableElement = (0, findClosestElementAncestor_1.default)(position.node, root, NOT_EDITABLE_SELECTOR);
10169
+ while (lastNonEditableElement) {
10170
+ nonEditableElement = lastNonEditableElement;
10171
+ lastNonEditableElement = (nonEditableElement === null || nonEditableElement === void 0 ? void 0 : nonEditableElement.parentElement)
10172
+ ? (0, findClosestElementAncestor_1.default)(nonEditableElement.parentElement, root, NOT_EDITABLE_SELECTOR)
10173
+ : null;
10174
+ }
10175
+ if (nonEditableElement) {
10176
+ position = new Position_1.default(nonEditableElement, -3 /* After */);
10177
+ return adjustInsertPositionForNotEditableNode(root, nodeToInsert, position, range);
10178
+ }
10179
+ }
10180
+ return position;
10181
+ }
10100
10182
  /**
10101
10183
  *
10102
10184
  * @param root the contentDiv of the ditor
@@ -17609,10 +17691,9 @@ exports.getTargetWindow = void 0;
17609
17691
  /**
17610
17692
  * @internal Export for test only
17611
17693
  * Try get window from the given node or range
17612
- * @param source Source node or range
17694
+ * @param node Source node to get window from
17613
17695
  */
17614
- function getTargetWindow(source) {
17615
- var node = source && (source.commonAncestorContainer || source);
17696
+ function getTargetWindow(node) {
17616
17697
  var document = node &&
17617
17698
  (node.ownerDocument ||
17618
17699
  (Object.prototype.toString.apply(node) == '[object HTMLDocument]'
@@ -17629,6 +17710,11 @@ exports.getTargetWindow = getTargetWindow;
17629
17710
  * @param typeName Target type name
17630
17711
  */
17631
17712
  function safeInstanceOf(obj, typeName) {
17713
+ var _a;
17714
+ if (typeName == 'Range') {
17715
+ return (Object.prototype.toString.apply(obj) == '[object Range]' &&
17716
+ !!((_a = obj) === null || _a === void 0 ? void 0 : _a.commonAncestorContainer));
17717
+ }
17632
17718
  var targetWindow = getTargetWindow(obj);
17633
17719
  var targetType = targetWindow && targetWindow[typeName];
17634
17720
  var mainWindow = window;
@@ -21128,14 +21214,13 @@ var ImageEdit = /** @class */ (function () {
21128
21214
  // When there is image in editing, clean up any cached objects and elements
21129
21215
  this.clearDndHelpers();
21130
21216
  // Apply the changes, and add undo snapshot if necessary
21131
- if ((0, applyChange_1.default)(this.editor, this.image, this.editInfo, this.lastSrc, this.wasResized)) {
21132
- this.editor.addUndoSnapshot(function () { return _this.image; }, "ImageResize" /* ImageResize */);
21133
- }
21217
+ (0, applyChange_1.default)(this.editor, this.image, this.editInfo, this.lastSrc, this.wasResized);
21134
21218
  // Remove editing wrapper
21135
21219
  var wrapper = this.getImageWrapper(this.image);
21136
21220
  if (wrapper) {
21137
21221
  this.removeWrapper(wrapper);
21138
21222
  }
21223
+ this.editor.addUndoSnapshot(function () { return _this.image; }, "ImageResize" /* ImageResize */);
21139
21224
  if (selectImage) {
21140
21225
  this.editor.select(this.image);
21141
21226
  }
@@ -21498,7 +21583,6 @@ var editInfo_1 = __webpack_require__(/*! ./editInfo */ "./packages/roosterjs-edi
21498
21583
  * @param image The image to apply the change
21499
21584
  * @param editInfo Edit info that contains the changed information of the image
21500
21585
  * @param previousSrc Last src value of the image before the change was made
21501
- * @returns True if the image is changed, otherwise false
21502
21586
  */
21503
21587
  function applyChange(editor, image, editInfo, previousSrc, wasResized) {
21504
21588
  var newSrc = '';
@@ -21545,9 +21629,6 @@ function applyChange(editor, image, editInfo, previousSrc, wasResized) {
21545
21629
  var _a = (0, getGeneratedImageSize_1.default)(editInfo), targetWidth = _a.targetWidth, targetHeight = _a.targetHeight;
21546
21630
  image.src = newSrc;
21547
21631
  setImageSize(image, wasResized, targetWidth, targetHeight);
21548
- return (srcChanged ||
21549
- editInfo.widthPx != initEditInfo.widthPx ||
21550
- editInfo.heightPx != initEditInfo.heightPx);
21551
21632
  }
21552
21633
  exports.default = applyChange;
21553
21634
  /**
@@ -23345,7 +23426,9 @@ function getAndSetNodeId(wordCustomData, element) {
23345
23426
 
23346
23427
  Object.defineProperty(exports, "__esModule", { value: true });
23347
23428
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
23429
+ var MSO_COMMENT_PARENT = 'mso-comment-parent';
23348
23430
  var MSO_COMMENT_REFERENCE = 'mso-comment-reference';
23431
+ var MSO_COMMENT_DATE = 'mso-comment-date';
23349
23432
  var MSO_COMMENT_ANCHOR_HREF_REGEX = /#_msocom_/;
23350
23433
  var MSO_SPECIAL_CHARACTER = 'mso-special-character';
23351
23434
  var MSO_SPECIAL_CHARACTER_COMMENT = 'comment';
@@ -23356,7 +23439,7 @@ var MSO_ELEMENT_COMMENT_LIST = 'comment-list';
23356
23439
  * @internal
23357
23440
  * Removes comments when pasting Word content.
23358
23441
  */
23359
- function commentsRemoval(elementCallbacks) {
23442
+ function commentsRemoval(elementCallbacks, styleCallbacks) {
23360
23443
  // 1st Step, Remove SPAN elements added after each comment.
23361
23444
  // Word adds multiple elements for comments as SPAN elements.
23362
23445
  // In this step we remove these elements:
@@ -23388,11 +23471,7 @@ function commentsRemoval(elementCallbacks) {
23388
23471
  // In this step we remove this Anchor elements.
23389
23472
  (0, roosterjs_editor_dom_1.chainSanitizerCallback)(elementCallbacks, 'A', function (element) {
23390
23473
  var _a;
23391
- var styles = (0, roosterjs_editor_dom_1.getStyles)(element);
23392
- if (!!styles[MSO_COMMENT_REFERENCE]) {
23393
- (0, roosterjs_editor_dom_1.changeElementTag)(element, 'span');
23394
- }
23395
- else if ((0, roosterjs_editor_dom_1.safeInstanceOf)(element, 'HTMLAnchorElement') &&
23474
+ if ((0, roosterjs_editor_dom_1.safeInstanceOf)(element, 'HTMLAnchorElement') &&
23396
23475
  MSO_COMMENT_ANCHOR_HREF_REGEX.test(element.href)) {
23397
23476
  (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(element);
23398
23477
  }
@@ -23417,6 +23496,13 @@ function commentsRemoval(elementCallbacks) {
23417
23496
  }
23418
23497
  return true;
23419
23498
  });
23499
+ /**
23500
+ * Remove styles related to Office Comments that can cause unwanted behaviors
23501
+ * depending on the user client
23502
+ */
23503
+ (0, roosterjs_editor_dom_1.chainSanitizerCallback)(styleCallbacks, MSO_COMMENT_REFERENCE, function () { return false; });
23504
+ (0, roosterjs_editor_dom_1.chainSanitizerCallback)(styleCallbacks, MSO_COMMENT_DATE, function () { return false; });
23505
+ (0, roosterjs_editor_dom_1.chainSanitizerCallback)(styleCallbacks, MSO_COMMENT_PARENT, function () { return false; });
23420
23506
  }
23421
23507
  exports.default = commentsRemoval;
23422
23508
 
@@ -23483,7 +23569,7 @@ function convertPastedContentFromWord(event) {
23483
23569
  }
23484
23570
  return true;
23485
23571
  });
23486
- (0, commentsRemoval_1.default)(sanitizingOption.elementCallbacks);
23572
+ (0, commentsRemoval_1.default)(sanitizingOption.elementCallbacks, sanitizingOption.cssStyleCallbacks);
23487
23573
  }
23488
23574
  exports.default = convertPastedContentFromWord;
23489
23575
 
@@ -24034,8 +24120,6 @@ var UNIDENTIFIED_CODE = [0, 229];
24034
24120
  * - Apply selected item in picker
24035
24121
  *
24036
24122
  * PickerPlugin doesn't provide any UI, it just wraps related DOM events and invoke callback functions.
24037
- * To show a picker UI, you need to build your own UI component. Please reference to
24038
- * https://github.com/microsoft/roosterjs/tree/master/demo/scripts/controls/samplepicker
24039
24123
  */
24040
24124
  var PickerPlugin = /** @class */ (function () {
24041
24125
  function PickerPlugin(dataProvider, pickerOptions) {
@@ -25335,7 +25419,7 @@ var TableResize = /** @class */ (function () {
25335
25419
  break;
25336
25420
  }
25337
25421
  }
25338
- _this.setTableEditor(currentTable);
25422
+ _this.setTableEditor(currentTable, e);
25339
25423
  (_a = _this.tableEditor) === null || _a === void 0 ? void 0 : _a.onMouseMove(x, y);
25340
25424
  };
25341
25425
  this.invalidateTableRects = function () {
@@ -25380,13 +25464,13 @@ var TableResize = /** @class */ (function () {
25380
25464
  break;
25381
25465
  }
25382
25466
  };
25383
- TableResize.prototype.setTableEditor = function (table) {
25467
+ TableResize.prototype.setTableEditor = function (table, e) {
25384
25468
  if (this.tableEditor && table != this.tableEditor.table) {
25385
25469
  this.tableEditor.dispose();
25386
25470
  this.tableEditor = null;
25387
25471
  }
25388
25472
  if (!this.tableEditor && table) {
25389
- this.tableEditor = new TableEditor_1.default(this.editor, table, this.invalidateTableRects, this.onShowHelperElement);
25473
+ this.tableEditor = new TableEditor_1.default(this.editor, table, this.invalidateTableRects, this.onShowHelperElement, e.currentTarget);
25390
25474
  }
25391
25475
  };
25392
25476
  TableResize.prototype.ensureTableRects = function () {
@@ -25630,7 +25714,7 @@ var INSERTER_HOVER_OFFSET = 5;
25630
25714
  * When set a different current table or change current TD, we need to update these areas
25631
25715
  */
25632
25716
  var TableEditor = /** @class */ (function () {
25633
- function TableEditor(editor, table, onChanged, onShowHelperElement) {
25717
+ function TableEditor(editor, table, onChanged, onShowHelperElement, eventTarget) {
25634
25718
  var _this = this;
25635
25719
  this.editor = editor;
25636
25720
  this.table = table;
@@ -25659,29 +25743,31 @@ var TableEditor = /** @class */ (function () {
25659
25743
  _this.editor.focus();
25660
25744
  if (table) {
25661
25745
  var vTable = new roosterjs_editor_dom_1.VTable(table);
25662
- var rows = vTable.cells.length - 1;
25663
- var lastCellIndex_1 = 0;
25664
- vTable.cells[rows].forEach(function (cell, index) {
25665
- if (cell.td) {
25666
- lastCellIndex_1 = index;
25667
- }
25668
- });
25669
- var selection = {
25670
- firstCell: {
25671
- x: 0,
25672
- y: 0,
25673
- },
25674
- lastCell: {
25675
- y: rows,
25676
- x: lastCellIndex_1,
25677
- },
25678
- };
25679
- _this.editor.select(table, selection);
25746
+ if (vTable.cells) {
25747
+ var rows = vTable.cells.length - 1;
25748
+ var lastCellIndex_1 = 0;
25749
+ vTable.cells[rows].forEach(function (cell, index) {
25750
+ if (cell.td) {
25751
+ lastCellIndex_1 = index;
25752
+ }
25753
+ });
25754
+ var selection = {
25755
+ firstCell: {
25756
+ x: 0,
25757
+ y: 0,
25758
+ },
25759
+ lastCell: {
25760
+ y: rows,
25761
+ x: lastCellIndex_1,
25762
+ },
25763
+ };
25764
+ _this.editor.select(table, selection);
25765
+ }
25680
25766
  }
25681
25767
  };
25682
25768
  this.isRTL = (0, roosterjs_editor_dom_1.getComputedStyle)(table, 'direction') == 'rtl';
25683
25769
  this.tableResizer = (0, TableResizer_1.default)(table, editor.getZoomScale(), this.isRTL, this.onStartTableResize, this.onFinishEditing, this.onShowHelperElement);
25684
- this.tableSelector = (0, TableSelector_1.default)(table, editor.getZoomScale(), this.onSelect, this.onShowHelperElement);
25770
+ this.tableSelector = (0, TableSelector_1.default)(table, editor.getZoomScale(), this.onSelect, this.onShowHelperElement, this.getShouldShowTableSelectorHandler(this.editor.getScrollContainer(), eventTarget));
25685
25771
  }
25686
25772
  TableEditor.prototype.dispose = function () {
25687
25773
  this.disposeTableResizer();
@@ -25793,6 +25879,21 @@ var TableEditor = /** @class */ (function () {
25793
25879
  }
25794
25880
  this.editor.addUndoSnapshot();
25795
25881
  };
25882
+ TableEditor.prototype.getShouldShowTableSelectorHandler = function (scrollContainer, eventTarget) {
25883
+ if (eventTarget && (0, roosterjs_editor_dom_1.safeInstanceOf)(eventTarget, 'HTMLElement') && scrollContainer) {
25884
+ var scrollContainerRect_1 = (0, roosterjs_editor_dom_1.normalizeRect)(scrollContainer.getBoundingClientRect());
25885
+ var containerRect_1 = (0, roosterjs_editor_dom_1.normalizeRect)(eventTarget.getBoundingClientRect());
25886
+ if (scrollContainerRect_1 && containerRect_1) {
25887
+ var scrollContainerVisibleTop_1 = scrollContainer.scrollTop - scrollContainerRect_1.top;
25888
+ return function (rect) {
25889
+ return containerRect_1.top <= rect.top &&
25890
+ scrollContainerVisibleTop_1 <= rect.top &&
25891
+ scrollContainerRect_1.top <= rect.top;
25892
+ };
25893
+ }
25894
+ }
25895
+ return function () { return true; };
25896
+ };
25796
25897
  return TableEditor;
25797
25898
  }());
25798
25899
  exports.default = TableEditor;
@@ -25815,10 +25916,10 @@ exports.disposeTableEditFeature = void 0;
25815
25916
  * @internal
25816
25917
  */
25817
25918
  function disposeTableEditFeature(resizer) {
25818
- var _a;
25819
- (_a = resizer.div.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(resizer.div);
25919
+ var _a, _b, _c;
25920
+ (_b = (_a = resizer.div) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(resizer.div);
25820
25921
  resizer.div = null;
25821
- resizer.featureHandler.dispose();
25922
+ (_c = resizer.featureHandler) === null || _c === void 0 ? void 0 : _c.dispose();
25822
25923
  resizer.featureHandler = null;
25823
25924
  }
25824
25925
  exports.disposeTableEditFeature = disposeTableEditFeature;
@@ -26052,7 +26153,11 @@ var TABLE_SELECTOR_ID = '_Table_Selector';
26052
26153
  /**
26053
26154
  * @internal
26054
26155
  */
26055
- function createTableSelector(table, zoomScale, onFinishDragging, onShowHelperElement) {
26156
+ function createTableSelector(table, zoomScale, onFinishDragging, onShowHelperElement, shouldShow) {
26157
+ var rect = (0, roosterjs_editor_dom_1.normalizeRect)(table.getBoundingClientRect());
26158
+ if (rect && shouldShow && !shouldShow(rect)) {
26159
+ return { div: null, featureHandler: null, node: table };
26160
+ }
26056
26161
  var document = table.ownerDocument;
26057
26162
  var createElementData = {
26058
26163
  tag: 'div',
@@ -26067,6 +26172,7 @@ function createTableSelector(table, zoomScale, onFinishDragging, onShowHelperEle
26067
26172
  var context = {
26068
26173
  table: table,
26069
26174
  zoomScale: zoomScale,
26175
+ rect: rect,
26070
26176
  };
26071
26177
  setSelectorDivPosition(context, div);
26072
26178
  var onDragEnd = function (context, event) {
@@ -26082,8 +26188,7 @@ function createTableSelector(table, zoomScale, onFinishDragging, onShowHelperEle
26082
26188
  }
26083
26189
  exports.default = createTableSelector;
26084
26190
  function setSelectorDivPosition(context, trigger) {
26085
- var table = context.table;
26086
- var rect = (0, roosterjs_editor_dom_1.normalizeRect)(table.getBoundingClientRect());
26191
+ var rect = context.rect;
26087
26192
  if (rect) {
26088
26193
  trigger.style.top = rect.top - TABLE_SELECTOR_LENGTH + "px";
26089
26194
  trigger.style.left = rect.left - TABLE_SELECTOR_LENGTH - 2 + "px";