Skip to content

Instantly share code, notes, and snippets.

@kewisch
Created July 25, 2020 20:57
Show Gist options
  • Save kewisch/9cc50239529492f8630e56a65d8f3e00 to your computer and use it in GitHub Desktop.
Save kewisch/9cc50239529492f8630e56a65d8f3e00 to your computer and use it in GitHub Desktop.
/**
* 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