prosemirror-view 1.26.2 → 1.26.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 +20 -0
- package/dist/index.cjs +18 -10
- package/dist/index.d.ts +2 -1
- package/dist/index.js +13 -10
- package/package.json +1 -1
- package/src/domcoords.ts +8 -7
- package/src/domobserver.ts +3 -1
- package/src/index.ts +1 -1
- package/src/viewdesc.ts +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## 1.26.5 (2022-07-07)
|
|
2
|
+
|
|
3
|
+
### Bug fixes
|
|
4
|
+
|
|
5
|
+
Fix an issue where a composition happening at the same time as widget insertion/removal could corrupt the rendered DOM.
|
|
6
|
+
|
|
7
|
+
Fix a problem where `coordsAtPos` would look inside the DOM for atomic nodes, and sometimes return very odd positions that way.
|
|
8
|
+
|
|
9
|
+
## 1.26.4 (2022-07-04)
|
|
10
|
+
|
|
11
|
+
### Bug fixes
|
|
12
|
+
|
|
13
|
+
Avoid spurious type errors on `handleDOMEvents` by widening the type for unknown event objects.
|
|
14
|
+
|
|
15
|
+
## 1.26.3 (2022-06-29)
|
|
16
|
+
|
|
17
|
+
### Bug fixes
|
|
18
|
+
|
|
19
|
+
Work around a Safari bug where mutation records get delivered even though the observer wasn't observing when the mutations happened.
|
|
20
|
+
|
|
1
21
|
## 1.26.2 (2022-06-22)
|
|
2
22
|
|
|
3
23
|
### Bug fixes
|
package/dist/index.cjs
CHANGED
|
@@ -444,7 +444,7 @@ function _posAtCoords(view, coords) {
|
|
|
444
444
|
}
|
|
445
445
|
}
|
|
446
446
|
|
|
447
|
-
var elt = (view.root.elementFromPoint ? view.root : doc).elementFromPoint(coords.left, coords.top
|
|
447
|
+
var elt = (view.root.elementFromPoint ? view.root : doc).elementFromPoint(coords.left, coords.top);
|
|
448
448
|
var pos;
|
|
449
449
|
|
|
450
450
|
if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {
|
|
@@ -495,7 +495,8 @@ var BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
|
|
|
495
495
|
function _coordsAtPos(view, pos, side) {
|
|
496
496
|
var _view$docView$domFrom = view.docView.domFromPos(pos, side < 0 ? -1 : 1),
|
|
497
497
|
node = _view$docView$domFrom.node,
|
|
498
|
-
offset = _view$docView$domFrom.offset
|
|
498
|
+
offset = _view$docView$domFrom.offset,
|
|
499
|
+
atom = _view$docView$domFrom.atom;
|
|
499
500
|
|
|
500
501
|
var supportEmptyRange = webkit || gecko;
|
|
501
502
|
|
|
@@ -534,13 +535,15 @@ function _coordsAtPos(view, pos, side) {
|
|
|
534
535
|
}
|
|
535
536
|
}
|
|
536
537
|
|
|
537
|
-
|
|
538
|
-
|
|
538
|
+
var $dom = view.state.doc.resolve(pos - (atom || 0));
|
|
539
|
+
|
|
540
|
+
if (!$dom.parent.inlineContent) {
|
|
541
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
539
542
|
var before = node.childNodes[offset - 1];
|
|
540
543
|
if (before.nodeType == 1) return flattenH(before.getBoundingClientRect(), false);
|
|
541
544
|
}
|
|
542
545
|
|
|
543
|
-
if (offset < nodeSize(node)) {
|
|
546
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
544
547
|
var after = node.childNodes[offset];
|
|
545
548
|
if (after.nodeType == 1) return flattenH(after.getBoundingClientRect(), true);
|
|
546
549
|
}
|
|
@@ -548,13 +551,13 @@ function _coordsAtPos(view, pos, side) {
|
|
|
548
551
|
return flattenH(node.getBoundingClientRect(), side >= 0);
|
|
549
552
|
}
|
|
550
553
|
|
|
551
|
-
if (offset && (side < 0 || offset == nodeSize(node))) {
|
|
554
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
552
555
|
var _before = node.childNodes[offset - 1];
|
|
553
556
|
var target = _before.nodeType == 3 ? textRange(_before, nodeSize(_before) - (supportEmptyRange ? 0 : 1)) : _before.nodeType == 1 && (_before.nodeName != "BR" || !_before.nextSibling) ? _before : null;
|
|
554
557
|
if (target) return flattenV(singleRect(target, 1), false);
|
|
555
558
|
}
|
|
556
559
|
|
|
557
|
-
if (offset < nodeSize(node)) {
|
|
560
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
558
561
|
var _after = node.childNodes[offset];
|
|
559
562
|
|
|
560
563
|
while (_after.pmViewDesc && _after.pmViewDesc.ignoreForCoords) {
|
|
@@ -905,7 +908,8 @@ var ViewDesc = function () {
|
|
|
905
908
|
value: function domFromPos(pos, side) {
|
|
906
909
|
if (!this.contentDOM) return {
|
|
907
910
|
node: this.dom,
|
|
908
|
-
offset: 0
|
|
911
|
+
offset: 0,
|
|
912
|
+
atom: pos + 1
|
|
909
913
|
};
|
|
910
914
|
var i = 0,
|
|
911
915
|
offset = 0;
|
|
@@ -2077,7 +2081,7 @@ var ViewTreeUpdater = function () {
|
|
|
2077
2081
|
if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM) child.dirty = CONTENT_DIRTY;
|
|
2078
2082
|
if (!child.update(node, outerDeco, innerDeco, view)) return false;
|
|
2079
2083
|
this.destroyBetween(this.index, index);
|
|
2080
|
-
this.index
|
|
2084
|
+
this.index++;
|
|
2081
2085
|
return true;
|
|
2082
2086
|
}
|
|
2083
2087
|
}, {
|
|
@@ -4724,7 +4728,11 @@ var DOMObserver = function () {
|
|
|
4724
4728
|
}, {
|
|
4725
4729
|
key: "start",
|
|
4726
4730
|
value: function start() {
|
|
4727
|
-
if (this.observer)
|
|
4731
|
+
if (this.observer) {
|
|
4732
|
+
this.observer.takeRecords();
|
|
4733
|
+
this.observer.observe(this.view.dom, observeOptions);
|
|
4734
|
+
}
|
|
4735
|
+
|
|
4728
4736
|
if (this.onCharData) this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData);
|
|
4729
4737
|
this.connectSelection();
|
|
4730
4738
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -326,6 +326,7 @@ declare class ViewDesc {
|
|
|
326
326
|
domFromPos(pos: number, side: number): {
|
|
327
327
|
node: DOMNode;
|
|
328
328
|
offset: number;
|
|
329
|
+
atom?: number;
|
|
329
330
|
};
|
|
330
331
|
parseRange(from: number, to: number, base?: number): {
|
|
331
332
|
node: DOMNode;
|
|
@@ -563,7 +564,7 @@ includes events that TypeScript's HTMLElementEventMap doesn't know
|
|
|
563
564
|
about.
|
|
564
565
|
*/
|
|
565
566
|
interface DOMEventMap extends HTMLElementEventMap {
|
|
566
|
-
[event: string]:
|
|
567
|
+
[event: string]: any;
|
|
567
568
|
}
|
|
568
569
|
/**
|
|
569
570
|
Props are configuration values that can be passed to an editor view
|
package/dist/index.js
CHANGED
|
@@ -367,7 +367,7 @@ function posAtCoords(view, coords) {
|
|
|
367
367
|
({ startContainer: node, startOffset: offset } = range);
|
|
368
368
|
}
|
|
369
369
|
let elt = (view.root.elementFromPoint ? view.root : doc)
|
|
370
|
-
.elementFromPoint(coords.left, coords.top
|
|
370
|
+
.elementFromPoint(coords.left, coords.top);
|
|
371
371
|
let pos;
|
|
372
372
|
if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {
|
|
373
373
|
let box = view.dom.getBoundingClientRect();
|
|
@@ -422,7 +422,7 @@ const BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
|
|
|
422
422
|
// Given a position in the document model, get a bounding box of the
|
|
423
423
|
// character at that position, relative to the window.
|
|
424
424
|
function coordsAtPos(view, pos, side) {
|
|
425
|
-
let { node, offset } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);
|
|
425
|
+
let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);
|
|
426
426
|
let supportEmptyRange = webkit || gecko;
|
|
427
427
|
if (node.nodeType == 3) {
|
|
428
428
|
// These browsers support querying empty text ranges. Prefer that in
|
|
@@ -461,14 +461,15 @@ function coordsAtPos(view, pos, side) {
|
|
|
461
461
|
return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
|
+
let $dom = view.state.doc.resolve(pos - (atom || 0));
|
|
464
465
|
// Return a horizontal line in block context
|
|
465
|
-
if (
|
|
466
|
-
if (offset && (side < 0 || offset == nodeSize(node))) {
|
|
466
|
+
if (!$dom.parent.inlineContent) {
|
|
467
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
467
468
|
let before = node.childNodes[offset - 1];
|
|
468
469
|
if (before.nodeType == 1)
|
|
469
470
|
return flattenH(before.getBoundingClientRect(), false);
|
|
470
471
|
}
|
|
471
|
-
if (offset < nodeSize(node)) {
|
|
472
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
472
473
|
let after = node.childNodes[offset];
|
|
473
474
|
if (after.nodeType == 1)
|
|
474
475
|
return flattenH(after.getBoundingClientRect(), true);
|
|
@@ -476,7 +477,7 @@ function coordsAtPos(view, pos, side) {
|
|
|
476
477
|
return flattenH(node.getBoundingClientRect(), side >= 0);
|
|
477
478
|
}
|
|
478
479
|
// Inline, not in text node (this is not Bidi-safe)
|
|
479
|
-
if (offset && (side < 0 || offset == nodeSize(node))) {
|
|
480
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
480
481
|
let before = node.childNodes[offset - 1];
|
|
481
482
|
let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))
|
|
482
483
|
// BR nodes tend to only return the rectangle before them.
|
|
@@ -485,7 +486,7 @@ function coordsAtPos(view, pos, side) {
|
|
|
485
486
|
if (target)
|
|
486
487
|
return flattenV(singleRect(target, 1), false);
|
|
487
488
|
}
|
|
488
|
-
if (offset < nodeSize(node)) {
|
|
489
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
489
490
|
let after = node.childNodes[offset];
|
|
490
491
|
while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)
|
|
491
492
|
after = after.nextSibling;
|
|
@@ -797,7 +798,7 @@ class ViewDesc {
|
|
|
797
798
|
}
|
|
798
799
|
domFromPos(pos, side) {
|
|
799
800
|
if (!this.contentDOM)
|
|
800
|
-
return { node: this.dom, offset: 0 };
|
|
801
|
+
return { node: this.dom, offset: 0, atom: pos + 1 };
|
|
801
802
|
// First find the position in the child array
|
|
802
803
|
let i = 0, offset = 0;
|
|
803
804
|
for (let curPos = 0; i < this.children.length; i++) {
|
|
@@ -1723,7 +1724,7 @@ class ViewTreeUpdater {
|
|
|
1723
1724
|
if (!child.update(node, outerDeco, innerDeco, view))
|
|
1724
1725
|
return false;
|
|
1725
1726
|
this.destroyBetween(this.index, index);
|
|
1726
|
-
this.index
|
|
1727
|
+
this.index++;
|
|
1727
1728
|
return true;
|
|
1728
1729
|
}
|
|
1729
1730
|
findIndexWithChild(domNode) {
|
|
@@ -4234,8 +4235,10 @@ class DOMObserver {
|
|
|
4234
4235
|
}
|
|
4235
4236
|
}
|
|
4236
4237
|
start() {
|
|
4237
|
-
if (this.observer)
|
|
4238
|
+
if (this.observer) {
|
|
4239
|
+
this.observer.takeRecords();
|
|
4238
4240
|
this.observer.observe(this.view.dom, observeOptions);
|
|
4241
|
+
}
|
|
4239
4242
|
if (this.onCharData)
|
|
4240
4243
|
this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData);
|
|
4241
4244
|
this.connectSelection();
|
package/package.json
CHANGED
package/src/domcoords.ts
CHANGED
|
@@ -260,7 +260,7 @@ export function posAtCoords(view: EditorView, coords: {top: number, left: number
|
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
let elt = ((view.root as any).elementFromPoint ? view.root : doc)
|
|
263
|
-
.elementFromPoint(coords.left, coords.top
|
|
263
|
+
.elementFromPoint(coords.left, coords.top) as HTMLElement
|
|
264
264
|
let pos
|
|
265
265
|
if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {
|
|
266
266
|
let box = view.dom.getBoundingClientRect()
|
|
@@ -315,7 +315,7 @@ const BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/
|
|
|
315
315
|
// Given a position in the document model, get a bounding box of the
|
|
316
316
|
// character at that position, relative to the window.
|
|
317
317
|
export function coordsAtPos(view: EditorView, pos: number, side: number): Rect {
|
|
318
|
-
let {node, offset} = view.docView.domFromPos(pos, side < 0 ? -1 : 1)
|
|
318
|
+
let {node, offset, atom} = view.docView.domFromPos(pos, side < 0 ? -1 : 1)
|
|
319
319
|
|
|
320
320
|
let supportEmptyRange = browser.webkit || browser.gecko
|
|
321
321
|
if (node.nodeType == 3) {
|
|
@@ -345,13 +345,14 @@ export function coordsAtPos(view: EditorView, pos: number, side: number): Rect {
|
|
|
345
345
|
}
|
|
346
346
|
}
|
|
347
347
|
|
|
348
|
+
let $dom = view.state.doc.resolve(pos - (atom || 0))
|
|
348
349
|
// Return a horizontal line in block context
|
|
349
|
-
if (
|
|
350
|
-
if (offset && (side < 0 || offset == nodeSize(node))) {
|
|
350
|
+
if (!$dom.parent.inlineContent) {
|
|
351
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
351
352
|
let before = node.childNodes[offset - 1]
|
|
352
353
|
if (before.nodeType == 1) return flattenH((before as HTMLElement).getBoundingClientRect(), false)
|
|
353
354
|
}
|
|
354
|
-
if (offset < nodeSize(node)) {
|
|
355
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
355
356
|
let after = node.childNodes[offset]
|
|
356
357
|
if (after.nodeType == 1) return flattenH((after as HTMLElement).getBoundingClientRect(), true)
|
|
357
358
|
}
|
|
@@ -359,7 +360,7 @@ export function coordsAtPos(view: EditorView, pos: number, side: number): Rect {
|
|
|
359
360
|
}
|
|
360
361
|
|
|
361
362
|
// Inline, not in text node (this is not Bidi-safe)
|
|
362
|
-
if (offset && (side < 0 || offset == nodeSize(node))) {
|
|
363
|
+
if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
|
|
363
364
|
let before = node.childNodes[offset - 1]
|
|
364
365
|
let target = before.nodeType == 3 ? textRange(before as Text, nodeSize(before) - (supportEmptyRange ? 0 : 1))
|
|
365
366
|
// BR nodes tend to only return the rectangle before them.
|
|
@@ -367,7 +368,7 @@ export function coordsAtPos(view: EditorView, pos: number, side: number): Rect {
|
|
|
367
368
|
: before.nodeType == 1 && (before.nodeName != "BR" || !before.nextSibling) ? before : null
|
|
368
369
|
if (target) return flattenV(singleRect(target as Range | HTMLElement, 1), false)
|
|
369
370
|
}
|
|
370
|
-
if (offset < nodeSize(node)) {
|
|
371
|
+
if (atom == null && offset < nodeSize(node)) {
|
|
371
372
|
let after = node.childNodes[offset]
|
|
372
373
|
while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords) after = after.nextSibling!
|
|
373
374
|
let target = !after ? null : after.nodeType == 3 ? textRange(after as Text, 0, (supportEmptyRange ? 0 : 1))
|
package/src/domobserver.ts
CHANGED
|
@@ -84,8 +84,10 @@ export class DOMObserver {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
start() {
|
|
87
|
-
if (this.observer)
|
|
87
|
+
if (this.observer) {
|
|
88
|
+
this.observer.takeRecords()
|
|
88
89
|
this.observer.observe(this.view.dom, observeOptions)
|
|
90
|
+
}
|
|
89
91
|
if (this.onCharData)
|
|
90
92
|
this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData)
|
|
91
93
|
this.connectSelection()
|
package/src/index.ts
CHANGED
|
@@ -512,7 +512,7 @@ type NodeViewSet = {[name: string]: NodeViewConstructor | MarkViewConstructor}
|
|
|
512
512
|
/// includes events that TypeScript's HTMLElementEventMap doesn't know
|
|
513
513
|
/// about.
|
|
514
514
|
export interface DOMEventMap extends HTMLElementEventMap {
|
|
515
|
-
[event: string]:
|
|
515
|
+
[event: string]: any
|
|
516
516
|
}
|
|
517
517
|
|
|
518
518
|
/// Props are configuration values that can be passed to an editor view
|
package/src/viewdesc.ts
CHANGED
|
@@ -262,8 +262,8 @@ export class ViewDesc {
|
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
-
domFromPos(pos: number, side: number): {node: DOMNode, offset: number} {
|
|
266
|
-
if (!this.contentDOM) return {node: this.dom, offset: 0}
|
|
265
|
+
domFromPos(pos: number, side: number): {node: DOMNode, offset: number, atom?: number} {
|
|
266
|
+
if (!this.contentDOM) return {node: this.dom, offset: 0, atom: pos + 1}
|
|
267
267
|
// First find the position in the child array
|
|
268
268
|
let i = 0, offset = 0
|
|
269
269
|
for (let curPos = 0; i < this.children.length; i++) {
|
|
@@ -1196,7 +1196,7 @@ class ViewTreeUpdater {
|
|
|
1196
1196
|
if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM) child.dirty = CONTENT_DIRTY
|
|
1197
1197
|
if (!child.update(node, outerDeco, innerDeco, view)) return false
|
|
1198
1198
|
this.destroyBetween(this.index, index)
|
|
1199
|
-
this.index
|
|
1199
|
+
this.index++
|
|
1200
1200
|
return true
|
|
1201
1201
|
}
|
|
1202
1202
|
|