Created
July 25, 2020 20:57
-
-
Save kewisch/9cc50239529492f8630e56a65d8f3e00 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Tests the calICalendarManager interface | |
*/ | |
function run_test() { | |
do_calendar_startup(run_next_test); | |
} | |
class CalendarManagerObserver { | |
QueryInterface = ChromeUtils.generateQI(["calICalendarManager"]) | |
constructor() { | |
this.reset(); | |
} | |
reset() { | |
this.registered = []; | |
this.unregistering = []; | |
this.deleting = []; | |
} | |
onCalendarRegistered(calendar) { | |
this.registered.push(calendar.id); | |
} | |
onCalendarUnregistering(calendar) { | |
this.unregistering.push(calendar.id); | |
} | |
onCalendarDeleting(calendar) { | |
this.deleting.push(calendar.id); | |
} | |
} | |
function waitForLoad(aCalendar) { | |
return new Promise((resolve) => { | |
let observer = cal.createAdapter(Ci.calIObserver, { | |
onLoad() { | |
console.log("LOAD"); | |
aCalendar.removeObserver(observer); | |
resolve(aCalendar); | |
}, | |
}); | |
console.log("ADDLOAD"); | |
aCalendar.addObserver(observer); | |
}); | |
} | |
add_task(async function test_dynamic_registration() { | |
class BLMCalendar extends cal.provider.BaseClass { | |
type = "blm" | |
constructor() { | |
super(); | |
this.initProviderBase(); | |
} | |
getProperty(name) { | |
switch (name) { | |
case "cache.supported": | |
case "cache.enabled": | |
return true; | |
} | |
} | |
getItems(itemFilter, count, rangeStart, rangeEnd, listener) { | |
this.notifyPureOperationComplete(listener, Cr.NS_OK, Ci.calIOperationListener.GET, null, null); | |
} | |
addItem(item, listener) { | |
this.adoptItem(item.clone(), listener); | |
} | |
adoptItem(item, listener) { | |
this.notifyPureOperationComplete(listener, Cr.NS_OK, Ci.calIOperationListener.ADD, item.id, item); | |
} | |
modifyItem(oldItem, newItem, listener) { | |
this.notifyPureOperationComplete(listener, Cr.NS_OK, Ci.calIOperationListener.MODIFY, newItem.id, newItem); | |
} | |
deleteItem(item, listener) { | |
this.notifyPureOperationComplete(listener, Cr.NS_OK, Ci.calIOperationListener.DELETE, item.id, item); | |
} | |
} | |
let calmgr = cal.getCalendarManager(); | |
let mgrobs = new CalendarManagerObserver(); | |
calmgr.addObserver(mgrobs); | |
equal(calmgr.calendarCount, 0); | |
// No provider registered | |
let calendar = calmgr.createCalendar("blm", Services.io.newURI("black-lives-matter://")); | |
equal(calendar, null); | |
// Register dynamic provider | |
calmgr.wrappedJSObject.registerCalendarProvider("blm", BLMCalendar); | |
calendar = calmgr.createCalendar("blm", Services.io.newURI("black-lives-matter://")); | |
notEqual(calendar, null); | |
ok(calendar.wrappedJSObject instanceof BLMCalendar); | |
// Register a calendar using it | |
calmgr.registerCalendar(calendar); | |
equal(calmgr.calendarCount, 1); | |
let originalId = calendar.id; | |
equal(mgrobs.registered.length, 1); | |
mgrobs.reset(); | |
let calendars = calmgr.getCalendars(); | |
equal(calendars.length, 1); | |
calendar = calendars[0]; | |
notEqual(calendar, null); | |
await waitForLoad(calendar); | |
// Unregister the provider from under its feet | |
calmgr.wrappedJSObject.unregisterCalendarProvider("blm"); // this operation unregisters a calendar and registers a dummy calendar | |
calendars = calmgr.getCalendars(); | |
equal(calendars.length, 1); | |
calendar = calendars[0]; | |
await waitForLoad(calendar); /** NEVER PASSES THIS PROMISE **/ | |
equal(mgrobs.unregistering.length, 1); | |
equal(mgrobs.registered.length, 1); | |
equal(mgrobs.deleting.length, 0); | |
mgrobs.reset(); | |
notEqual(calendar, null); | |
equal(calendar.type, "blm"); | |
equal(calendar.getProperty("force-disabled"), true); | |
equal(calendar.id, originalId); | |
// Re-register the provider should reactive it | |
calmgr.wrappedJSObject.registerCalendarProvider("blm", BLMCalendar); | |
calendars = calmgr.getCalendars(); | |
equal(calendars.length, 1); | |
calendar = calendars[0]; | |
await waitForLoad(calendar); | |
equal(mgrobs.unregistering.length, 1); | |
equal(mgrobs.registered.length, 1); | |
equal(mgrobs.deleting.length, 0); | |
mgrobs.reset(); | |
equal(calendar.type, "blm"); | |
notEqual(calendar.getProperty("force-disabled"), true); | |
equal(calendar.id, originalId); | |
// Make sure calendar is loaded from prefs | |
calmgr.wrappedJSObject.unregisterCalendarProvider("blm"); | |
await new Promise(resolve => calmgr.shutdown({ onResult: resolve })); | |
calmgr.wrappedJSObject.mCache = null; | |
await new Promise(resolve => calmgr.startup({ onResult: resolve })); | |
calendars = calmgr.getCalendars(); | |
equal(calendars.length, 1); | |
calendar = calendars[0]; | |
await waitForLoad(calendar); | |
notEqual(calendar, null); | |
equal(calendar.type, "blm"); | |
equal(calendar.getProperty("force-disabled"), true); | |
equal(calendar.id, originalId); | |
// Cleanup | |
calmgr.unregisterCalendar(calendar); | |
calendars = calmgr.getCalendars(); | |
equal(calendars.length, 0); | |
equal(mgrobs.unregistering.length, 1); | |
equal(mgrobs.registered.length, 0); | |
equal(mgrobs.deleting.length, 0); | |
mgrobs.reset(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment