prosemirror-view 1.27.1 → 1.27.2

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,11 @@
1
+ ## 1.27.2 (2022-08-19)
2
+
3
+ ### Bug fixes
4
+
5
+ Fix an issue where `DecorationSet.map`, given a mapping with multiple steps, could in some cases corrupt the decorations.
6
+
7
+ Stop calling `handleClick` when the mouse moved but failed to fire mousemove events (for example when dragging a scrollbar).
8
+
1
9
  ## 1.27.1 (2022-08-16)
2
10
 
3
11
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -3556,6 +3556,7 @@ var MouseDown = function () {
3556
3556
  if (!this.view.dom.contains(event.target)) return;
3557
3557
  var pos = this.pos;
3558
3558
  if (this.view.state.doc != this.startDoc) pos = this.view.posAtCoords(eventCoords(event));
3559
+ this.updateAllowDefault(event);
3559
3560
 
3560
3561
  if (this.allowDefault || !pos) {
3561
3562
  setSelectionOrigin(this.view, "pointer");
@@ -3571,10 +3572,15 @@ var MouseDown = function () {
3571
3572
  }, {
3572
3573
  key: "move",
3573
3574
  value: function move(event) {
3574
- if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 || Math.abs(this.event.y - event.clientY) > 4)) this.allowDefault = true;
3575
+ this.updateAllowDefault(event);
3575
3576
  setSelectionOrigin(this.view, "pointer");
3576
3577
  if (event.buttons == 0) this.done();
3577
3578
  }
3579
+ }, {
3580
+ key: "updateAllowDefault",
3581
+ value: function updateAllowDefault(event) {
3582
+ if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 || Math.abs(this.event.y - event.clientY) > 4)) this.allowDefault = true;
3583
+ }
3578
3584
  }]);
3579
3585
 
3580
3586
  return MouseDown;
@@ -4416,15 +4422,15 @@ var DecorationGroup = function () {
4416
4422
  function mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {
4417
4423
  var children = oldChildren.slice();
4418
4424
 
4419
- var _loop4 = function _loop4(i) {
4425
+ var _loop4 = function _loop4(i, _baseOffset) {
4420
4426
  var moved = 0;
4421
4427
  mapping.maps[i].forEach(function (oldStart, oldEnd, newStart, newEnd) {
4422
4428
  var dSize = newEnd - newStart - (oldEnd - oldStart);
4423
4429
 
4424
4430
  for (var _i12 = 0; _i12 < children.length; _i12 += 3) {
4425
4431
  var end = children[_i12 + 1];
4426
- if (end < 0 || oldStart > end + oldOffset - moved) continue;
4427
- var start = children[_i12] + oldOffset - moved;
4432
+ if (end < 0 || oldStart > end + _baseOffset - moved) continue;
4433
+ var start = children[_i12] + _baseOffset - moved;
4428
4434
 
4429
4435
  if (oldEnd >= start) {
4430
4436
  children[_i12 + 1] = oldStart <= start ? -2 : -1;
@@ -4436,10 +4442,12 @@ function mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, op
4436
4442
 
4437
4443
  moved += dSize;
4438
4444
  });
4445
+ _baseOffset = mapping.maps[i].map(_baseOffset, -1);
4446
+ baseOffset = _baseOffset;
4439
4447
  };
4440
4448
 
4441
- for (var i = 0; i < mapping.maps.length; i++) {
4442
- _loop4(i);
4449
+ for (var i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {
4450
+ _loop4(i, baseOffset);
4443
4451
  }
4444
4452
 
4445
4453
  var mustRebuild = false;
@@ -5085,16 +5093,6 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5085
5093
  to = view.state.doc.resolve(to).after(shared + 1);
5086
5094
  var sel = view.state.selection;
5087
5095
  var parse = parseBetween(view, from, to);
5088
-
5089
- if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from && parse.sel.head == parse.sel.anchor) {
5090
- var text = view.cursorWrapper.deco.type.toDOM.nextSibling;
5091
- var size = text && text.nodeValue ? text.nodeValue.length : 1;
5092
- parse.sel = {
5093
- anchor: parse.sel.anchor + size,
5094
- head: parse.sel.anchor + size
5095
- };
5096
- }
5097
-
5098
5096
  var doc = view.state.doc,
5099
5097
  compare = doc.slice(parse.from, parse.to);
5100
5098
  var preferredPos, preferredSide;
@@ -5137,6 +5135,14 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5137
5135
  }
5138
5136
  }
5139
5137
 
5138
+ if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from && parse.sel.head == parse.sel.anchor) {
5139
+ var size = change.endB - change.start;
5140
+ parse.sel = {
5141
+ anchor: parse.sel.anchor + size,
5142
+ head: parse.sel.anchor + size
5143
+ };
5144
+ }
5145
+
5140
5146
  view.input.domChangeCount++;
5141
5147
 
5142
5148
  if (view.state.selection.from < view.state.selection.to && change.start == change.endB && view.state.selection instanceof prosemirrorState.TextSelection) {
@@ -5207,12 +5213,11 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5207
5213
  tr = view.state.tr;
5208
5214
  if (markChange.type == "add") tr.addMark(chFrom, chTo, markChange.mark);else tr.removeMark(chFrom, chTo, markChange.mark);
5209
5215
  } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {
5210
- var _text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);
5211
-
5216
+ var text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);
5212
5217
  if (view.someProp("handleTextInput", function (f) {
5213
- return f(view, chFrom, chTo, _text);
5218
+ return f(view, chFrom, chTo, text);
5214
5219
  })) return;
5215
- tr = view.state.tr.insertText(_text, chFrom, chTo);
5220
+ tr = view.state.tr.insertText(text, chFrom, chTo);
5216
5221
  }
5217
5222
  }
