prosemirror-view 1.31.3 → 1.31.5

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/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 1.31.5 (2023-06-19)
2
+
3
+ ### Bug fixes
4
+
5
+ Fix a bug where the editor accidentally blocked shift-delete when the whole document is selected.
6
+
7
+ Bring back workaround for an issue where Firefox draws the cursor in the wrong place in a code block.
8
+
9
+ Fix an issue where Shift-Insert pastes pasted plain text (because Shift was being held).
10
+
11
+ Fix an issue where selecting across paragraph and starting a composition would update the state as if Enter was pressed and disrupt the composition.
12
+
13
+ ## 1.31.4 (2023-05-31)
14
+
15
+ ### Bug fixes
16
+
17
+ Make sure `destroy` is called on node views that are replaced by changing a node's markup.
18
+
1
19
  ## 1.31.3 (2023-05-17)
2
20
 
3
21
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -1134,6 +1134,21 @@ var ViewDesc = function () {
1134
1134
 
1135
1135
  if (node.nodeType == 3) {
1136
1136
  brKludge = !!(_offset && node.nodeValue[_offset - 1] == "\n");
1137
+
1138
+ if (brKludge && _offset == node.nodeValue.length) {
1139
+ for (var scan = node, after; scan; scan = scan.parentNode) {
1140
+ if (after = scan.nextSibling) {
1141
+ if (after.nodeName == "BR") anchorDOM = headDOM = {
1142
+ node: after.parentNode,
1143
+ offset: domIndex(after) + 1
1144
+ };
1145
+ break;
1146
+ }
1147
+
1148
+ var desc = scan.pmViewDesc;
1149
+ if (desc && desc.node && desc.node.isBlock) break;
1150
+ }
1151
+ }
1137
1152
  } else {
1138
1153
  var prev = node.childNodes[_offset - 1];
1139
1154
  brKludge = prev && (prev.nodeName == "BR" || prev.contentEditable == "false");
@@ -1141,8 +1156,8 @@ var ViewDesc = function () {
1141
1156
  }
1142
1157
 
1143
1158
  if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {
1144
- var after = domSel.focusNode.childNodes[domSel.focusOffset];
1145
- if (after && after.contentEditable == "false") force = true;
1159
+ var _after2 = domSel.focusNode.childNodes[domSel.focusOffset];
1160
+ if (_after2 && _after2.contentEditable == "false") force = true;
1146
1161
  }
1147
1162
 
1148
1163
  if (!(force || brKludge && safari) && isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) && isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset)) return;
@@ -2197,6 +2212,7 @@ var ViewTreeUpdater = function () {
2197
2212
  if (!wrapper.contentDOM) return null;
2198
2213
  wrapper.children = next.children;
2199
2214
  next.children = [];
2215
+ next.destroy();
2200
2216
 
2201
2217
  var _iterator = _createForOfIteratorHelper(wrapper.children),
2202
2218
  _step;
@@ -2990,7 +3006,7 @@ function captureKeyDown(view, event) {
2990
3006
 
2991
3007
  if (code == 8 || mac && code == 72 && mods == "c") {
2992
3008
  return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);
2993
- } else if (code == 46 || mac && code == 68 && mods == "c") {
3009
+ } else if (code == 46 && !event.shiftKey || mac && code == 68 && mods == "c") {
2994
3010
  return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);
2995
3011
  } else if (code == 13 || code == 27) {
2996
3012
  return true;
@@ -3894,10 +3910,11 @@ function capturePaste(view, event) {
3894
3910
  if (!plainText) target.contentEditable = "true";
3895
3911
  target.style.cssText = "position: fixed; left: -10000px; top: 10px";
3896
3912
  target.focus();
3913
+ var plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3897
3914
  setTimeout(function () {
3898
3915
  view.focus();
3899
3916
  if (target.parentNode) target.parentNode.removeChild(target);
3900
- if (plainText) doPaste(view, target.value, null, view.input.shiftKey, event);else doPaste(view, target.textContent, target.innerHTML, view.input.shiftKey, event);
3917
+ if (plainText) doPaste(view, target.value, null, plain, event);else doPaste(view, target.textContent, target.innerHTML, plain, event);
3901
3918
  }, 50);
3902
3919
  }
3903
3920
 
@@ -3908,7 +3925,7 @@ function doPaste(view, text, html, preferPlain, event) {
3908
3925
  })) return true;
3909
3926
  if (!slice) return false;
3910
3927
  var singleNode = sliceSingleNode(slice);
3911
- var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, view.input.shiftKey) : view.state.tr.replaceSelection(slice);
3928
+ var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, preferPlain) : view.state.tr.replaceSelection(slice);
3912
3929
  view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"));
3913
3930
  return true;
