diff --git a/calendar/experiments/calendar/ext-calendar-utils.sys.mjs b/calendar/experiments/calendar/ext-calendar-utils.sys.mjs index 3aa1354..d50d9d8 100644 --- a/calendar/experiments/calendar/ext-calendar-utils.sys.mjs +++ b/calendar/experiments/calendar/ext-calendar-utils.sys.mjs @@ -239,6 +239,29 @@ export function convertAlarm(item, alarm) { }; } +/** + * Thunderbird >=148 no longer exposes cal.createAdapter(). Build explicit + * calIObserver objects so the calendar experiment keeps working on newer + * release channels as well as ESR. + * + * @param {object} methods + * @returns {calIObserver} + */ +export function createCalendarObserver(methods = {}) { + return Object.assign({ + QueryInterface: ChromeUtils.generateQI(["calIObserver"]), + onStartBatch() {}, + onEndBatch() {}, + onLoad() {}, + onAddItem() {}, + onModifyItem() {}, + onDeleteItem() {}, + onError() {}, + onPropertyChanged() {}, + onPropertyDeleting() {}, + }, methods); +} + export async function setupE10sBrowser(extension, browser, parent, initOptions={}) { browser.setAttribute("type", "content"); browser.setAttribute("disableglobalhistory", "true"); diff --git a/calendar/experiments/calendar/parent/ext-calendar-calendars.js b/calendar/experiments/calendar/parent/ext-calendar-calendars.js index d47a3a4..f6fbd69 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-calendars.js +++ b/calendar/experiments/calendar/parent/ext-calendar-calendars.js @@ -13,6 +13,7 @@ this.calendar_calendars = class extends ExtensionAPI { const root = `experiments-calendar-${uuid}`; const query = context.extension.manifest.version; const { + createCalendarObserver, unwrapCalendar, getResolvedCalendarById, isOwnCalendar, @@ -275,7 +276,7 @@ this.calendar_calendars = class extends ExtensionAPI { context, name: "calendar.calendars.onUpdated", register: fire => { - const observer = cal.createAdapter(Ci.calIObserver, { + const observer = createCalendarObserver({ onPropertyChanged(calendar, name, value, _oldValue) { const converted = convertCalendar(context.extension, calendar); switch (name) { diff --git a/calendar/experiments/calendar/parent/ext-calendar-items.js b/calendar/experiments/calendar/parent/ext-calendar-items.js index f36b5b0..255ac83 100644 --- a/calendar/experiments/calendar/parent/ext-calendar-items.js +++ b/calendar/experiments/calendar/parent/ext-calendar-items.js @@ -13,6 +13,7 @@ this.calendar_items = class extends ExtensionAPI { const root = `experiments-calendar-${uuid}`; const query = context.extension.manifest.version; const { + createCalendarObserver, getResolvedCalendarById, getCachedCalendar, isCachedCalendar, @@ -164,7 +165,7 @@ this.calendar_items = class extends ExtensionAPI { context, name: "calendar.items.onCreated", register: (fire, options) => { - const observer = cal.createAdapter(Ci.calIObserver, { + const observer = createCalendarObserver({ onAddItem: item => { fire.sync(convertItem(item, options, context.extension)); }, @@ -181,7 +182,7 @@ this.calendar_items = class extends ExtensionAPI { context, name: "calendar.items.onUpdated", register: (fire, options) => { - const observer = cal.createAdapter(Ci.calIObserver, { + const observer = createCalendarObserver({ onModifyItem: (newItem, _oldItem) => { // TODO calculate changeInfo const changeInfo = {}; @@ -200,7 +201,7 @@ this.calendar_items = class extends ExtensionAPI { context, name: "calendar.items.onRemoved", register: fire => { - const observer = cal.createAdapter(Ci.calIObserver, { + const observer = createCalendarObserver({ onDeleteItem: item => { fire.sync(item.calendar.id, item.id); },