From 9acd16a0c78c11cdedc85ae6bce2fa091437812e Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 26 Jun 2025 22:23:13 +0200 Subject: [PATCH] [Editor] In the signature modal, disable the save checkbox when the storage is full (bug 1974257) --- test/integration/signature_editor_spec.mjs | 50 ++++++++++++++++++++-- web/signature_manager.js | 11 +++-- web/viewer.html | 2 +- 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/test/integration/signature_editor_spec.mjs b/test/integration/signature_editor_spec.mjs index 6dff1ddfb..802385e48 100644 --- a/test/integration/signature_editor_spec.mjs +++ b/test/integration/signature_editor_spec.mjs @@ -105,7 +105,7 @@ describe("Signature Editor", () => { await page.waitForSelector( "#addSignatureSaveContainer > input:not(:disabled)" ); - await page.waitForSelector("#addSignatureSaveCheckbox[checked=true]"); + await page.waitForSelector("#addSignatureSaveCheckbox:checked"); // The description has been filled in automatically. await page.waitForFunction( @@ -260,7 +260,7 @@ describe("Signature Editor", () => { await page.waitForSelector( "#addSignatureSaveContainer > input:not(:disabled)" ); - await page.waitForSelector("#addSignatureSaveCheckbox[checked=true]"); + await page.waitForSelector("#addSignatureSaveCheckbox:checked"); // The description has been filled in automatically. await page.waitForFunction( @@ -316,7 +316,7 @@ describe("Signature Editor", () => { await page.waitForSelector( "#addSignatureSaveContainer > input:not(:disabled)" ); - await page.waitForSelector("#addSignatureSaveCheckbox[checked=true]"); + await page.waitForSelector("#addSignatureSaveCheckbox:checked"); // The description has been filled in automatically. await page.waitForFunction( @@ -671,4 +671,48 @@ describe("Signature Editor", () => { ); }); }); + + describe("Bug 1974257", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("empty.pdf", ".annotationEditorLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the signature save checkbox is disabled if storage is full", async () => { + await Promise.all( + pages.map(async ([_, page]) => { + await switchToSignature(page); + + for (let i = 0; i < 6; i++) { + await page.click("#editorSignatureAddSignature"); + await page.waitForSelector("#addSignatureDialog", { + visible: true, + }); + await page.click("#addSignatureTypeInput"); + await page.type("#addSignatureTypeInput", `PDF.js ${i}`); + if (i === 5) { + await page.waitForSelector( + "#addSignatureSaveCheckbox:not(checked)" + ); + await page.waitForSelector("#addSignatureSaveCheckbox:disabled"); + } else { + await page.waitForSelector("#addSignatureSaveCheckbox:checked"); + await page.waitForSelector( + "#addSignatureSaveCheckbox:not(:disabled)" + ); + } + await page.click("#addSignatureAddButton"); + await page.waitForSelector("#addSignatureDialog", { + visible: false, + }); + } + }) + ); + }); + }); }); diff --git a/web/signature_manager.js b/web/signature_manager.js index 9617df859..6c58d5371 100644 --- a/web/signature_manager.js +++ b/web/signature_manager.js @@ -88,6 +88,8 @@ class SignatureManager { #eventBus; + #isStorageFull = false; + #l10n; #overlayManager; @@ -322,8 +324,10 @@ class SignatureManager { } #disableButtons(value) { - this.#saveCheckbox.disabled = - this.#clearButton.disabled = + if (!value || !this.#isStorageFull) { + this.#saveCheckbox.disabled = !value; + } + this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value; @@ -847,7 +851,8 @@ class SignatureManager { this.#currentEditor = editor; this.#uiManager.removeEditListeners(); - const isStorageFull = await this.#signatureStorage.isFull(); + const isStorageFull = (this.#isStorageFull = + await this.#signatureStorage.isFull()); this.#saveContainer.classList.toggle("fullStorage", isStorageFull); this.#saveCheckbox.checked = !isStorageFull; diff --git a/web/viewer.html b/web/viewer.html index 7805b0f1d..ebb24d847 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -725,7 +725,7 @@ See https://github.com/adobe-type-tools/cmap-resources
- +