3914
3931
  }
@@ -3917,7 +3934,8 @@ editHandlers.paste = function (view, _event) {
3917
3934
  var event = _event;
3918
3935
  if (view.composing && !android) return;
3919
3936
  var data = brokenClipboardAPI ? null : event.clipboardData;
3920
- if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), view.input.shiftKey, event)) event.preventDefault();else capturePaste(view, event);
3937
+ var plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3938
+ if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event)) event.preventDefault();else capturePaste(view, event);
3921
3939
  };
3922
3940
 
3923
3941
  var Dragging = _createClass(function Dragging(slice, move) {
@@ -5371,7 +5389,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5371
5389
 
5372
5390
  if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some(function (n) {
5373
5391
  return n.nodeName == "DIV" || n.nodeName == "P";
5374
- })) || !inlineChange && $from.pos < parse.doc.content.size && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
5392
+ })) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
5375
5393
  return f(view, keyEvent(13, "Enter"));
5376
5394
  })) {
5377
5395
  view.input.lastIOSEnter = 0;
package/dist/index.js CHANGED
@@ -957,6 +957,19 @@ class ViewDesc {
957
957
  let { node, offset } = anchorDOM;
958
958
  if (node.nodeType == 3) {
959
959
  brKludge = !!(offset && node.nodeValue[offset - 1] == "\n");
960
+ // Issue #1128
961
+ if (brKludge && offset == node.nodeValue.length) {
962
+ for (let scan = node, after; scan; scan = scan.parentNode) {
963
+ if (after = scan.nextSibling) {
964
+ if (after.nodeName == "BR")
965
+ anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };
966
+ break;
967
+ }
968
+ let desc = scan.pmViewDesc;
969
+ if (desc && desc.node && desc.node.isBlock)
970
+ break;
971
+ }
972
+ }
960
973
  }
961
974
  else {
962
975
  let prev = node.childNodes[offset - 1];
@@ -1818,6 +1831,7 @@ class ViewTreeUpdater {
1818
1831
  return null;
1819
1832
  wrapper.children = next.children;
1820
1833
  next.children = [];
1834
+ next.destroy();
1821
1835
  for (let ch of wrapper.children)
1822
1836
  ch.parent = wrapper;
1823
1837
  return wrapper;
@@ -2585,7 +2599,7 @@ function captureKeyDown(view, event) {
2585
2599
  if (code == 8 || (mac && code == 72 && mods == "c")) { // Backspace, Ctrl-h on Mac
2586
2600
  return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);
2587
2601
  }
2588
- else if (code == 46 || (mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
2602
+ else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
2589
2603
  return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);
2590
2604
  }
2591
2605
  else if (code == 13 || code == 27) { // Enter, Esc
@@ -3413,14 +3427,15 @@ function capturePaste(view, event) {
3413
3427
  target.contentEditable = "true";
3414
3428
  target.style.cssText = "position: fixed; left: -10000px; top: 10px";
3415
3429
  target.focus();
3430
+ let plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3416
3431
  setTimeout(() => {
3417
3432
  view.focus();
3418
3433
  if (target.parentNode)
3419
3434
  target.parentNode.removeChild(target);
3420
3435
  if (plainText)
3421
- doPaste(view, target.value, null, view.input.shiftKey, event);
3436
+ doPaste(view, target.value, null, plain, event);
3422
3437
  else
3423
- doPaste(view, target.textContent, target.innerHTML, view.input.shiftKey, event);
3438
+ doPaste(view, target.textContent, target.innerHTML, plain, event);
3424
3439
  }, 50);
3425
3440
  }
3426
3441
  function doPaste(view, text, html, preferPlain, event) {
@@ -3431,7 +3446,7 @@ function doPaste(view, text, html, preferPlain, event) {
3431
3446
  return false;
3432
3447
  let singleNode = sliceSingleNode(slice);
3433
3448
  let tr = singleNode
3434
- ? view.state.tr.replaceSelectionWith(singleNode, view.input.shiftKey)
3449
+ ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)
3435
3450
  : view.state.tr.replaceSelection(slice);
3436
3451
  view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"));
3437
3452
  return true;
@@ -3445,7 +3460,8 @@ editHandlers.paste = (view, _event) => {
3445
3460
  if (view.composing && !android)
3446
3461
  return;
3447
3462
  let data = brokenClipboardAPI ? null : event.clipboardData;
3448
- if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), view.input.shiftKey, event))
3463
+ let plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3464
+ if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event))
3449
3465
  event.preventDefault();
3450
3466
  else
3451
3467
  capturePaste(view, event);
@@ -4751,7 +4767,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
4751
4767
  // as being an iOS enter press), just dispatch an Enter key instead.
4752
4768
  if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&
4753
4769
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
4754
- (!inlineChange && $from.pos < parse.doc.content.size &&
4770
+ (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
4755
4771
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
4756
4772
  nextSel.head == $to.pos)) &&
4757
4773
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.31.3",
3
+ "version": "1.31.5",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -278,7 +278,7 @@ export function captureKeyDown(view: EditorView, event: KeyboardEvent) {
278
278
  let code = event.keyCode, mods = getMods(event)
279
279
  if (code == 8 || (browser.mac && code == 72 && mods == "c")) { // Backspace, Ctrl-h on Mac
280
280
  return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1)
281
- } else if (code == 46 || (browser.mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
281
+ } else if ((code == 46 && !event.shiftKey) || (browser.mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
282
282
  return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1)
283
283
  } else if (code == 13 || code == 27) { // Enter, Esc
284
284
  return true
package/src/domchange.ts CHANGED
@@ -185,7 +185,7 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
185
185
  // as being an iOS enter press), just dispatch an Enter key instead.
186
186
  if (((browser.ios && view.input.lastIOSEnter > Date.now() - 225 &&
187
187
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
188
- (!inlineChange && $from.pos < parse.doc.content.size &&
188
+ (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
189
189
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
190
190
  nextSel.head == $to.pos)) &&
191
191
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
package/src/input.ts CHANGED
@@ -582,11 +582,12 @@ function capturePaste(view: EditorView, event: ClipboardEvent) {
582
582
  if (!plainText) target.contentEditable = "true"
583
583
  target.style.cssText = "position: fixed; left: -10000px; top: 10px"
584
584
  target.focus()
585
+ let plain = view.input.shiftKey && view.input.lastKeyCode != 45
585
586
  setTimeout(() => {
586
587
  view.focus()
587
588
  if (target.parentNode) target.parentNode.removeChild(target)
588
- if (plainText) doPaste(view, (target as HTMLTextAreaElement).value, null, view.input.shiftKey, event)
589
- else doPaste(view, target.textContent!, target.innerHTML, view.input.shiftKey, event)
589
+ if (plainText) doPaste(view, (target as HTMLTextAreaElement).value, null, plain, event)
590
+ else doPaste(view, target.textContent!, target.innerHTML, plain, event)
590
591
  }, 50)
591
592
  }
592
593
 
@@ -597,7 +598,7 @@ export function doPaste(view: EditorView, text: string, html: string | null, pre
597
598
 
598
599
  let singleNode = sliceSingleNode(slice)
599
600
  let tr = singleNode
600
- ? view.state.tr.replaceSelectionWith(singleNode, view.input.shiftKey)
601
+ ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)
601
602
  : view.state.tr.replaceSelection(slice)
602
603
  view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"))
603
604
  return true
@@ -611,7 +612,8 @@ editHandlers.paste = (view, _event) => {
611
612
  // where the editor is almost always composing.
612
613
  if (view.composing && !browser.android) return
613
614
  let data = brokenClipboardAPI ? null : event.clipboardData
614
- if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), view.input.shiftKey, event))
615
+ let plain = view.input.shiftKey && view.input.lastKeyCode != 45
616
+ if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event))
615
617
  event.preventDefault()
616
618
  else
617
619
  capturePaste(view, event)
package/src/viewdesc.ts CHANGED
@@ -385,6 +385,18 @@ export class ViewDesc {
385
385
  let {node, offset} = anchorDOM
386
386
  if (node.nodeType == 3) {
387
387
  brKludge = !!(offset && node.nodeValue![offset - 1] == "\n")
388
+ // Issue #1128
389
+ if (brKludge && offset == node.nodeValue!.length) {
390
+ for (let scan: DOMNode | null = node, after; scan; scan = scan.parentNode) {
391
+ if (after = scan.nextSibling) {
392
+ if (after.nodeName == "BR")
393
+ anchorDOM = headDOM = {node: after.parentNode!, offset: domIndex(after) + 1}
394
+ break
395
+ }
396
+ let desc = scan.pmViewDesc
397
+ if (desc && desc.node && desc.node.isBlock) break
398
+ }
399
+ }
388
400
  } else {
389
401
  let prev = node.childNodes[offset - 1]
390
402
  brKludge = prev && (prev.nodeName == "BR" || (prev as HTMLElement).contentEditable == "false")
@@ -1255,6 +1267,7 @@ class ViewTreeUpdater {
1255
1267
  if (!wrapper.contentDOM) return null
1256
1268
  wrapper.children = next.children
1257
1269
  next.children = []
1270
+ next.destroy()
1258
1271
  for (let ch of wrapper.children) ch.parent = wrapper
1259
1272
 
1260
1273
  return wrapper