diff --git a/src/structs/ContentDoc.js b/src/structs/ContentDoc.js index 1b35d785..2c3bf8a6 100644 --- a/src/structs/ContentDoc.js +++ b/src/structs/ContentDoc.js @@ -5,6 +5,12 @@ import { import * as error from 'lib0/error' +/** + * @param {string} guid + * @param {Object} opts + */ +const createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false }) + /** * @private */ @@ -61,7 +67,7 @@ export class ContentDoc { * @return {ContentDoc} */ copy () { - return new ContentDoc(this.doc) + return new ContentDoc(createDocFromOpts(this.doc.guid, this.opts)) } /** @@ -132,8 +138,4 @@ export class ContentDoc { * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder * @return {ContentDoc} */ -export const readContentDoc = decoder => { - const guid = decoder.readString() - const opts = decoder.readAny() - return new ContentDoc(new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false })) -} +export const readContentDoc = decoder => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny())) diff --git a/src/utils/Doc.js b/src/utils/Doc.js index 2fba3f1d..91d7de71 100644 --- a/src/utils/Doc.js +++ b/src/utils/Doc.js @@ -249,13 +249,8 @@ export class Doc extends Observable { if (item !== null) { this._item = null const content = /** @type {ContentDoc} */ (item.content) - if (item.deleted) { - // @ts-ignore - content.doc = null - } else { - content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false }) - content.doc._item = item - } + content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false }) + content.doc._item = item transact(/** @type {any} */ (item).parent.doc, transaction => { const doc = content.doc if (!item.deleted) { diff --git a/tests/doc.tests.js b/tests/doc.tests.js index 63abee87..66ffb454 100644 --- a/tests/doc.tests.js +++ b/tests/doc.tests.js @@ -213,3 +213,18 @@ export const testSubdocLoadEdgeCasesAutoload = tc => { t.assert(lastEvent !== null && lastEvent.added.has(subdoc3)) t.assert(lastEvent !== null && lastEvent.loaded.has(subdoc3)) } + +/** + * @param {t.TestCase} tc + */ +export const testSubdocsUndo = tc => { + const ydoc = new Y.Doc() + const elems = ydoc.getXmlFragment() + const undoManager = new Y.UndoManager(elems) + const subdoc = new Y.Doc() + // @ts-ignore + elems.insert(0, [subdoc]) + undoManager.undo() + undoManager.redo() + t.assert(elems.length === 1) +}