5218
5223
 
package/dist/index.js CHANGED
@@ -3111,6 +3111,7 @@ class MouseDown {
3111
3111
  let pos = this.pos;
3112
3112
  if (this.view.state.doc != this.startDoc)
3113
3113
  pos = this.view.posAtCoords(eventCoords(event));
3114
+ this.updateAllowDefault(event);
3114
3115
  if (this.allowDefault || !pos) {
3115
3116
  setSelectionOrigin(this.view, "pointer");
3116
3117
  }
@@ -3138,13 +3139,16 @@ class MouseDown {
3138
3139
  }
3139
3140
  }
3140
3141
  move(event) {
3141
- if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||
3142
- Math.abs(this.event.y - event.clientY) > 4))
3143
- this.allowDefault = true;
3142
+ this.updateAllowDefault(event);
3144
3143
  setSelectionOrigin(this.view, "pointer");
3145
3144
  if (event.buttons == 0)
3146
3145
  this.done();
3147
3146
  }
3147
+ updateAllowDefault(event) {
3148
+ if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||
3149
+ Math.abs(this.event.y - event.clientY) > 4))
3150
+ this.allowDefault = true;
3151
+ }
3148
3152
  }
3149
3153
  handlers.touchstart = view => {
3150
3154
  view.input.lastTouch = Date.now();
@@ -3965,15 +3969,15 @@ function mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, op
3965
3969
  let children = oldChildren.slice();
3966
3970
  // Mark the children that are directly touched by changes, and
3967
3971
  // move those that are after the changes.
3968
- for (let i = 0; i < mapping.maps.length; i++) {
3972
+ for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {
3969
3973
  let moved = 0;
3970
3974
  mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {
3971
3975
  let dSize = (newEnd - newStart) - (oldEnd - oldStart);
3972
3976
  for (let i = 0; i < children.length; i += 3) {
3973
3977
  let end = children[i + 1];
3974
- if (end < 0 || oldStart > end + oldOffset - moved)
3978
+ if (end < 0 || oldStart > end + baseOffset - moved)
3975
3979
  continue;
3976
- let start = children[i] + oldOffset - moved;
3980
+ let start = children[i] + baseOffset - moved;
3977
3981
  if (oldEnd >= start) {
3978
3982
  children[i + 1] = oldStart <= start ? -2 : -1;
3979
3983
  }
@@ -3984,6 +3988,7 @@ function mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, op
3984
3988
  }
3985
3989
  moved += dSize;
3986
3990
  });
3991
+ baseOffset = mapping.maps[i].map(baseOffset, -1);
3987
3992
  }
3988
3993
  // Find the child nodes that still correspond to a single node,
3989
3994
  // recursively call mapInner on them and update their positions.
@@ -4531,14 +4536,6 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
4531
4536
  to = view.state.doc.resolve(to).after(shared + 1);
4532
4537
  let sel = view.state.selection;
4533
4538
  let parse = parseBetween(view, from, to);
4534
- // Chrome sometimes leaves the cursor before the inserted text when
4535
- // composing after a cursor wrapper. This moves it forward.
4536
- if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from &&
4537
- parse.sel.head == parse.sel.anchor) {
4538
- let text = view.cursorWrapper.deco.type.toDOM.nextSibling;
4539
- let size = text && text.nodeValue ? text.nodeValue.length : 1;
4540
- parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size };
4541
- }
4542
4539
  let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);
4543
4540
  let preferredPos, preferredSide;
4544
4541
  // Prefer anchoring to end when Backspace is pressed
