From c8020b715123f03fbc3a901953f7eb9ce9440f50 Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Fri, 13 Dec 2024 08:23:13 +0000 Subject: [PATCH] [FIX] sheet view: DELETE_SHEET in initial revisions If a revision contains a `UPDATE_CELL`, the sheet is added to the `sheetsWithDirtyViewports` set. But the sheet isn't when deleting the sheet. So if the initial revisions a sheet is updated then deleted, we'll try to update its viewport in the `finalize` and crash. closes odoo/o-spreadsheet#5357 Task: 4405573 X-original-commit: e2c9c487aa2e3dc0ba8ab7dac807c5b95f335b66 Signed-off-by: Pierre Rousseau (pro) Signed-off-by: Adrien Minne (adrm) --- src/plugins/ui_stateful/sheetview.ts | 1 + tests/sheet/sheetview_plugin.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/plugins/ui_stateful/sheetview.ts b/src/plugins/ui_stateful/sheetview.ts index 3814b1a8ce..486a391185 100644 --- a/src/plugins/ui_stateful/sheetview.ts +++ b/src/plugins/ui_stateful/sheetview.ts @@ -237,6 +237,7 @@ export class SheetViewPlugin extends UIPlugin { break; case "DELETE_SHEET": this.cleanViewports(); + this.sheetsWithDirtyViewports.delete(cmd.sheetId); break; case "ACTIVATE_SHEET": this.sheetsWithDirtyViewports.add(cmd.sheetIdTo); diff --git a/tests/sheet/sheetview_plugin.test.ts b/tests/sheet/sheetview_plugin.test.ts index e166c436f5..e0ad00a3c4 100644 --- a/tests/sheet/sheetview_plugin.test.ts +++ b/tests/sheet/sheetview_plugin.test.ts @@ -3,12 +3,15 @@ import { ComposerStore } from "../../src/components/composer/composer/composer_s import { DEFAULT_CELL_HEIGHT, DEFAULT_CELL_WIDTH, + DEFAULT_REVISION_ID, + MESSAGE_VERSION, getDefaultSheetViewSize, } from "../../src/constants"; import { isDefined, numberToLetters, range, toXC, toZone, zoneToXc } from "../../src/helpers"; import { Model } from "../../src/model"; import { SheetViewPlugin } from "../../src/plugins/ui_stateful/sheetview"; import { Zone } from "../../src/types"; +import { StateUpdateMessage } from "../../src/types/collaborative/transport_service"; import { activateSheet, addColumns, @@ -930,6 +933,25 @@ describe("Viewport of Simple sheet", () => { height: 4.5 * DEFAULT_CELL_HEIGHT, }); }); + + test("Loading a model with initial revisions in sheet that is deleted doesn't crash", () => { + const initialMessages: StateUpdateMessage[] = [ + { + type: "REMOTE_REVISION", + serverRevisionId: DEFAULT_REVISION_ID, + nextRevisionId: "1", + version: MESSAGE_VERSION, + clientId: "bob", + commands: [ + { type: "CREATE_SHEET", position: 1, sheetId: "newSheetId" }, + { type: "UPDATE_CELL", sheetId: "newSheetId", col: 0, row: 0, content: "1" }, + { type: "DELETE_SHEET", sheetId: "newSheetId" }, + ], + }, + ]; + + expect(() => new Model({}, {}, initialMessages)).not.toThrow(); + }); }); describe("Multi Panes viewport", () => {