From c24a037d4be5daf0742d758023b5556aed952bb7 Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Mon, 13 Jan 2025 12:56:28 +0100 Subject: [PATCH 01/12] calendar: Auto-size inline item details --- .../parent/ext-calendarItemDetails.js | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendarItemDetails.js b/calendar/experiments/calendar/parent/ext-calendarItemDetails.js index 1e9d58e..a9eb998 100644 --- a/calendar/experiments/calendar/parent/ext-calendarItemDetails.js +++ b/calendar/experiments/calendar/parent/ext-calendarItemDetails.js @@ -77,23 +77,32 @@ this.calendarItemDetails = class extends ExtensionAPI { const separatorCell = separator.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "td")); separatorCell.setAttribute("colspan", "2"); + // Fix an annoying bug, this should be part of a different patch + document.getElementById("url-link").style.maxWidth = "42em"; + const browser = document.createXULElement("browser"); browser.setAttribute("flex", "1"); - // TODO The real version will need a max-height and auto-resizing - browser.style.height = "200px"; browser.style.width = "100%"; browser.style.display = "block"; - // Fix an annoying bug, this should be part of a different patch - document.getElementById("url-link").style.maxWidth = "42em"; - - const options = { maxWidth: null, fixedWidth: true }; - setupE10sBrowser(this.extension, browser, browserCell, options).then(() => { - const target = new URL(this.extension.manifest.calendar_item_details.default_content); - target.searchParams.set("area", "inline"); - browser.fixupAndLoadURIString(target.href, { triggeringPrincipal: this.extension.principal }); - }); + // Do this on the next tick so the column width is correctly calculated + window.setTimeout(() => { + const columnWidth = document.querySelector("#event-grid th")?.offsetWidth || 0; + + const options = { maxWidth: null, fixedWidth: true, maxHeight: 200 }; + setupE10sBrowser(this.extension, browser, browserCell, options).then(() => { + browser.messageManager.addMessageListener("Extension:BrowserResized", function(message) { + if (message.data.detail == "delayed") { + browser.style.height = `${message.data.height}px`; + } + }); + const target = new URL(this.extension.manifest.calendar_item_details.default_content); + target.searchParams.set("area", "inline"); + target.searchParams.set("columnWidth", columnWidth); + browser.fixupAndLoadURIString(target.href, { triggeringPrincipal: this.extension.principal }); + }); + }, 0); } }); From 35046ac2ab74d68e4536cb8be7a5e58c031de2f3 Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 18 Jan 2025 22:36:46 +0100 Subject: [PATCH 02/12] calendar: Don't overwrite capabilities with null values --- .../experiments/calendar/parent/ext-calendar-calendars.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index c260de4..cdd2b59 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -145,7 +145,12 @@ this.calendar_calendars = class extends ExtensionAPI { if (updateProperties.capabilities) { // TODO validate capability names const unwrappedCalendar = calendar.wrappedJSObject.mUncachedCalendar.wrappedJSObject; - unwrappedCalendar.capabilities = Object.assign({}, unwrappedCalendar.capabilities, updateProperties.capabilities); + for (const [key, value] of Object.entries(updateProperties.capabilities)) { + if (value === null) { + continue; + } + unwrappedCalendar.capabilities[key] = value; + } calendar.setProperty("extensionCapabilities", JSON.stringify(unwrappedCalendar.capabilities)); } From 91f4554ec68cfee7d570aa9977d2c453cdcad2cb Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 18 Jan 2025 22:37:08 +0100 Subject: [PATCH 03/12] calendar: Don't fail if no calendar_item_details is set --- .../parent/ext-calendarItemDetails.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendarItemDetails.js b/calendar/experiments/calendar/parent/ext-calendarItemDetails.js index a9eb998..29ddefc 100644 --- a/calendar/experiments/calendar/parent/ext-calendarItemDetails.js +++ b/calendar/experiments/calendar/parent/ext-calendarItemDetails.js @@ -33,9 +33,12 @@ this.calendarItemDetails = class extends ExtensionAPI { panelFrame.contentWindow.addEventListener("load", (event) => { const document = event.target.ownerGlobal.document; - let areas = this.extension.manifest.calendar_item_details.allowed_areas || ["secondary"]; - if (!Array.isArray(areas)) { - areas = [areas]; + let areas = []; + if (this.extension.manifest.calendar_item_details) { + areas = this.extension.manifest.calendar_item_details.allowed_areas || ["secondary"] + if (!Array.isArray(areas)) { + areas = [areas]; + } } if (areas.includes("secondary")) { @@ -122,12 +125,14 @@ this.calendarItemDetails = class extends ExtensionAPI { // Fix an annoying bug, this should be part of a different patch document.querySelector(".url-link").style.maxWidth = "42em"; - let areas = this.extension.manifest.calendar_item_details.allowed_areas || ["secondary"]; - if (!Array.isArray(areas)) { - areas = [areas]; + let areas = []; + if (this.extension.manifest.calendar_item_details) { + areas = this.extension.manifest.calendar_item_details.allowed_areas || ["secondary"] + if (!Array.isArray(areas)) { + areas = [areas]; + } } - if (areas.includes("summary")) { const summaryBox = document.querySelector(".item-summary-box"); From 2958e9a5b4b9b6e772ab977d73058304854d177f Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 19 Apr 2025 17:13:32 +0200 Subject: [PATCH 04/12] calendar: Only save overriden properties, fall back to manifest --- .../calendar/parent/ext-calendar-calendars.js | 10 +++++++++- .../calendar/parent/ext-calendar-provider.js | 8 +++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index cdd2b59..2e1a968 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -145,13 +145,21 @@ this.calendar_calendars = class extends ExtensionAPI { if (updateProperties.capabilities) { // TODO validate capability names const unwrappedCalendar = calendar.wrappedJSObject.mUncachedCalendar.wrappedJSObject; + let overrideCapabilities; + try { + overrideCapabilities = JSON.parse(calendar.getProperty("overrideCapabilities")) || {}; + } catch(e) { + overrideCapabilities = {}; + } for (const [key, value] of Object.entries(updateProperties.capabilities)) { if (value === null) { continue; } unwrappedCalendar.capabilities[key] = value; + overrideCapabilities[key] = value; } - calendar.setProperty("extensionCapabilities", JSON.stringify(unwrappedCalendar.capabilities)); + + calendar.setProperty("overrideCapabilities", JSON.stringify(overrideCapabilities)); } if (updateProperties.lastError !== undefined) { diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index 9dd2f22..d72a5be 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -143,13 +143,15 @@ class ExtCalendar extends cal.provider.BaseClass { set id(val) { super.id = val; if (this.id && this.uri) { + let overrideCapabilities; try { - this.capabilities = JSON.parse(super.getProperty("extensionCapabilities")); + overrideCapabilities = JSON.parse(super.getProperty("overrideCapabilities")) || {}; } catch (e) { - this.capabilities = null; + overrideCapabilities = {}; } - this.capabilities ??= this.extension.manifest.calendar_provider.capabilities || {}; + const manifestCapabilities = this.extension.manifest.calendar_provider.capabilities || {}; + this.capabilities = Object.assign({}, manifestCapabilities, overrideCapabilities); this.extension.emit("calendar.provider.onInit", this); } From 92e38fec5b7f703e445dec2b5ee74711daba665e Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Tue, 22 Apr 2025 13:23:41 +0200 Subject: [PATCH 05/12] calendar: Allow passing calendar properties on creation --- .../calendar/parent/ext-calendar-calendars.js | 7 +++++++ .../calendar/schema/calendar-calendars.json | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index 2e1a968..cdca584 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -101,6 +101,13 @@ this.calendar_calendars = class extends ExtensionAPI { if (typeof createProperties.showReminders != "undefined") { calendar.setProperty("suppressAlarms", !createProperties.showReminders); } + if (typeof createProperties.capabilities != "undefined") { + if (!isOwnCalendar(calendar, context.extension)) { + throw new ExtensionError("Cannot set capabilities on foreign calendar types"); + } + + calendar.setProperty("overrideCapabilities", JSON.stringify(createProperties.capabilities)); + } cal.manager.registerCalendar(calendar); diff --git a/calendar/experiments/calendar/schema/calendar-calendars.json b/calendar/experiments/calendar/schema/calendar-calendars.json index 388fae5..73b6e68 100644 --- a/calendar/experiments/calendar/schema/calendar-calendars.json +++ b/calendar/experiments/calendar/schema/calendar-calendars.json @@ -139,7 +139,12 @@ "visible": { "type": "boolean", "optional": true }, "showReminders": { "type": "boolean", "optional": true }, "color": { "type": "string", "optional": true }, - "capabilities": { "$ref": "CalendarCapabilities", "optional": true } + "capabilities": { + "type": "object", + "optional": true, + "additionalProperties": true, + "description": "This is normally CalendarCapabilities, but we don't want to inherit default values here" + } } } ] @@ -159,8 +164,13 @@ "readOnly": { "type": "boolean", "optional": true }, "enabled": { "type": "boolean", "optional": true }, "color": { "type": "string", "optional": true }, - "capabilities": { "$ref": "CalendarCapabilities", "optional": true }, - "lastError": { "type": "string", "optional": true } + "lastError": { "type": "string", "optional": true }, + "capabilities": { + "type": "object", + "optional": true, + "additionalProperties": true, + "description": "This is normally CalendarCapabilities, but we don't want to inherit default values here" + } } } ] From dc73353b54d224174c01247e8d5f36ca507ea5cc Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Mon, 14 Apr 2025 11:39:27 +0200 Subject: [PATCH 06/12] calendar: Fix flipped error condition that marks calendars unavailable --- .../experiments/calendar/parent/ext-calendar-calendars.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index cdca584..7221a9b 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -171,11 +171,11 @@ this.calendar_calendars = class extends ExtensionAPI { if (updateProperties.lastError !== undefined) { if (updateProperties.lastError === null) { - calendar.setProperty("currentStatus", Cr.NS_ERROR_FAILURE); - calendar.setProperty("lastErrorMessage", updateProperties.lastError); - } else { calendar.setProperty("currentStatus", Cr.NS_OK); calendar.setProperty("lastErrorMessage", ""); + } else { + calendar.setProperty("currentStatus", Cr.NS_ERROR_FAILURE); + calendar.setProperty("lastErrorMessage", updateProperties.lastError); } } }, From 87bab5af1de539a7e621b648d04141fd4ecc188f Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Tue, 22 Apr 2025 13:32:14 +0200 Subject: [PATCH 07/12] calendar: Rename a few capabilities for consistency --- .../experiments/calendar/parent/ext-calendar-provider.js | 8 ++++---- .../experiments/calendar/schema/calendar-calendars.json | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index d72a5be..daa1d85 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -227,11 +227,11 @@ class ExtCalendar extends cal.provider.BaseClass { case "capabilities.events.supported": return !(this.capabilities.events === false); case "capabilities.removeModes": - return Array.isArray(this.capabilities.remove_modes) - ? this.capabilities.remove_modes + return Array.isArray(this.capabilities.removeModes) + ? this.capabilities.removeModes : ["unsubscribe"]; case "requiresNetwork": - return !(this.capabilities.requires_network === false); + return !(this.capabilities.requiresNetwork === false); } return super.getProperty(name); @@ -529,7 +529,7 @@ this.calendar_provider = class extends ExtensionAPI { win.gIdentityNotification.removeAllNotifications(); } - const minRefresh = calendar.capabilities?.minimumRefresh; + const minRefresh = calendar.capabilities?.minimumRefreshInterval; if (minRefresh) { const refInterval = win.document.getElementById("calendar-refreshInterval-menupopup"); diff --git a/calendar/experiments/calendar/schema/calendar-calendars.json b/calendar/experiments/calendar/schema/calendar-calendars.json index 73b6e68..ef5f7c0 100644 --- a/calendar/experiments/calendar/schema/calendar-calendars.json +++ b/calendar/experiments/calendar/schema/calendar-calendars.json @@ -72,7 +72,7 @@ }, "tasks": { "type": "boolean", "optional": true, "default": true }, "events": { "type": "boolean", "optional": true, "default": true }, - "remove_modes": { + "removeModes": { "type": "array", "optional": true, "default": ["unsubscribe"], @@ -81,8 +81,8 @@ "enum": ["unsubscribe", "delete"] } }, - "requires_network": { "type": "boolean", "optional": true }, - "minimum_refresh_interval": { "type": "integer", "minimum": -1, "optional": true }, + "requiresNetwork": { "type": "boolean", "optional": true }, + "minimumRefreshInterval": { "type": "integer", "minimum": -1, "optional": true }, "mutable": { "type": "boolean", "optional": true, "default": true } } } From 63aa00b068941555e39e7e45a0218f9e1feab6fd Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Tue, 22 Apr 2025 13:33:04 +0200 Subject: [PATCH 08/12] calendar: More validation in the new calendar dialog --- .../calendar/parent/ext-calendar-provider.js | 23 ++++++++++++++++++- .../calendar/schema/calendar-provider.json | 5 ++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index daa1d85..b3cf834 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -609,6 +609,22 @@ this.calendar_provider = class extends ExtensionAPI { win.gAddonAdvance = new EventEmitter(); } + + const origCheckRequired = win.checkRequired; + win.checkRequired = () => { + origCheckRequired(); + const addonPanel = win.document.getElementById("panel-addon-calendar-settings"); + if (addonPanel.hidden) { + return; + } + + const dialog = win.document.getElementById("calendar-creation-dialog"); + if (addonPanel.dataset.addonNoForward == "true") { + dialog.setAttribute("buttondisabledaccept", "true"); + } else { + dialog.removeAttribute("buttondisabledaccept"); + } + }; } }); } @@ -823,7 +839,7 @@ this.calendar_provider = class extends ExtensionAPI { // New calendar dialog - async setAdvanceAction({ forward, back, label }) { + async setAdvanceAction({ forward, back, label, canForward }) { const window = getNewCalendarWindow(); if (!window) { throw new ExtensionError("New calendar wizard is not open"); @@ -845,6 +861,11 @@ this.calendar_provider = class extends ExtensionAPI { if (!addonPanel.hidden) { window.updateButton("accept", addonPanel); } + + if (typeof canForward === "boolean") { + addonPanel.dataset.addonNoForward = !canForward + window.checkRequired(); + } }, onAdvanceNewCalendar: new EventManager({ context, diff --git a/calendar/experiments/calendar/schema/calendar-provider.json b/calendar/experiments/calendar/schema/calendar-provider.json index ce3a4fd..91d95b5 100644 --- a/calendar/experiments/calendar/schema/calendar-provider.json +++ b/calendar/experiments/calendar/schema/calendar-provider.json @@ -68,9 +68,10 @@ { "type": "object", "properties": { - "forward": { "type": "string" }, + "forward": { "type": "string", "optional": true }, "back": { "type": "string", "optional": true }, - "label": { "type": "string" } + "label": { "type": "string", "optional": true }, + "canForward": { "type": "boolean", "optional": true } } } ] From da1e969015bfdd49871e93e4ca07311f2224f43c Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 16 Aug 2025 21:44:37 +0300 Subject: [PATCH 09/12] calendar: Allow the provider to control scheduling --- .../calendar/parent/ext-calendar-provider.js | 34 +++++++++++++++++++ .../calendar/schema/calendar-calendars.json | 8 ++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index b3cf834..a0d7e38 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -8,6 +8,22 @@ var { ExtensionUtils: { ExtensionError } } = ChromeUtils.importESModule("resourc var { cal } = ChromeUtils.importESModule("resource:///modules/calendar/calUtils.sys.mjs"); var { ExtensionSupport } = ChromeUtils.importESModule("resource:///modules/ExtensionSupport.sys.mjs"); +var { CalItipEmailTransport } = ChromeUtils.importESModule("resource:///modules/CalItipEmailTransport.sys.mjs"); + +// TODO move me +// Have the server take care of scheduling. This can be de-duplicated in +// CalItipEmailTransport.sys.mjs +class CalItipNoEmailTransport extends CalItipEmailTransport { + wrappedJSObject = this; + QueryInterface = ChromeUtils.generateQI(["calIItipTransport"]); + + sendItems() { + return true; + } +} + + + // TODO move me function getNewCalendarWindow() { // This window is missing a windowtype attribute @@ -166,6 +182,14 @@ class ExtCalendar extends cal.provider.BaseClass { } } + get supportsScheduling() { + return this.capabilities.scheduling != "none"; + } + + getSchedulingSupport() { + return this; + } + setProperty(name, value) { if (name === "readOnly" && this.capabilities.mutable === false) { return; // prevent change @@ -190,6 +214,16 @@ class ExtCalendar extends cal.provider.BaseClass { return this.capabilities.organizerName; } break; + case "imip.identity.disabled": + return this.capabilities.scheduling == "none"; + case "itip.transport": + if (this.capabilities.scheduling == "server") { + return new CalItipNoEmailTransport(); + } else if (this.capabilities.scheduling == "none") { + return null; + } + // Else fall through and have super return the client email transport + break; case "readOnly": if (this.capabilities.mutable === false) { diff --git a/calendar/experiments/calendar/schema/calendar-calendars.json b/calendar/experiments/calendar/schema/calendar-calendars.json index ef5f7c0..abc4a6c 100644 --- a/calendar/experiments/calendar/schema/calendar-calendars.json +++ b/calendar/experiments/calendar/schema/calendar-calendars.json @@ -83,7 +83,13 @@ }, "requiresNetwork": { "type": "boolean", "optional": true }, "minimumRefreshInterval": { "type": "integer", "minimum": -1, "optional": true }, - "mutable": { "type": "boolean", "optional": true, "default": true } + "mutable": { "type": "boolean", "optional": true, "default": true }, + "scheduling": { + "type": "string", + "optional": true, + "default": "client", + "enum": ["client", "server", "none"] + } } } ], From 9d494fbb93a41cda8110ac72593172fcdfaa94eb Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 16 Aug 2025 22:05:55 +0300 Subject: [PATCH 10/12] fix: Correctly parse createProperties when creating new calendar --- .../calendar/parent/ext-calendar-calendars.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index 7221a9b..d47a3a4 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -92,16 +92,23 @@ this.calendar_calendars = class extends ExtensionAPI { } calendar.name = createProperties.name; - if (typeof createProperties.color != "undefined") { + + if (createProperties.color != null) { calendar.setProperty("color", createProperties.color); } - if (typeof createProperties.visible != "undefined") { + if (createProperties.readOnly != null) { + calendar.setProperty("readOnly", createProperties.readOnly); + } + if (createProperties.enabled != null) { + calendar.setProperty("disabled", !createProperties.enabled); + } + if (createProperties.visible != null) { calendar.setProperty("calendar-main-in-composite", createProperties.visible); } - if (typeof createProperties.showReminders != "undefined") { + if (createProperties.showReminders != null) { calendar.setProperty("suppressAlarms", !createProperties.showReminders); } - if (typeof createProperties.capabilities != "undefined") { + if (createProperties.capabilities != null) { if (!isOwnCalendar(calendar, context.extension)) { throw new ExtensionError("Cannot set capabilities on foreign calendar types"); } From 088ea257e79351d0b1c0d89c66b12af0e60cd91f Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Sat, 16 Aug 2025 22:06:38 +0300 Subject: [PATCH 11/12] fix: Exclude onResult call from catch block in provider code --- .../calendar/parent/ext-calendar-provider.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index a0d7e38..df4c558 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -483,11 +483,17 @@ class ExtCalendar extends cal.provider.BaseClass { async replayChangesOn(aListener) { this.offlineStorage.startBatch(); try { - await this.extension.emit("calendar.provider.onSync", this); - aListener.onResult({ status: Cr.NS_OK }, null); - } catch (e) { - console.error(e); - aListener.onResult({ status: e.result || Cr.NS_ERROR_FAILURE }, e.message || e); + let status = Cr.NS_OK + let detail = null; + try { + await this.extension.emit("calendar.provider.onSync", this); + } catch (e) { + status = e.result || Cr.NS_ERROR_FAILURE; + detail = e.message || e; + console.error(e); + } + + aListener.onResult({ status }, detail); } finally { this.offlineStorage.endBatch(); } From d69aecce41228985802f0e8a2e740ba96da821e0 Mon Sep 17 00:00:00 2001 From: Philipp Kewisch Date: Mon, 8 Sep 2025 09:13:22 +0200 Subject: [PATCH 12/12] calendar: Handle different exception types in item handlers --- .../calendar/parent/ext-calendar-provider.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/calendar/experiments/calendar/parent/ext-calendar-provider.js b/calendar/experiments/calendar/parent/ext-calendar-provider.js index df4c558..f06efd6 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-provider.js +++ b/calendar/experiments/calendar/parent/ext-calendar-provider.js @@ -314,7 +314,7 @@ class ExtCalendar extends cal.provider.BaseClass { return item; } catch (e) { let code; - if (e.message.startsWith("NetworkError")) { + if (e.message?.startsWith("NetworkError")) { code = Cr.NS_ERROR_NET_INTERRUPT; } else if (e instanceof ItemError) { code = e.xpcomReason; @@ -322,7 +322,7 @@ class ExtCalendar extends cal.provider.BaseClass { code = e.result || Cr.NS_ERROR_FAILURE; } - throw new Components.Exception(e.message, code); + throw new Components.Exception(e.message || e, code); } } @@ -390,7 +390,7 @@ class ExtCalendar extends cal.provider.BaseClass { return item; } catch (e) { let code; - if (e.message.startsWith("NetworkError")) { + if (e.message?.startsWith("NetworkError")) { code = Cr.NS_ERROR_NET_INTERRUPT; } else if (e instanceof ItemError) { if (e.reason == ItemError.CONFLICT) { @@ -406,7 +406,7 @@ class ExtCalendar extends cal.provider.BaseClass { } else { code = e.result || Cr.NS_ERROR_FAILURE; } - throw new Components.Exception(e.message, code); + throw new Components.Exception(e.message || e, code); } } @@ -439,7 +439,7 @@ class ExtCalendar extends cal.provider.BaseClass { this.observers.notify("onDeleteItem", [aItem]); } catch (e) { let code; - if (e.message.startsWith("NetworkError")) { + if (e.message?.startsWith("NetworkError")) { code = Cr.NS_ERROR_NET_INTERRUPT; } else if (e instanceof ItemError) { if (e.reason == ItemError.CONFLICT) { @@ -456,7 +456,7 @@ class ExtCalendar extends cal.provider.BaseClass { code = e.result || Cr.NS_ERROR_FAILURE; } - throw new Components.Exception(e.message, code); + throw new Components.Exception(e.message || e, code); } return aItem; }