@@ -4573,6 +4570,13 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
4573
4570
  return;
4574
4571
  }
4575
4572
  }
4573
+ // Chrome sometimes leaves the cursor before the inserted text when
4574
+ // composing after a cursor wrapper. This moves it forward.
4575
+ if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from &&
4576
+ parse.sel.head == parse.sel.anchor) {
4577
+ let size = change.endB - change.start;
4578
+ parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size };
4579
+ }
4576
4580
  view.input.domChangeCount++;
4577
4581
  // Handle the case where overwriting a selection by typing matches
4578
4582
  // the start or end of the selected content, creating a change
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.27.1",
3
+ "version": "1.27.2",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
package/src/decoration.ts CHANGED
@@ -550,14 +550,14 @@ function mapChildren(
550
550
 
551
551
  // Mark the children that are directly touched by changes, and
552
552
  // move those that are after the changes.
553
- for (let i = 0; i < mapping.maps.length; i++) {
553
+ for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {
554
554
  let moved = 0
555
555
  mapping.maps[i].forEach((oldStart: number, oldEnd: number, newStart: number, newEnd: number) => {
556
556
  let dSize = (newEnd - newStart) - (oldEnd - oldStart)
557
557
  for (let i = 0; i < children.length; i += 3) {
558
558
  let end = children[i + 1] as number
559
- if (end < 0 || oldStart > end + oldOffset - moved) continue
560
- let start = (children[i] as number) + oldOffset - moved
559
+ if (end < 0 || oldStart > end + baseOffset - moved) continue
560
+ let start = (children[i] as number) + baseOffset - moved
561
561
  if (oldEnd >= start) {
562
562
  children[i + 1] = oldStart <= start ? -2 : -1
563
563
  } else if (newStart >= offset && dSize) {
@@ -567,6 +567,7 @@ function mapChildren(
567
567
  }
568
568
  moved += dSize
569
569
  })
570
+ baseOffset = mapping.maps[i].map(baseOffset, -1)
570
571
  }
571
572
 
572
573
  // Find the child nodes that still correspond to a single node,
package/src/domchange.ts CHANGED
@@ -97,15 +97,6 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
97
97
  let sel = view.state.selection
98
98
  let parse = parseBetween(view, from, to)
99
99
 
100
- // Chrome sometimes leaves the cursor before the inserted text when
101
- // composing after a cursor wrapper. This moves it forward.
102
- if (browser.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from &&
103
- parse.sel.head == parse.sel.anchor) {
104
- let text = (view.cursorWrapper.deco.type as any).toDOM.nextSibling as DOMNode
105
- let size = text && text.nodeValue ? text.nodeValue.length : 1
106
- parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size}
107
- }
108
-
109
100
  let doc = view.state.doc, compare = doc.slice(parse.from, parse.to)
110
101
  let preferredPos, preferredSide: "start" | "end"
111
102
  // Prefer anchoring to end when Backspace is pressed
@@ -138,6 +129,14 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
138
129
  return
139
130
  }
140
131
  }
132
+ // Chrome sometimes leaves the cursor before the inserted text when
133
+ // composing after a cursor wrapper. This moves it forward.
134
+ if (browser.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from &&
135
+ parse.sel.head == parse.sel.anchor) {
136
+ let size = change.endB - change.start
137
+ parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size}
138
+ }
139
+
141
140
  view.input.domChangeCount++
142
141
  // Handle the case where overwriting a selection by typing matches
143
142
  // the start or end of the selected content, creating a change
package/src/input.ts CHANGED
@@ -372,6 +372,7 @@ class MouseDown {
372
372
  let pos: {pos: number, inside: number} | null = this.pos
373
373
  if (this.view.state.doc != this.startDoc) pos = this.view.posAtCoords(eventCoords(event))
374
374
 
375
+ this.updateAllowDefault(event)
375
376
  if (this.allowDefault || !pos) {
376
377
  setSelectionOrigin(this.view, "pointer")
377
378
  } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {
@@ -398,12 +399,16 @@ class MouseDown {
398
399
  }
399
400
 
400
401
  move(event: MouseEvent) {
401
- if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||
402
- Math.abs(this.event.y - event.clientY) > 4))
403
- this.allowDefault = true
402
+ this.updateAllowDefault(event)
404
403
  setSelectionOrigin(this.view, "pointer")
405
404
  if (event.buttons == 0) this.done()
406
405
  }
406
+
407
+ updateAllowDefault(event: MouseEvent) {
408
+ if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||
409
+ Math.abs(this.event.y - event.clientY) > 4))
410
+ this.allowDefault = true
411
+ }
407
412
  }
408
413
 
409
414
  handlers.touchstart = view => {