prosemirror-view 1.41.5 → 1.41.7

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,17 @@
1
+ ## 1.41.7 (2026-03-18)
2
+
3
+ ### Bug fixes
4
+
5
+ Work around a Chrome bug where it sometimes inserts a random `<br>` node when you press backspace before a widget.
6
+
7
+ Fix a crash that could happen when deleting content during a node drag.
8
+
9
+ ## 1.41.6 (2026-02-06)
10
+
11
+ ### Bug fixes
12
+
13
+ Fix an issue where backspacing content before a flexbox or grid styled widget would insert a bogus line break on Firefox.
14
+
1
15
  ## 1.41.5 (2026-01-14)
2
16
 
3
17
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -4403,7 +4403,31 @@ var DOMObserver = function () {
4403
4403
  }
4404
4404
  }
4405
4405
  }
4406
- if (gecko && added.length) {
4406
+ if (added.some(function (n) {
4407
+ return n.nodeName == "BR";
4408
+ }) && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
4409
+ var _iterator3 = _createForOfIteratorHelper(added),
4410
+ _step3;
4411
+ try {
4412
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
4413
+ var node = _step3.value;
4414
+ if (node.nodeName == "BR" && node.parentNode) {
4415
+ var after = node.nextSibling;
4416
+ while (after && after.nodeType == 1) {
4417
+ if (after.contentEditable == "false") {
4418
+ node.parentNode.removeChild(node);
4419
+ break;
4420
+ }
4421
+ after = after.firstChild;
4422
+ }
4423
+ }
4424
+ }
4425
+ } catch (err) {
4426
+ _iterator3.e(err);
4427
+ } finally {
4428
+ _iterator3.f();
4429
+ }
4430
+ } else if (gecko && added.length) {
4407
4431
  var brs = added.filter(function (n) {
4408
4432
  return n.nodeName == "BR";
4409
4433
  });
@@ -4414,38 +4438,20 @@ var DOMObserver = function () {
4414
4438
  if (a.parentNode && a.parentNode.parentNode == b.parentNode) b.remove();else a.remove();
4415
4439
  } else {
4416
4440
  var focusNode = this.currentSelection.focusNode;
4417
- var _iterator3 = _createForOfIteratorHelper(brs),
4418
- _step3;
4441
+ var _iterator4 = _createForOfIteratorHelper(brs),
4442
+ _step4;
4419
4443
  try {
4420
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
4421
- var br = _step3.value;
4444
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
4445
+ var br = _step4.value;
4422
4446
  var parent = br.parentNode;
4423
4447
  if (parent && parent.nodeName == "LI" && (!focusNode || blockParent(view, focusNode) != parent)) br.remove();
4424
4448
  }
4425
4449
  } catch (err) {
4426
- _iterator3.e(err);
4450
+ _iterator4.e(err);
4427
4451
  } finally {
4428
- _iterator3.f();
4452
+ _iterator4.f();
4429
4453
  }
4430
4454
  }
4431
- } else if ((chrome || safari) && added.some(function (n) {
4432
- return n.nodeName == "BR";
4433
- }) && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
4434
- var _iterator4 = _createForOfIteratorHelper(added),
4435
- _step4;
4436
- try {
4437
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
4438
- var node = _step4.value;
4439
- if (node.nodeName == "BR" && node.parentNode) {
4440
- var after = node.nextSibling;
4441
- if (after && after.nodeType == 1 && after.contentEditable == "false") node.parentNode.removeChild(node);
4442
- }
4443
- }
4444
- } catch (err) {
4445
- _iterator4.e(err);
4446
- } finally {
4447
- _iterator4.f();
4448
- }
4449
4455
  }
4450
4456
  var readSel = null;
4451
4457
  if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) && readSel.eq(prosemirrorState.Selection.near(view.state.doc.resolve(0), 1))) {
@@ -5129,11 +5135,11 @@ var EditorView = function () {
5129
5135
  value: function updateDraggedNode(dragging, prev) {
5130
5136
  var sel = dragging.node,
5131
5137
  found = -1;
5132
- if (this.state.doc.nodeAt(sel.from) == sel.node) {
5138
+ if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node) {
5133
5139
  found = sel.from;
5134
5140
  } else {
5135
5141
  var movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);
5136
- var moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);
5142
+ var moved = movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos);
5137
5143
  if (moved == sel.node) found = movedPos;
5138
5144
  }
5139
5145
  this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : prosemirrorState.NodeSelection.create(this.state.doc, found));
package/dist/index.js CHANGED
@@ -4724,7 +4724,22 @@ class DOMObserver {
4724
4724
  }
4725
4725
  }
4726
4726
  }
