From 6fa8778fc76aa1ec928e6e04e4485eb75062a42e Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Fri, 22 Jul 2022 14:22:46 +0200 Subject: [PATCH 1/4] add doc parameter to UndoManager --- src/utils/UndoManager.js | 6 ++++-- tests/undo-redo.tests.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/utils/UndoManager.js b/src/utils/UndoManager.js index 25e68c63..c53924a1 100644 --- a/src/utils/UndoManager.js +++ b/src/utils/UndoManager.js @@ -139,6 +139,7 @@ const popStackItem = (undoManager, stack, eventType) => { * undo/redo scope. * @property {Set} [UndoManagerOptions.trackedOrigins=new Set([null])] * @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..). + * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty. */ /** @@ -160,7 +161,8 @@ export class UndoManager extends Observable { captureTransaction = tr => true, deleteFilter = () => true, trackedOrigins = new Set([null]), - ignoreRemoteMapChanges = false + ignoreRemoteMapChanges = false, + doc = /** @type {Doc} */ (array.isArray(typeScope) ? typeScope[0].doc : typeScope.doc) } = {}) { super() /** @@ -187,7 +189,7 @@ export class UndoManager extends Observable { */ this.undoing = false this.redoing = false - this.doc = /** @type {Doc} */ (this.scope[0].doc) + this.doc = doc this.lastChange = 0 this.ignoreRemoteMapChanges = ignoreRemoteMapChanges /** diff --git a/tests/undo-redo.tests.js b/tests/undo-redo.tests.js index c1889d9f..b5bbeba8 100644 --- a/tests/undo-redo.tests.js +++ b/tests/undo-redo.tests.js @@ -49,6 +49,20 @@ export const testUndoText = tc => { t.compare(text0.toDelta(), [{ insert: 'b' }, { insert: 'cxy', attributes: { bold: true } }, { insert: 'z' }]) } +/** + * Test case to fix #241 + * @param {t.TestCase} tc + */ +export const testEmptyTypeScope = tc => { + const ydoc = new Y.Doc() + const um = new Y.UndoManager([], { doc: ydoc }) + const yarray = ydoc.getArray() + um.addToScope(yarray) + yarray.insert(0, [1]) + um.undo() + t.assert(yarray.length === 0) +} + /** * Test case to fix #241 * @param {t.TestCase} tc From 7a61c9026124443396231228d68019e975285710 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Fri, 22 Jul 2022 14:24:44 +0200 Subject: [PATCH 2/4] 13.5.40 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7a81dc3..8c42ae25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "yjs", - "version": "13.5.39", + "version": "13.5.40", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "yjs", - "version": "13.5.39", + "version": "13.5.40", "license": "MIT", "dependencies": { "lib0": "^0.2.49" diff --git a/package.json b/package.json index d1c17746..1284ea65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yjs", - "version": "13.5.39", + "version": "13.5.40", "description": "Shared Editing Library", "main": "./dist/yjs.cjs", "module": "./dist/yjs.mjs", From df2d59e2fb28c10e57a5615c772a29ca27cf98e1 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Thu, 28 Jul 2022 13:52:19 +0200 Subject: [PATCH 3/4] UndoManager: fix special deletion case. closes #447 closes #443 --- src/structs/Item.js | 5 ----- tests/undo-redo.tests.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/structs/Item.js b/src/structs/Item.js index 0b39a246..704dcd32 100644 --- a/src/structs/Item.js +++ b/src/structs/Item.js @@ -211,11 +211,6 @@ export const redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemo while (left !== null && left.redone !== null) { left = getItemCleanStart(transaction, left.redone) } - // check wether we were allowed to follow right (indicating that originally this op was replaced by another item) - if (left === null || /** @type {AbstractType} */ (left.parent)._item !== parentItem) { - // invalid parent; should never happen - return null - } if (left && left.right !== null) { // It is not possible to redo this item because it conflicts with a // change from another client diff --git a/tests/undo-redo.tests.js b/tests/undo-redo.tests.js index b5bbeba8..3b3794f0 100644 --- a/tests/undo-redo.tests.js +++ b/tests/undo-redo.tests.js @@ -602,3 +602,32 @@ export const testBehaviorOfIgnoreremotemapchangesProperty = tc => { t.assert(map1.get('x') === 2) t.assert(map2.get('x') === 2) } + +/** + * Special deletion case. + * + * @see https://github.com/yjs/yjs/issues/447 + * @param {t.TestCase} tc + */ +export const testSpecialDeletionCase = tc => { + const origin = 'undoable' + const doc = new Y.Doc() + const fragment = doc.getXmlFragment() + const undoManager = new Y.UndoManager(fragment, { trackedOrigins: new Set([origin]) }) + doc.transact(() => { + const e = new Y.XmlElement('test') + e.setAttribute('a', '1') + e.setAttribute('b', '2') + fragment.insert(0, [e]) + }) + t.compareStrings(fragment.toString(), '') + doc.transact(() => { + // change attribute "b" and delete test-node + const e = fragment.get(0) + e.setAttribute('b', '3') + fragment.delete(0) + }, origin) + t.compareStrings(fragment.toString(), '') + undoManager.undo() + t.compareStrings(fragment.toString(), '') +} From 97ef4ae1e0c7cefdaf1673a41b6cc83d68948457 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Thu, 28 Jul 2022 14:14:27 +0200 Subject: [PATCH 4/4] 13.5.41 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c42ae25..69ea9528 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "yjs", - "version": "13.5.40", + "version": "13.5.41", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "yjs", - "version": "13.5.40", + "version": "13.5.41", "license": "MIT", "dependencies": { "lib0": "^0.2.49" diff --git a/package.json b/package.json index 1284ea65..83a3db73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yjs", - "version": "13.5.40", + "version": "13.5.41", "description": "Shared Editing Library", "main": "./dist/yjs.cjs", "module": "./dist/yjs.mjs",