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