4727
- if (gecko && added.length) {
4727
+ if (added.some(n => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
4728
+ // Browsers sometimes insert a bogus break node if you
4729
+ // backspace out the last bit of text before an inline-flex node (#1552)
4730
+ for (let node of added)
4731
+ if (node.nodeName == "BR" && node.parentNode) {
4732
+ let after = node.nextSibling;
4733
+ while (after && after.nodeType == 1) {
4734
+ if (after.contentEditable == "false") {
4735
+ node.parentNode.removeChild(node);
4736
+ break;
4737
+ }
4738
+ after = after.firstChild;
4739
+ }
4740
+ }
4741
+ }
4742
+ else if (gecko && added.length) {
4728
4743
  let brs = added.filter(n => n.nodeName == "BR");
4729
4744
  if (brs.length == 2) {
4730
4745
  let [a, b] = brs;
@@ -4742,17 +4757,6 @@ class DOMObserver {
4742
4757
  }
4743
4758
  }
4744
4759
  }
4745
- else if ((chrome || safari) && added.some(n => n.nodeName == "BR") &&
4746
- (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
4747
- // Chrome/Safari sometimes insert a bogus break node if you
4748
- // backspace out the last bit of text before an inline-flex node (#1552)
4749
- for (let node of added)
4750
- if (node.nodeName == "BR" && node.parentNode) {
4751
- let after = node.nextSibling;
4752
- if (after && after.nodeType == 1 && after.contentEditable == "false")
4753
- node.parentNode.removeChild(node);
4754
- }
4755
- }
4756
4760
  let readSel = null;
4757
4761
  // If it looks like the browser has reset the selection to the
4758
4762
  // start of the document after focus, restore the selection from
@@ -5579,12 +5583,12 @@ class EditorView {
5579
5583
  }
5580
5584
  updateDraggedNode(dragging, prev) {
5581
5585
  let sel = dragging.node, found = -1;
5582
- if (this.state.doc.nodeAt(sel.from) == sel.node) {
5586
+ if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node) {
5583
5587
  found = sel.from;
5584
5588
  }
5585
5589
  else {
5586
5590
  let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);
5587
- let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);
5591
+ let moved = movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos);
5588
5592
  if (moved == sel.node)
5589
5593
  found = movedPos;
5590
5594
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.41.5",
3
+ "version": "1.41.7",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -192,7 +192,20 @@ export class DOMObserver {
192
192
  }
193
193
  }
194
194
 
195
- if (browser.gecko && added.length) {
195
+ if (added.some(n => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
196
+ // Browsers sometimes insert a bogus break node if you
197
+ // backspace out the last bit of text before an inline-flex node (#1552)
198
+ for (let node of added) if (node.nodeName == "BR" && node.parentNode) {
199
+ let after = node.nextSibling
200
+ while (after && after.nodeType == 1) {
201
+ if ((after as HTMLElement).contentEditable == "false") {
202
+ node.parentNode.removeChild(node)
203
+ break
204
+ }
205
+ after = after.firstChild
206
+ }
207
+ }
208
+ } else if (browser.gecko && added.length) {
196
209
  let brs = added.filter(n => n.nodeName == "BR") as HTMLElement[]
197
210
  if (brs.length == 2) {
198
211
  let [a, b] = brs
@@ -206,15 +219,6 @@ export class DOMObserver {
206
219
  br.remove()
207
220
  }
208
221
  }
209
- } else if ((browser.chrome || browser.safari) && added.some(n => n.nodeName == "BR") &&
210
- (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
211
- // Chrome/Safari sometimes insert a bogus break node if you
212
- // backspace out the last bit of text before an inline-flex node (#1552)
213
- for (let node of added) if (node.nodeName == "BR" && node.parentNode) {
214
- let after = node.nextSibling
215
- if (after && after.nodeType == 1 && (after as HTMLElement).contentEditable == "false")
216
- node.parentNode.removeChild(node)
217
- }
218
222
  }
219
223
 
220
224
  let readSel: Selection | null = null
package/src/index.ts CHANGED
@@ -274,11 +274,11 @@ export class EditorView {
274
274
 
275
275
  private updateDraggedNode(dragging: Dragging, prev: EditorState) {
276
276
  let sel = dragging.node!, found = -1
277
- if (this.state.doc.nodeAt(sel.from) == sel.node) {
277
+ if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node) {
278
278
  found = sel.from
279
279
  } else {
280
280
  let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size)
281
- let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos)
281
+ let moved = movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos)
282
282
  if (moved == sel.node) found = movedPos
283
283
  }
284
284
  this.dragging = new Dragging(dragging.slice, dragging.move,