Bug 1557504 - remove [array] use in xpidl from calIItemBase.idl and calIAlarm.idl. r=pmorris
authorKhushil Mistry <khushil324@gmail.com>
Thu, 14 Nov 2019 21:19:51 +0530
changeset 37507 110ee34fe561cae965d3a5aec1d20c4051408c1b
parent 37506 64e5700c2428333fb571e2477b7609badec9d83d
child 37508 bd0fd75f44381a6db63a95fce6ba61159b791228
push id396
push userclokep@gmail.com
push dateMon, 06 Jan 2020 23:11:57 +0000
reviewerspmorris
bugs1557504
Bug 1557504 - remove [array] use in xpidl from calIItemBase.idl and calIAlarm.idl. r=pmorris
calendar/base/content/agenda-listbox-utils.js
calendar/base/content/calendar-base-view.js
calendar/base/content/calendar-clipboard.js
calendar/base/content/calendar-command-controller.js
calendar/base/content/calendar-dnd-listener.js
calendar/base/content/calendar-editable-item.js
calendar/base/content/calendar-item-editing.js
calendar/base/content/calendar-multiday-base-view.js
calendar/base/content/calendar-task-tree-view.js
calendar/base/content/calendar-task-view.js
calendar/base/content/calendar-ui-utils.js
calendar/base/content/calendar-unifinder.js
calendar/base/content/dialogs/calendar-dialog-utils.js
calendar/base/content/dialogs/calendar-event-dialog-reminder.js
calendar/base/content/dialogs/calendar-invitations-dialog.js
calendar/base/content/dialogs/calendar-summary-dialog.js
calendar/base/content/widgets/calendar-minimonth.js
calendar/base/modules/utils/calItipUtils.jsm
calendar/base/modules/utils/calPrintUtils.jsm
calendar/base/modules/utils/calUnifinderUtils.jsm
calendar/base/public/calIAlarm.idl
calendar/base/public/calIItemBase.idl
calendar/base/src/calAlarm.js
calendar/base/src/calAlarmService.js
calendar/base/src/calFilter.js
calendar/base/src/calItemBase.js
calendar/base/src/calItipItem.js
calendar/import-export/calOutlookCSVImportExport.js
calendar/lightning/content/imip-bar.js
calendar/lightning/content/lightning-item-iframe.js
calendar/lightning/modules/ltnInvitationUtils.jsm
calendar/providers/caldav/calDavCalendar.js
calendar/providers/storage/calStorageCalendar.js
calendar/providers/wcap/calWcapCalendarItems.js
calendar/resources/content/mouseoverPreviews.js
calendar/test/unit/test_alarm.js
calendar/test/unit/test_alarmutils.js
calendar/test/unit/test_attendee.js
calendar/test/unit/test_bug1199942.js
calendar/test/unit/test_bug1204255.js
calendar/test/unit/test_bug1209399.js
calendar/test/unit/test_bug494140.js
calendar/test/unit/test_items.js
calendar/test/unit/test_relation.js
calendar/test/unit/test_storage.js
--- a/calendar/base/content/agenda-listbox-utils.js
+++ b/calendar/base/content/agenda-listbox-utils.js
@@ -896,17 +896,17 @@ agendaListbox.calendarObserver.onAddItem
   setCurrentEvent();
 };
 
 agendaListbox.calendarObserver.getOccurrencesBetween = function(aItem) {
   let occs = [];
   let start = this.agendaListbox.getStart();
   let end = this.agendaListbox.getEnd();
   if (start && end) {
-    occs = aItem.getOccurrencesBetween(start, end, {});
+    occs = aItem.getOccurrencesBetween(start, end);
   }
   return occs;
 };
 
 agendaListbox.calendarObserver.onDeleteItem = function(item, rebuildFlag) {
   this.onLocalDeleteItem(item, true);
 };
 
--- a/calendar/base/content/calendar-base-view.js
+++ b/calendar/base/content/calendar-base-view.js
@@ -48,40 +48,32 @@
           (!item.entryDate && !item.dueDate) ||
           !this.calView.mTasksInView ||
           (item.isCompleted && !this.calView.mShowCompleted)
         ) {
           return;
         }
       }
 
-      const occs = item.getOccurrencesBetween(
-        this.calView.startDate,
-        this.calView.queryEndDate,
-        {}
-      );
+      const occs = item.getOccurrencesBetween(this.calView.startDate, this.calView.queryEndDate);
       for (const occ of occs) {
         if (cal.item.isToDo(occ)) {
           this.calView.doAddItem(occ.QueryInterface(Ci.calITodo));
         } else {
           this.calView.doAddItem(occ.QueryInterface(Ci.calIEvent));
         }
       }
     }
 
     onModifyItem(newItem, oldItem) {
       if (cal.item.isToDo(newItem) && cal.item.isToDo(oldItem) && !this.calView.mTasksInView) {
         return;
       }
       if (!cal.item.isToDo(oldItem) || oldItem.entryDate || oldItem.dueDate) {
-        let occs = oldItem.getOccurrencesBetween(
-          this.calView.startDate,
-          this.calView.queryEndDate,
-          {}
-        );
+        let occs = oldItem.getOccurrencesBetween(this.calView.startDate, this.calView.queryEndDate);
         for (const occ of occs) {
           if (cal.item.isToDo(occ)) {
             this.calView.doDeleteItem(occ.QueryInterface(Ci.calITodo));
           } else {
             this.calView.doDeleteItem(occ.QueryInterface(Ci.calIEvent));
           }
         }
       }
@@ -89,21 +81,17 @@
         if ((!newItem.entryDate && !newItem.dueDate) || !this.calView.mTasksInView) {
           return;
         }
         if (newItem.isCompleted && !this.calView.mShowCompleted) {
           return;
         }
       }
 
-      let occs = newItem.getOccurrencesBetween(
-        this.calView.startDate,
-        this.calView.queryEndDate,
-        {}
-      );
+      let occs = newItem.getOccurrencesBetween(this.calView.startDate, this.calView.queryEndDate);
       for (const occ of occs) {
         if (cal.item.isToDo(occ)) {
           this.calView.doAddItem(occ.QueryInterface(Ci.calITodo));
         } else {
           this.calView.doAddItem(occ.QueryInterface(Ci.calIEvent));
         }
       }
     }
@@ -116,21 +104,17 @@
         if (!item.entryDate && !item.dueDate) {
           return;
         }
         if (item.isCompleted && !this.calView.mShowCompleted) {
           return;
         }
       }
 
-      const occs = item.getOccurrencesBetween(
-        this.calView.startDate,
-        this.calView.queryEndDate,
-        {}
-      );
+      const occs = item.getOccurrencesBetween(this.calView.startDate, this.calView.queryEndDate);
       for (const occ of occs) {
         if (cal.item.isToDo(occ)) {
           this.calView.doDeleteItem(occ.QueryInterface(Ci.calITodo));
         } else {
           this.calView.doDeleteItem(occ.QueryInterface(Ci.calIEvent));
         }
       }
     }
--- a/calendar/base/content/calendar-clipboard.js
+++ b/calendar/base/content/calendar-clipboard.js
@@ -204,17 +204,17 @@ function pasteFromClipboard() {
         earliestDate.isDate = true;
         offset = firstDate.subtractDate(earliestDate);
         let deltaDST = firstDate.timezoneOffset - earliestDate.timezoneOffset;
         offset.inSeconds += deltaDST;
       }
 
       // we only will need to ask whether to send notifications, if there
       // are attendees at all
-      let withAttendees = items.filter(aItem => aItem.getAttendees({}).length > 0);
+      let withAttendees = items.filter(aItem => aItem.getAttendees().length > 0);
 
       let notify = Ci.calIItipItem.USER;
       let destCal = null;
       if (Services.prefs.getBoolPref("calendar.paste.intoSelectedCalendar", false)) {
         destCal = getSelectedCalendar();
       } else {
         let pasteText = "paste";
         if (withAttendees.length) {
@@ -290,17 +290,17 @@ function pasteFromClipboard() {
         // Set new UID to allow multiple paste actions of the same
         // clipboard content.
         newItem.id = cal.getUUID();
         if (offset) {
           cal.item.shiftOffset(newItem, offset);
         }
 
         let extResp = { responseMode: Ci.calIItipItem.NONE };
-        if (item.getAttendees({}).length > 0) {
+        if (item.getAttendees().length > 0) {
           extResp.responseMode = notify;
         }
 
         doTransaction("add", newItem, destCal, null, null, extResp);
       }
       endBatchTransaction();
       break;
     }
--- a/calendar/base/content/calendar-command-controller.js
+++ b/calendar/base/content/calendar-command-controller.js
@@ -505,17 +505,17 @@ var calendarController = {
         }
 
         if (cal.itip.isInvitation(item)) {
           selected_events_invitation++;
         } else if (item.organizer) {
           // If we are the organizer and there are attendees, then
           // this is likely also an invitation.
           let calOrgId = item.calendar.getProperty("organizerId");
-          if (item.organizer.id == calOrgId && item.getAttendees({}).length) {
+          if (item.organizer.id == calOrgId && item.getAttendees().length) {
             selected_events_invitation++;
           }
         }
       }
     }
 
     calendarController.selected_events_readonly = selected_events_readonly == selLength;
 
@@ -646,17 +646,17 @@ var calendarController = {
 
     for (let item of selectedTasks) {
       if (cal.itip.isInvitation(item)) {
         selected_tasks_invitation++;
       } else if (item.organizer) {
         // If we are the organizer and there are attendees, then
         // this is likely also an invitation.
         let calOrgId = item.calendar.getProperty("organizerId");
-        if (item.organizer.id == calOrgId && item.getAttendees({}).length) {
+        if (item.organizer.id == calOrgId && item.getAttendees().length) {
           selected_tasks_invitation++;
         }
       }
     }
 
     return selectedTasks.length == selected_tasks_invitation;
   },
 
--- a/calendar/base/content/calendar-dnd-listener.js
+++ b/calendar/base/content/calendar-dnd-listener.js
@@ -65,24 +65,24 @@ var itemConversion = {
   copyItemBase: function(aItem, aTarget) {
     const copyProps = ["SUMMARY", "LOCATION", "DESCRIPTION", "URL", "CLASS", "PRIORITY"];
 
     for (let prop of copyProps) {
       aTarget.setProperty(prop, aItem.getProperty(prop));
     }
 
     // Attendees
-    let attendees = aItem.getAttendees({});
+    let attendees = aItem.getAttendees();
     for (let attendee of attendees) {
       aTarget.addAttendee(attendee.clone());
     }
 
     // Categories
-    let categories = aItem.getCategories({});
-    aTarget.setCategories(categories.length, categories);
+    let categories = aItem.getCategories();
+    aTarget.setCategories(categories);
 
     // Organizer
     aTarget.organizer = aItem.organizer ? aItem.organizer.clone() : null;
 
     // Calendar
     aTarget.calendar = getSelectedCalendar();
 
     // Recurrence
@@ -106,17 +106,17 @@ var itemConversion = {
 
     // Dates and alarms
     if (!aEvent.startDate.isDate && !aEvent.endDate.isDate) {
       // Dates
       item.entryDate = aEvent.startDate.clone();
       item.dueDate = aEvent.endDate.clone();
 
       // Alarms
-      for (let alarm of aEvent.getAlarms({})) {
+      for (let alarm of aEvent.getAlarms()) {
         item.addAlarm(alarm.clone());
       }
       item.alarmLastAck = aEvent.alarmLastAck ? aEvent.alarmLastAck.clone() : null;
     }
 
     // Map Status values
     let statusMap = {
       TENTATIVE: "NEEDS-ACTION",
@@ -157,17 +157,17 @@ var itemConversion = {
     if (!item.endDate) {
       // Make the event be the default event length if no due date was
       // specified.
       item.endDate = item.startDate.clone();
       item.endDate.minute += Services.prefs.getIntPref("calendar.event.defaultlength", 60);
     }
 
     // Alarms
-    for (let alarm of aTask.getAlarms({})) {
+    for (let alarm of aTask.getAlarms()) {
       item.addAlarm(alarm.clone());
     }
     item.alarmLastAck = aTask.alarmLastAck ? aTask.alarmLastAck.clone() : null;
 
     // Map Status values
     let statusMap = {
       "NEEDS-ACTION": "TENTATIVE",
       COMPLETED: "CONFIRMED",
@@ -403,17 +403,17 @@ calMailButtonDNDObserver.prototype = {
    * on the 'mail mode'-button.
    *
    * @param aItems        An array of items to handle.
    */
   onDropItems: function(aItems) {
     if (aItems && aItems.length > 0) {
       let item = aItems[0];
       let identity = item.calendar.getProperty("imip.identity");
-      let parties = item.getAttendees({});
+      let parties = item.getAttendees();
       if (item.organizer) {
         parties.push(item.organizer);
       }
       if (identity) {
         // if no identity is defined, the composer will fall back to
         // whatever seems suitable - in this case we don't try to remove
         // the sender from the recipient list
         identity = identity.QueryInterface(Ci.nsIMsgIdentity);
--- a/calendar/base/content/calendar-editable-item.js
+++ b/calendar/base/content/calendar-editable-item.js
@@ -293,26 +293,26 @@
       setBooleanAttribute(locationLabel, "hidden", !showLocation || !location);
     }
 
     setCSSClasses() {
       let item = this.mOccurrence;
       let cssSafeId = cal.view.formatStringForCSSRule(item.calendar.id);
       this.style.setProperty("--item-backcolor", `var(--calendar-${cssSafeId}-backcolor)`);
       this.style.setProperty("--item-forecolor", `var(--calendar-${cssSafeId}-forecolor)`);
-      let categoriesArray = item.getCategories({});
+      let categoriesArray = item.getCategories();
       if (categoriesArray.length > 0) {
         let cssClassesArray = categoriesArray.map(cal.view.formatStringForCSSRule);
         this.setAttribute("categories", cssClassesArray.join(" "));
         let categoriesBox = this.querySelector(".calendar-category-box");
         categoriesBox.style.backgroundColor = `var(--category-${cssClassesArray[0]}-color)`;
       }
 
       // Add alarm icons as needed.
-      let alarms = item.getAlarms({});
+      let alarms = item.getAlarms();
       if (alarms.length && Services.prefs.getBoolPref("calendar.alarms.indicator.show", true)) {
         let iconsBox = this.querySelector(".alarm-icons-box");
         cal.alarms.addReminderImages(iconsBox, alarms);
 
         // Set suppressed status on the icons box.
         setElementValue(
           iconsBox,
           item.calendar.getProperty("suppressAlarms") || false,
--- a/calendar/base/content/calendar-item-editing.js
+++ b/calendar/base/content/calendar-item-editing.js
@@ -760,17 +760,17 @@ function setContextPartstat(aTarget, aIt
    * @param   {calEvent|calTodo}  aItem  The calendar item to inspect
    * @returns {?calIAttendee}            An calIAttendee object or null if no
    *                                       participant was detected
    */
   function getParticipant(aItem) {
     let party = null;
     if (cal.itip.isInvitation(aItem)) {
       party = cal.itip.getInvitedAttendee(aItem);
-    } else if (aItem.organizer && aItem.getAttendees({}).length) {
+    } else if (aItem.organizer && aItem.getAttendees().length) {
       let calOrgId = aItem.calendar.getProperty("organizerId");
       if (calOrgId.toLowerCase() == aItem.organizer.id.toLowerCase()) {
         party = aItem.organizer;
       }
     }
     return party;
   }
 
--- a/calendar/base/content/calendar-multiday-base-view.js
+++ b/calendar/base/content/calendar-multiday-base-view.js
@@ -903,17 +903,17 @@
 
       for (const item of this.mSelectedItems) {
         const startDateProperty = cal.dtz.startDateProp(item);
         const endDateProperty = cal.dtz.endDateProp(item);
 
         let occs = [];
         if (item.recurrenceInfo) {
           // If selected a parent item, show occurrence(s) in view range.
-          occs = item.getOccurrencesBetween(this.startDate, this.queryEndDate, {}, 0);
+          occs = item.getOccurrencesBetween(this.startDate, this.queryEndDate);
         } else {
           occs = [item];
         }
 
         for (const occ of occs) {
           let occStart = occ[startDateProperty];
           let occEnd = occ[endDateProperty];
           // Must have at least one of start or end.
@@ -1002,17 +1002,17 @@
      * Return all the occurrences of a given item that are currently displayed in the view.
      *
      * @param {calIItemBase} item    A calendar item.
      * @return {calIItemBase[]}      An array of occurrences.
      */
     getItemOccurrencesInView(item) {
       if (item.recurrenceInfo && item.recurrenceStartDate) {
         // If a parent item is selected, show occurrence(s) in view range.
-        return item.getOccurrencesBetween(this.startDate, this.queryEndDate, {}, 0);
+        return item.getOccurrencesBetween(this.startDate, this.queryEndDate);
       } else if (item.recurrenceStartDate) {
         return [item];
       }
       // Undated todo.
       return [];
     }
 
     /**
--- a/calendar/base/content/calendar-task-tree-view.js
+++ b/calendar/base/content/calendar-task-tree-view.js
@@ -237,22 +237,22 @@ class CalendarTaskTreeView {
     properties.push("calendarid-" + cal.view.formatStringForCSSRule(item.calendar.id));
 
     // Add item status atom.
     if (item.status) {
       properties.push("status-" + item.status.toLowerCase());
     }
 
     // Alarm status atom.
-    if (item.getAlarms({}).length) {
+    if (item.getAlarms().length) {
       properties.push("alarm");
     }
 
     // Task categories.
-    properties = properties.concat(item.getCategories({}).map(cal.view.formatStringForCSSRule));
+    properties = properties.concat(item.getCategories().map(cal.view.formatStringForCSSRule));
 
     return properties.join(" ");
   }
 
   cycleCell(row, col) {
     let task = this.tree.mTaskArray[row];
 
     // Prevent toggling completed status for parent items of
@@ -306,17 +306,17 @@ class CalendarTaskTreeView {
       case "completedDate":
         return task.recurrenceInfo
           ? cal.l10n.getDateFmtString("Repeating")
           : this._formatDateTime(task[property]);
       case "percentComplete":
         return task.percentComplete > 0 ? task.percentComplete + "%" : "";
       case "categories":
         // TODO This is l10n-unfriendly.
-        return task.getCategories({}).join(", ");
+        return task.getCategories().join(", ");
       case "location":
         return task.getProperty("LOCATION");
       case "status":
         return getToDoStatusString(task);
       case "calendar":
         return task.calendar.name;
       case "duration":
         return this.tree.duration(task);
--- a/calendar/base/content/calendar-task-view.js
+++ b/calendar/base/content/calendar-task-view.js
@@ -118,17 +118,17 @@ var taskDetailsView = {
           default: {
             document
               .getElementById("calendar-task-details-status-row")
               .toggleAttribute("hidden", true);
             break;
           }
         }
       }
-      let categories = item.getCategories({});
+      let categories = item.getCategories();
       if (
         !document
           .getElementById("calendar-task-details-category-row")
           .toggleAttribute("hidden", categories.length == 0)
       ) {
         document.getElementById("calendar-task-details-category").textContent = categories.join(
           ", "
         );
@@ -169,17 +169,17 @@ var taskDetailsView = {
         }
       }
       let textbox = document.getElementById("calendar-task-details-description");
       let description = item.hasProperty("DESCRIPTION") ? item.getProperty("DESCRIPTION") : null;
       textbox.value = description;
       textbox.readOnly = true;
       let attachmentRows = document.getElementById("calendar-task-details-attachment-rows");
       removeChildren(attachmentRows);
-      let attachments = item.getAttachments({});
+      let attachments = item.getAttachments();
       if (displayElement("calendar-task-details-attachment-row", attachments.length > 0)) {
         displayElement("calendar-task-details-attachment-rows", true);
         for (let attachment of attachments) {
           let url = attachment.calIAttachment.uri.spec;
           let urlLabel = document.createXULElement("label");
           urlLabel.setAttribute("class", "text-link");
           urlLabel.setAttribute("value", url);
           urlLabel.setAttribute("tooltiptext", url);
@@ -191,17 +191,17 @@ var taskDetailsView = {
       }
     }
   },
 
   loadCategories: function() {
     let categoryPopup = document.getElementById("task-actions-category-popup");
     let item = document.getElementById("calendar-task-tree").currentTask;
 
-    let itemCategories = item.getCategories({});
+    let itemCategories = item.getCategories();
     let categoryList = cal.category.fromPrefs();
     for (let cat of itemCategories) {
       if (!categoryList.includes(cat)) {
         categoryList.push(cat);
       }
     }
     cal.l10n.sortArrayByLocaleCollator(categoryList);
 
@@ -232,29 +232,29 @@ var taskDetailsView = {
       categoryPopup.appendChild(menuitem);
     }
   },
 
   saveCategories: function(event) {
     let categoryPopup = document.getElementById("task-actions-category-popup");
     let item = document.getElementById("calendar-task-tree").currentTask;
 
-    let oldCategories = item.getCategories({});
+    let oldCategories = item.getCategories();
     let categories = Array.from(
       categoryPopup.querySelectorAll("menuitem.calendar-category[checked]"),
       menuitem => menuitem.value
     );
     let unchanged = oldCategories.length == categories.length;
     for (let i = 0; unchanged && i < categories.length; i++) {
       unchanged = oldCategories[i] == categories[i];
     }
 
     if (!unchanged) {
       let newItem = item.clone();
-      newItem.setCategories(categories.length, categories);
+      newItem.setCategories(categories);
       doTransaction("modify", newItem, newItem.calendar, item, null);
       return false;
     }
 
     return true;
   },
 
   categoryTextboxKeypress: function(event) {
@@ -332,17 +332,17 @@ var taskDetailsView = {
     }
 
     if (modified) {
       categoryList = categoryPopup.querySelectorAll("menuitem.calendar-category[checked]");
       categories = Array.from(categoryList, cat => cat.getAttribute("value"));
 
       let item = document.getElementById("calendar-task-tree").currentTask;
       let newItem = item.clone();
-      newItem.setCategories(categories.length, categories);
+      newItem.setCategories(categories);
       doTransaction("modify", newItem, newItem.calendar, item, null);
     }
 
     event.target.value = "";
   },
 };
 
 /**
--- a/calendar/base/content/calendar-ui-utils.js
+++ b/calendar/base/content/calendar-ui-utils.js
@@ -669,17 +669,17 @@ function setupAttendanceMenu(aMenu, aIte
    * @returns {?String}                  The participation status string
    *                                       as per RfC 5545 or null if no
    *                                       participant was detected
    */
   function getInvitationStatus(aItem) {
     let party = null;
     if (cal.itip.isInvitation(aItem)) {
       party = cal.itip.getInvitedAttendee(aItem);
-    } else if (aItem.organizer && aItem.getAttendees({}).length) {
+    } else if (aItem.organizer && aItem.getAttendees().length) {
       let calOrgId = aItem.calendar.getProperty("organizerId");
       if (calOrgId && calOrgId.toLowerCase() == aItem.organizer.id.toLowerCase()) {
         party = aItem.organizer;
       }
     }
     return party && (party.participationStatus || "NEEDS-ACTION");
   }
 
--- a/calendar/base/content/calendar-unifinder.js
+++ b/calendar/base/content/calendar-unifinder.js
@@ -143,17 +143,17 @@ var unifinderObserver = {
    *
    * @return aItem        The item to add to the tree.
    */
   addItemToTree: function(aItem) {
     let items;
     let filter = unifinderTreeView.mFilter;
 
     if (filter.startDate && filter.endDate) {
-      items = aItem.getOccurrencesBetween(filter.startDate, filter.endDate, {});
+      items = aItem.getOccurrencesBetween(filter.startDate, filter.endDate);
     } else {
       items = [aItem];
     }
     unifinderTreeView.addItems(items.filter(filter.isItemInFilters, filter));
   },
 
   /**
    * Remove an item from the unifinder tree. It is safe to call these for any
@@ -161,17 +161,17 @@ var unifinderObserver = {
    * needs to be done to the tree.
    *
    * @return aItem        The item to remove from the tree.
    */
   removeItemFromTree: function(aItem) {
     let items;
     let filter = unifinderTreeView.mFilter;
     if (filter.startDate && filter.endDate && aItem.parentItem == aItem) {
-      items = aItem.getOccurrencesBetween(filter.startDate, filter.endDate, {});
+      items = aItem.getOccurrencesBetween(filter.startDate, filter.endDate);
     } else {
       items = [aItem];
     }
     // XXX: do we really still need this, we are always checking it in the refreshInternal
     unifinderTreeView.removeItems(items.filter(filter.isItemInFilters, filter));
   },
 
   observe: function() {
@@ -717,22 +717,22 @@ var unifinderTreeView = {
     properties.push("calendar-" + cal.view.formatStringForCSSRule(item.calendar.name));
 
     // Add item status atom
     if (item.status) {
       properties.push("status-" + item.status.toLowerCase());
     }
 
     // Alarm status atom
-    if (item.getAlarms({}).length) {
+    if (item.getAlarms().length) {
       properties.push("alarm");
     }
 
     // Task categories
-    properties = properties.concat(item.getCategories({}).map(cal.view.formatStringForCSSRule));
+    properties = properties.concat(item.getCategories().map(cal.view.formatStringForCSSRule));
 
     return properties.join(" ");
   },
   getColumnProperties: function(aCol) {
     return "";
   },
 
   isContainer: function() {
@@ -793,17 +793,17 @@ var unifinderTreeView = {
         // let eventEndDate = getCurrentNextOrPreviousRecurrence(calendarEvent);
         if (calendarEvent.startDate.isDate) {
           // display enddate is ical enddate - 1
           eventEndDate.day = eventEndDate.day - 1;
         }
         return formatUnifinderEventDateTime(eventEndDate);
       }
       case "categories": {
-        return calendarEvent.getCategories({}).join(", ");
+        return calendarEvent.getCategories().join(", ");
       }
       case "location": {
         return calendarEvent.getProperty("LOCATION");
       }
       case "status": {
         return getEventStatusString(calendarEvent);
       }
       case "calendar": {
--- a/calendar/base/content/dialogs/calendar-dialog-utils.js
+++ b/calendar/base/content/dialogs/calendar-dialog-utils.js
@@ -297,17 +297,17 @@ function loadReminders(reminders) {
  * Save the selected reminder into the passed item.
  *
  * @param item      The item save the reminder into.
  */
 function saveReminder(item) {
   // We want to compare the old alarms with the new ones. If these are not
   // the same, then clear the snooze/dismiss times
   let oldAlarmMap = {};
-  for (let alarm of item.getAlarms({})) {
+  for (let alarm of item.getAlarms()) {
     oldAlarmMap[alarm.icalString] = true;
   }
 
   // Clear the alarms so we can add our new ones.
   item.clearAlarms();
 
   let reminderList = document.getElementById("item-alarm");
   if (reminderList.value != "none") {
@@ -333,17 +333,17 @@ function saveReminder(item) {
       alarmActions[action] = true;
     }
 
     // Make sure only alarms are saved that work in the given calendar.
     reminders.filter(x => x.action in alarmActions).forEach(item.addAlarm, item);
   }
 
   // Compare alarms to see if something changed.
-  for (let alarm of item.getAlarms({})) {
+  for (let alarm of item.getAlarms()) {
     let ics = alarm.icalString;
     if (ics in oldAlarmMap) {
       // The new alarm is also in the old set, remember this
       delete oldAlarmMap[ics];
     } else {
       // The new alarm is not in the old set, this means the alarms
       // differ and we can break out.
       oldAlarmMap[ics] = true;
@@ -704,17 +704,17 @@ function adaptScheduleAgent(aItem) {
     let identity = aItem.calendar.getProperty("imip.identity");
     let orgEmail = identity && identity.QueryInterface(Ci.nsIMsgIdentity).email;
     let organizerAction = aItem.organizer && orgEmail && aItem.organizer.id == "mailto:" + orgEmail;
     if (aItem.calendar.getProperty("forceEmailScheduling")) {
       cal.LOG("Enforcing clientside email based scheduling.");
       // for attendees, we change schedule-agent only in case of an
       // organizer triggered action
       if (organizerAction) {
-        aItem.getAttendees({}).forEach(aAttendee => {
+        aItem.getAttendees().forEach(aAttendee => {
           // overwriting must always happen consistently for all
           // attendees regarding SERVER or CLIENT but must not override
           // e.g. NONE, so we only overwrite if the param is set to
           // SERVER or doesn't exist
           if (
             aAttendee.getProperty("SCHEDULE-AGENT") == "SERVER" ||
             !aAttendee.getProperty("SCHEDULE-AGENT")
           ) {
@@ -730,17 +730,17 @@ function adaptScheduleAgent(aItem) {
       ) {
         // for organizer, we change the schedule-agent only in case of
         // an attendee triggered action
         aItem.organizer.setProperty("SCHEDULE-AGENT", "CLIENT");
         aItem.organizer.deleteProperty("SCHEDULE-STATUS");
         aItem.organizer.deleteProperty("SCHEDULE-FORCE-SEND");
       }
     } else if (organizerAction) {
-      aItem.getAttendees({}).forEach(aAttendee => {
+      aItem.getAttendees().forEach(aAttendee => {
         if (aAttendee.getProperty("SCHEDULE-AGENT") == "CLIENT") {
           aAttendee.deleteProperty("SCHEDULE-AGENT");
         }
       });
     } else if (aItem.organizer && aItem.organizer.getProperty("SCHEDULE-AGENT") == "CLIENT") {
       aItem.organizer.deleteProperty("SCHEDULE-AGENT");
     }
   }
--- a/calendar/base/content/dialogs/calendar-event-dialog-reminder.js
+++ b/calendar/base/content/dialogs/calendar-event-dialog-reminder.js
@@ -80,17 +80,17 @@ function onLoad() {
 
 /**
  * Load Reminders from the window's arguments and set up dialog controls to
  * their initial values.
  */
 function loadReminders() {
   let args = window.arguments[0];
   let listbox = document.getElementById("reminder-listbox");
-  let reminders = args.reminders || args.item.getAlarms({});
+  let reminders = args.reminders || args.item.getAlarms();
 
   // This dialog should not be shown if the calendar doesn't support alarms at
   // all, so the case of maxCount = 0 breaking this logic doesn't apply.
   let maxReminders = args.calendar.getProperty("capabilities.alarms.maxCount");
   let count = Math.min(reminders.length, maxReminders || reminders.length);
   for (let i = 0; i < count; i++) {
     if (reminders[i].action in allowedActionsMap) {
       // Set up the listitem and add it to the listbox, but only if the
--- a/calendar/base/content/dialogs/calendar-invitations-dialog.js
+++ b/calendar/base/content/dialogs/calendar-invitations-dialog.js
@@ -290,17 +290,17 @@ function fillJobQueue(queue) {
     let oldStatus = richListItem.initialParticipationStatus;
     if (newStatus != oldStatus) {
       let actionString = "modify";
       let oldCalendarItem = richListItem.calendarItem;
       let newCalendarItem = oldCalendarItem.clone();
 
       // set default alarm on unresponded items that have not been declined:
       if (
-        !newCalendarItem.getAlarms({}).length &&
+        !newCalendarItem.getAlarms().length &&
         oldStatus == "NEEDS-ACTION" &&
         newStatus != "DECLINED"
       ) {
         cal.alarms.setDefaultValues(newCalendarItem);
       }
 
       richListItem.setCalendarItemParticipationStatus(newCalendarItem, newStatus);
       let job = {
--- a/calendar/base/content/dialogs/calendar-summary-dialog.js
+++ b/calendar/base/content/dialogs/calendar-summary-dialog.js
@@ -58,29 +58,29 @@ function onLoad() {
 
   // set the dialog-id to enable the right window-icon to be loaded.
   if (cal.item.isEvent(item)) {
     setDialogId(document.documentElement, "calendar-event-summary-dialog");
   } else if (cal.item.isToDo(item)) {
     setDialogId(document.documentElement, "calendar-task-summary-dialog");
   }
 
-  window.attendees = item.getAttendees({});
+  window.attendees = item.getAttendees();
 
   let calendar = cal.wrapInstance(item.calendar, Ci.calISchedulingSupport);
   window.readOnly = !(
     cal.acl.isCalendarWritable(calendar) &&
     (cal.acl.userCanModifyItem(item) ||
       (calendar && item.calendar.isInvitation(item) && cal.acl.userCanRespondToInvitation(item)))
   );
   if (!window.readOnly && calendar) {
     let attendee = calendar.getInvitedAttendee(item);
     if (attendee) {
       // if this is an unresponded invitation, preset our default alarm values:
-      if (!item.getAlarms({}).length && attendee.participationStatus == "NEEDS-ACTION") {
+      if (!item.getAlarms().length && attendee.participationStatus == "NEEDS-ACTION") {
         cal.alarms.setDefaultValues(item);
       }
 
       window.attendee = attendee.clone();
       // Since we don't have API to update an attendee in place, remove
       // and add again. Also, this is needed if the attendee doesn't exist
       // (i.e REPLY on a mailing list)
       item.removeAttendee(attendee);
@@ -118,31 +118,31 @@ function onLoad() {
   }
   // show reminder if this item is *not* readonly.
   // this case happens for example if this is an invitation.
   let argCalendar = window.arguments[0].calendarEvent.calendar;
   let supportsReminders =
     argCalendar.getProperty("capabilities.alarms.oninvitations.supported") !== false;
   if (!window.readOnly && supportsReminders) {
     document.getElementById("reminder-row").removeAttribute("hidden");
-    loadReminders(window.calendarItem.getAlarms({}));
+    loadReminders(window.calendarItem.getAlarms());
     updateReminder();
   }
 
   updateRepeatDetails();
   updateAttendees();
   updateLink();
 
   let location = item.getProperty("LOCATION");
   if (location && location.length) {
     document.getElementById("location-row").removeAttribute("hidden");
     document.getElementById("item-location").value = location;
   }
 
-  let categories = item.getCategories({});
+  let categories = item.getCategories();
   if (categories.length > 0) {
     document.getElementById("category-row").removeAttribute("hidden");
     document.getElementById("item-category").value = categories.join(", "); // TODO l10n-unfriendly
   }
 
   let organizer = item.organizer;
   if (organizer && organizer.id) {
     document.getElementById("organizer-row").removeAttribute("hidden");
@@ -203,17 +203,17 @@ function onLoad() {
       let textbox = document.getElementById("item-description");
       textbox.value = description;
       textbox.readOnly = true;
     }
   }
 
   document.title = item.title;
 
-  let attachments = item.getAttachments({});
+  let attachments = item.getAttachments();
   if (attachments.length) {
     // we only want to display uri type attachments and no ones received inline with the
     // invitation message (having a CID: prefix results in about:blank) here
     let attCounter = 0;
     attachments.forEach(aAttachment => {
       if (aAttachment.uri && aAttachment.uri.spec != "about:blank") {
         let attachment = document.getElementById("attachment-template").cloneNode(true);
         attachment.removeAttribute("id");
@@ -505,16 +505,16 @@ function sendMailToOrganizer() {
  */
 function openAttachment(aAttachmentId) {
   if (!aAttachmentId) {
     return;
   }
   let args = window.arguments[0];
   let item = args.calendarEvent;
   let attachments = item
-    .getAttachments({})
+    .getAttachments()
     .filter(aAttachment => aAttachment.hashId == aAttachmentId);
   if (attachments.length && attachments[0].uri && attachments[0].uri.spec != "about:blank") {
     Cc["@mozilla.org/uriloader/external-protocol-service;1"]
       .getService(Ci.nsIExternalProtocolService)
       .loadURI(attachments[0].uri);
   }
 }
--- a/calendar/base/content/widgets/calendar-minimonth.js
+++ b/calendar/base/content/widgets/calendar-minimonth.js
@@ -312,17 +312,17 @@
     onGetResult(aCalendar, aStatus, aItemType, aDetail, aCount, aItems) {
       if (Components.isSuccessCode(aStatus)) {
         aItems.forEach(item => this.setBusyDaysForOccurrence(item, true));
       }
     }
 
     setBusyDaysForItem(aItem, aState) {
       let items = aItem.recurrenceInfo
-        ? aItem.getOccurrencesBetween(this.firstDate, this.lastDate, {})
+        ? aItem.getOccurrencesBetween(this.firstDate, this.lastDate)
         : [aItem];
       items.forEach(item => this.setBusyDaysForOccurrence(item, aState));
     }
 
     parseBoxBusy(aBox) {
       let boxBusy = {};
 
       let busyStr = aBox.getAttribute("busy");
--- a/calendar/base/modules/utils/calItipUtils.jsm
+++ b/calendar/base/modules/utils/calItipUtils.jsm
@@ -322,17 +322,17 @@ var calitip = {
       if (foundItems && foundItems.length) {
         data.showItems.push("imipDetailsButton");
         if (itipItem.receivedMethod == "COUNTER" && itipItem.sender) {
           if (disallowedCounter) {
             data.label = cal.l10n.getLtnString("imipBarDisallowedCounterText");
           } else {
             let comparison;
             for (let item of itipItem.getItemList()) {
-              let attendees = cal.itip.getAttendeesBySender(item.getAttendees({}), itipItem.sender);
+              let attendees = cal.itip.getAttendeesBySender(item.getAttendees(), itipItem.sender);
               if (attendees.length == 1) {
                 comparison = calitip.compareSequence(item, foundItems[0]);
                 if (comparison == 1) {
                   data.label = cal.l10n.getLtnString("imipBarCounterErrorText");
                   break;
                 } else if (comparison == -1) {
                   data.label = cal.l10n.getLtnString("imipBarCounterPreviousVersionText");
                 }
@@ -794,18 +794,18 @@ var calitip = {
             "cal.itip.checkAndSend(): Invalid value " +
               aExtResponse.responseMode +
               " provided for responseMode attribute in argument aExtResponse." +
               " Falling back to USER mode.\r\n" +
               cal.STACK(20)
           );
       }
     } else if (
-      (aOriginalItem && aOriginalItem.getAttendees({}).length) ||
-      aItem.getAttendees({}).length
+      (aOriginalItem && aOriginalItem.getAttendees().length) ||
+      aItem.getAttendees().length
     ) {
       // let's log something useful to notify addon developers or find any
       // missing pieces in the conversions if the current or original item
       // has attendees - the latter is to prevent logging if creating events
       // by click and slide in day or week views
       cal.LOG(
         "cal.itip.checkAndSend: no response mode provided, " +
           "falling back to USER mode.\r\n" +
@@ -898,33 +898,33 @@ var calitip = {
 
     if (aItem.getProperty("X-MOZ-SEND-INVITATIONS") != "TRUE") {
       // Only send invitations/cancellations
       // if the user checked the checkbox
       return;
     }
 
     // special handling for invitation with event status cancelled
-    if (aItem.getAttendees({}).length > 0 && aItem.getProperty("STATUS") == "CANCELLED") {
+    if (aItem.getAttendees().length > 0 && aItem.getProperty("STATUS") == "CANCELLED") {
       if (calitip.getSequence(aItem) > 0) {
         // make sure we send a cancellation and not an request
         aOpType = Ci.calIOperationListener.DELETE;
       } else {
         // don't send an invitation, if the event was newly created and has status cancelled
         return;
       }
     }
 
     if (aOpType == Ci.calIOperationListener.DELETE) {
-      sendMessage(aItem, "CANCEL", aItem.getAttendees({}), autoResponse);
+      sendMessage(aItem, "CANCEL", aItem.getAttendees(), autoResponse);
       return;
     } // else ADD, MODIFY:
 
-    let originalAtt = aOriginalItem ? aOriginalItem.getAttendees({}) : [];
-    let itemAtt = aItem.getAttendees({});
+    let originalAtt = aOriginalItem ? aOriginalItem.getAttendees() : [];
+    let itemAtt = aItem.getAttendees();
     let canceledAttendees = [];
     let addedAttendees = [];
 
     if (itemAtt.length > 0 || originalAtt.length > 0) {
       let attMap = {};
       for (let att of originalAtt) {
         attMap[att.id.toLowerCase()] = att;
       }
@@ -962,17 +962,17 @@ var calitip = {
       ) {
         let requestItem = aItem.clone();
         if (!requestItem.organizer) {
           requestItem.organizer = createOrganizer(requestItem.calendar);
         }
 
         // Fix up our attendees for invitations using some good defaults
         let recipients = [];
-        let reqItemAtt = requestItem.getAttendees({});
+        let reqItemAtt = requestItem.getAttendees();
         if (!isMinorUpdate) {
           requestItem.removeAllAttendees();
         }
         for (let attendee of reqItemAtt) {
           if (!isMinorUpdate) {
             attendee = attendee.clone();
             if (!attendee.role) {
               attendee.role = "REQ-PARTICIPANT";
@@ -1307,38 +1307,38 @@ function setReceivedInfo(item, itipItemI
  * @return {calIItemBase}           The stripped item
  */
 function stripUserData(item_) {
   let item = item_.clone();
   let stamp = item.stampTime;
   let lastModified = item.lastModifiedTime;
   item.clearAlarms();
   item.alarmLastAck = null;
-  item.setCategories(0, []);
+  item.setCategories([]);
   item.deleteProperty("RECEIVED-SEQUENCE");
   item.deleteProperty("RECEIVED-DTSTAMP");
   for (let [name] of item.properties) {
     let pname = name;
     if (pname.substr(0, "X-MOZ-".length) == "X-MOZ-") {
       item.deleteProperty(name);
     }
   }
-  item.getAttendees({}).forEach(att => {
+  item.getAttendees().forEach(att => {
     att.deleteProperty("RECEIVED-SEQUENCE");
     att.deleteProperty("RECEIVED-DTSTAMP");
   });
 
   // according to RfC 6638, the following items must not be exposed in client side
   // scheduling messages, so let's remove it if present
   let removeSchedulingParams = aCalUser => {
     aCalUser.deleteProperty("SCHEDULE-AGENT");
     aCalUser.deleteProperty("SCHEDULE-FORCE-SEND");
     aCalUser.deleteProperty("SCHEDULE-STATUS");
   };
-  item.getAttendees({}).forEach(removeSchedulingParams);
+  item.getAttendees().forEach(removeSchedulingParams);
   if (item.organizer) {
     removeSchedulingParams(item.organizer);
   }
 
   item.setProperty("DTSTAMP", stamp);
   item.setProperty("LAST-MODIFIED", lastModified); // need to be last to undirty the item
   return item;
 }
@@ -1356,22 +1356,22 @@ function updateItem(item, itipItemItem) 
    *
    * @param {calIItemBase} newItem        The new item to copy to
    * @param {calIItemBase} oldItem        The old item to copy from
    */
   function updateUserData(newItem, oldItem) {
     // preserve user settings:
     newItem.generation = oldItem.generation;
     newItem.clearAlarms();
-    for (let alarm of oldItem.getAlarms({})) {
+    for (let alarm of oldItem.getAlarms()) {
       newItem.addAlarm(alarm);
     }
     newItem.alarmLastAck = oldItem.alarmLastAck;
-    let cats = oldItem.getCategories({});
-    newItem.setCategories(cats.length, cats);
+    let cats = oldItem.getCategories();
+    newItem.setCategories(cats);
   }
 
   let newItem = item.clone();
   newItem.icalComponent = itipItemItem.icalComponent;
   setReceivedInfo(newItem, itipItemItem);
   updateUserData(newItem, item);
 
   let recInfo = itipItemItem.recurrenceInfo;
@@ -1727,17 +1727,17 @@ ItipItemFinder.prototype = {
                   // the item has been rescheduled with master:
                   itipItemItem = itipItemItem.parentItem;
                 }
               }
 
               switch (method) {
                 case "REFRESH": {
                   // xxx todo test
-                  let attendees = itipItemItem.getAttendees({});
+                  let attendees = itipItemItem.getAttendees();
                   cal.ASSERT(attendees.length == 1, "invalid number of attendees in REFRESH!");
                   if (attendees.length > 0) {
                     let action = function(opListener, partStat, extResponse) {
                       if (!item.organizer) {
                         let org = createOrganizer(item.calendar);
                         if (org) {
                           item = item.clone();
                           item.organizer = org;
@@ -1751,17 +1751,17 @@ ItipItemFinder.prototype = {
                       );
                     };
                     operations.push(action);
                   }
                   break;
                 }
                 case "PUBLISH":
                   cal.ASSERT(
-                    itipItemItem.getAttendees({}).length == 0,
+                    itipItemItem.getAttendees().length == 0,
                     "invalid number of attendees in PUBLISH!"
                   );
                   if (
                     item.calendar.getProperty("itip.disableRevisionChecks") ||
                     calitip.compare(itipItemItem, item) > 0
                   ) {
                     let newItem = updateItem(item, itipItemItem);
                     let action = function(opListener, partStat, extResponse) {
@@ -1842,17 +1842,17 @@ ItipItemFinder.prototype = {
                 }
                 case "DECLINECOUNTER":
                   // nothing to do right now, but once countering is implemented,
                   // we probably need some action here to remove the proposal from
                   // the countering attendee's calendar
                   break;
                 case "COUNTER":
                 case "REPLY": {
-                  let attendees = itipItemItem.getAttendees({});
+                  let attendees = itipItemItem.getAttendees();
                   if (method == "REPLY") {
                     cal.ASSERT(attendees.length == 1, "invalid number of attendees in REPLY!");
                   } else {
                     attendees = cal.itip.getAttendeesBySender(attendees, this.mItipItem.sender);
                     cal.ASSERT(
                       attendees.length == 1,
                       "ambiguous resolution of replying attendee in COUNTER!"
                     );
@@ -1982,17 +1982,17 @@ ItipItemFinder.prototype = {
                 if (att) {
                   att.participationStatus = partStat;
                 } else {
                   cal.ASSERT(att, "no attendee to reply REQUEST!");
                   return null;
                 }
               } else {
                 cal.ASSERT(
-                  itipItemItem.getAttendees({}).length == 0,
+                  itipItemItem.getAttendees().length == 0,
                   "invalid number of attendees in PUBLISH!"
                 );
                 cal.alarms.setDefaultValues(newItem);
               }
               return newItem.calendar.addItem(
                 newItem,
                 method == "REQUEST" ? new ItipOpListener(opListener, null, extResponse) : opListener
               );
--- a/calendar/base/modules/utils/calPrintUtils.jsm
+++ b/calendar/base/modules/utils/calPrintUtils.jsm
@@ -49,17 +49,17 @@ var calprint = {
     itemNode.item = item;
 
     // Fill in details of the item
     let itemInterval = cal.print.getItemIntervalString(item, boxDate);
     itemNode.querySelector(".item-interval").textContent = itemInterval;
     itemNode.querySelector(".item-title").textContent = item.title;
 
     // Fill in category details
-    let categoriesArray = item.getCategories({});
+    let categoriesArray = item.getCategories();
     if (categoriesArray.length > 0) {
       let cssClassesArray = categoriesArray.map(cal.view.formatStringForCSSRule);
       let categoriesBox = itemNode.querySelector(".category-color-box");
       categoriesBox.setAttribute("categories", cssClassesArray.join(" "));
       categoriesBox.style.border = `2px solid var(--category-${cssClassesArray[0]}-color)`;
     }
 
     // Fill in calendar color
--- a/calendar/base/modules/utils/calUnifinderUtils.jsm
+++ b/calendar/base/modules/utils/calUnifinderUtils.jsm
@@ -44,17 +44,17 @@ var calunifinder = {
           return -62168601600000000; // ns value for (0000/00/00 00:00:00)
         }
         return aItem[aKey].nativeTime;
 
       case "percentComplete":
         return aItem.percentComplete;
 
       case "categories":
-        return aItem.getCategories({}).join(", ");
+        return aItem.getCategories().join(", ");
 
       case "location":
         return aItem.getProperty("LOCATION") || "";
 
       case "status": {
         let statusSet = cal.item.isEvent(aItem) ? eventStatus : taskStatus;
         return statusSet.indexOf(aItem.status);
       }
--- a/calendar/base/public/calIAlarm.idl
+++ b/calendar/base/public/calIAlarm.idl
@@ -113,30 +113,28 @@ interface calIAlarm : nsISupports
     attribute AUTF8String summary;
 
     /**
      * Manage Attendee for this alarm. Not valid for AUDIO and DISPLAY alarms.
      */
      void addAttendee(in calIAttendee aAttendee);
      void deleteAttendee(in calIAttendee aAttendee);
      void clearAttendees();
-     void getAttendees(out uint32_t count,
-                       [array,size_is(count),retval] out calIAttendee attendees);
+     Array<calIAttendee> getAttendees();
 
     /**
      * Manage Attachments for this alarm.
      * For EMAIL alarms, more than one attachment can be specified.
      * For AUDIO alarms, one Attachment can be specified.
      * For DISPLAY alarms, attachments are invalid.
      */
      void addAttachment(in calIAttachment aAttachment);
      void deleteAttachment(in calIAttachment aAttachment);
      void clearAttachments();
-     void getAttachments(out uint32_t count,
-                         [array,size_is(count),retval] out calIAttachment attachments);
+     Array<calIAttachment> getAttachments();
 
     /**
      * The human readable representation of this alarm. Uses locale strings.
      *
      * @param aItem     The item to base the string on. Defaults to an event.
      */
     AUTF8String toString([optional] in calIItemBase aItem);
 
--- a/calendar/base/public/calIItemBase.idl
+++ b/calendar/base/public/calIItemBase.idl
@@ -108,20 +108,19 @@ interface calIItemBase : nsISupports
 
   //
   // alarms
   //
 
   /**
    * Get all alarms assigned to this item
    *
-   * @param count       The number of alarms
    * @param aAlarms     The array of calIAlarms
    */
-  void getAlarms(out uint32_t count, [array, size_is(count), retval] out calIAlarm aAlarms);
+  Array<calIAlarm> getAlarms();
 
    /**
    * Add an alarm to the item
    *
    * @param aAlarm      The calIAlarm to add
    */
   void addAlarm(in calIAlarm aAlarm);
 
@@ -255,64 +254,59 @@ interface calIItemBase : nsISupports
   attribute calIAttendee organizer;
 
   //
   // Attendees
   //
 
   // The array returned here is not live; it will not reflect calls to
   // removeAttendee/addAttendee that follow the call to getAttendees.
-  void getAttendees(out uint32_t count,
-                    [array,size_is(count),retval] out calIAttendee attendees);
+  Array<calIAttendee> getAttendees();
 
   /**
    * getAttendeeById's matching is done in a case-insensitive manner to handle
    * places where "MAILTO:" or similar properties are capitalized arbitrarily
    * by different calendar clients.
    */
   calIAttendee getAttendeeById(in AUTF8String id);
   void addAttendee(in calIAttendee attendee);
   void removeAttendee(in calIAttendee attendee);
   void removeAllAttendees();
 
   //
   // Attachments
   //
-  void getAttachments(out uint32_t count,
-                      [array,size_is(count),retval] out calIAttachment attachments);
+  Array<calIAttachment> getAttachments();
   void addAttachment(in calIAttachment attachment);
   void removeAttachment(in calIAttachment attachment);
   void removeAllAttachments();
 
   //
   // Categories
   //
 
   /**
    * Gets the array of categories this item belongs to.
    */
-  void getCategories(out uint32_t aCount,
-                     [array, size_is(aCount), retval] out wstring aCategories);
+  Array<AString> getCategories();
 
   /**
    * Sets the array of categories this item belongs to.
    */
-  void setCategories(in uint32_t aCount,
-                     [array, size_is(aCount)] in wstring aCategories);
+  void setCategories(in Array<AString> aCategories);
 
   //
   // Relations
   //
 
   /**
    * This gives back every relation where the item is neither the owner of the
    * relation nor the referred relation
    */
-  void getRelations(out uint32_t count,
-                    [array,size_is(count),retval] out calIRelation relations);
+  Array<calIRelation> getRelations();
 
   /**
    * Adds a relation to the item
    */
   void addRelation(in calIRelation relation);
 
   /**
    * Removes the relation for this item and the referred item
@@ -326,19 +320,17 @@ interface calIItemBase : nsISupports
 
   // Occurrence querying
   //
 
   /**
    * Return a list of occurrences of this item between the given dates.  The items
    * returned are the same type as this one, as proxies.
    */
-  void getOccurrencesBetween (in calIDateTime aStartDate, in calIDateTime aEndDate,
-                              out uint32_t aCount,
-                              [array,size_is(aCount),retval] out calIItemBase aOccurrences);
+  Array<calIItemBase> getOccurrencesBetween(in calIDateTime aStartDate, in calIDateTime aEndDate);
 
   /**
    * If this item is a proxy or overridden item, parentItem will point upwards
    * to our parent.  Otherwise, it will point to this.
    * parentItem can thus always be used for modifyItem() calls
    * to providers.
    */
   attribute calIItemBase parentItem;
--- a/calendar/base/src/calAlarm.js
+++ b/calendar/base/src/calAlarm.js
@@ -246,24 +246,23 @@ calAlarm.prototype = {
     let alarmDate = this.mAbsoluteDate.clone();
 
     // All Day events are handled as 00:00:00
     alarmDate.isDate = false;
     alarmDate.addDuration(this.mDuration);
     return alarmDate;
   },
 
-  getAttendees: function(aCount) {
+  getAttendees: function() {
     let attendees;
     if (this.action == "AUDIO" || this.action == "DISPLAY") {
       attendees = [];
     } else {
       attendees = this.mAttendees.concat([]);
     }
-    aCount.value = attendees.length;
     return attendees;
   },
 
   addAttendee: function(aAttendee) {
     // Make sure its not duplicate
     this.deleteAttendee(aAttendee);
 
     // Now check if its valid
@@ -284,26 +283,25 @@ calAlarm.prototype = {
       }
     }
   },
 
   clearAttendees: function() {
     this.mAttendees = [];
   },
 
-  getAttachments: function(aCount) {
+  getAttachments: function() {
     let attachments;
     if (this.action == "AUDIO") {
       attachments = this.mAttachments.length ? [this.mAttachments[0]] : [];
     } else if (this.action == "DISPLAY") {
       attachments = [];
     } else {
       attachments = this.mAttachments.concat([]);
     }
-    aCount.value = attachments.length;
     return attachments;
   },
 
   addAttachment: function(aAttachment) {
     // Make sure its not duplicate
     this.deleteAttachment(aAttachment);
 
     // Now check if its valid
@@ -391,29 +389,29 @@ calAlarm.prototype = {
       durationProp.valueAsIcalString = this.repeatOffset.icalString;
 
       comp.addProperty(repeatProp);
       comp.addProperty(durationProp);
     }
 
     // Set up attendees (REQUIRED for EMAIL action)
     /* TODO should we be strict here?
-        if (this.action == "EMAIL" && !this.getAttendees({}).length) {
+        if (this.action == "EMAIL" && !this.getAttendees().length) {
             throw Cr.NS_ERROR_NOT_INITIALIZED;
         } */
-    for (let attendee of this.getAttendees({})) {
+    for (let attendee of this.getAttendees()) {
       comp.addProperty(attendee.icalProperty);
     }
 
     /* TODO should we be strict here?
         if (this.action == "EMAIL" && !this.attachments.length) {
             throw Cr.NS_ERROR_NOT_INITIALIZED;
         } */
 
-    for (let attachment of this.getAttachments({})) {
+    for (let attachment of this.getAttachments()) {
       comp.addProperty(attachment.icalProperty);
     }
 
     // Set up summary (REQUIRED for EMAIL)
     if (this.summary || this.action == "EMAIL") {
       let summaryProp = icssvc.createIcalProperty("SUMMARY");
       // Summary needs to have a non-empty value
       summaryProp.value = this.summary || cal.l10n.getCalString("alarmDefaultSummary");
--- a/calendar/base/src/calAlarmService.js
+++ b/calendar/base/src/calAlarmService.js
@@ -314,17 +314,17 @@ calAlarmService.prototype = {
   addAlarmsForItem: function(aItem) {
     if (cal.item.isToDo(aItem) && aItem.isCompleted) {
       // If this is a task and it is completed, don't add the alarm.
       return;
     }
 
     let showMissed = Services.prefs.getBoolPref("calendar.alarms.showmissed", true);
 
-    let alarms = aItem.getAlarms({});
+    let alarms = aItem.getAlarms();
     for (let alarm of alarms) {
       let alarmDate = cal.alarms.calculateAlarmDate(aItem, alarm);
 
       if (!alarmDate || alarm.action != "DISPLAY") {
         // Only take care of DISPLAY alarms with an alarm date.
         continue;
       }
 
@@ -396,17 +396,17 @@ calAlarmService.prototype = {
       }
     }
   },
 
   removeAlarmsForItem: function(aItem) {
     // make sure already fired alarms are purged out of the alarm window:
     this.mObservers.notify("onRemoveAlarmsByItem", [aItem]);
     // Purge alarms specifically for this item (i.e exception)
-    for (let alarm of aItem.getAlarms({})) {
+    for (let alarm of aItem.getAlarms()) {
       this.removeTimer(aItem, alarm);
     }
   },
 
   getOccurrencesInRange: function(aItem) {
     // We search 1 month in each direction for alarms.  Therefore,
     // we need occurrences between initial start date and 1 month from now
     let until = nowUTC();
--- a/calendar/base/src/calFilter.js
+++ b/calendar/base/src/calFilter.js
@@ -382,17 +382,17 @@ calFilter.prototype = {
     // TODO: Support specifying which fields to search on
     for (let field of ["SUMMARY", "DESCRIPTION", "LOCATION", "URL"]) {
       let val = aItem.getProperty(field);
       if (val && val.toLowerCase().includes(searchText)) {
         return true;
       }
     }
 
-    return aItem.getCategories({}).some(cat => cat.toLowerCase().includes(searchText));
+    return aItem.getCategories().some(cat => cat.toLowerCase().includes(searchText));
   },
 
   /**
    * Checks if the item matches the current filter date range.
    *
    * @param aItem               The item to check.
    * @return                    Returns true if the item falls within the date range
    *                            specified by mStartDate and mEndDate, false otherwise.
@@ -438,17 +438,17 @@ calFilter.prototype = {
     if (result && props.category) {
       let cats = [];
 
       if (typeof props.category == "string") {
         cats.push(props.category);
       } else if (Array.isArray(props.category)) {
         cats = props.category;
       }
-      result = cats.some(cat => aItem.getCategories({}).includes(cat));
+      result = cats.some(cat => aItem.getCategories().includes(cat));
     }
 
     // test the status property. Only applies to tasks.
     if (result && props.status != null && cal.item.isToDo(aItem)) {
       let completed = aItem.isCompleted;
       let current = !aItem.completedDate || today.compare(aItem.completedDate) <= 0;
       let percent = aItem.percentComplete || 0;
 
@@ -847,18 +847,17 @@ calFilter.prototype = {
     ) {
       // either this isn't a repeating item, the occurrence filter specifies that
       // we don't want occurrences, or we have a default occurrence filter with an
       // unbound date range, so we return just the unexpanded item.
       occs = [aItem];
     } else {
       occs = aItem.getOccurrencesBetween(
         this.mStartDate || cal.createDateTime(),
-        this.mEndDate || cal.dtz.now(),
-        {}
+        this.mEndDate || cal.dtz.now()
       );
       if (props.occurrences == props.FILTER_OCCURRENCES_PAST_AND_NEXT && !this.mEndDate) {
         // we have an unbound date range and the occurrence filter specifies
         // that we also want the next matching occurrence if available.
         let next = this.getNextOccurrence(aItem);
         if (next) {
           occs.push(next);
         }
--- a/calendar/base/src/calItemBase.js
+++ b/calendar/base/src/calItemBase.js
@@ -268,17 +268,17 @@ calItemBase.prototype = {
 
     let org = this.organizer;
     if (org) {
       org = org.clone();
     }
     cloned.mOrganizer = org;
 
     cloned.mAttendees = [];
-    for (let att of this.getAttendees({})) {
+    for (let att of this.getAttendees()) {
       cloned.mAttendees.push(att.clone());
     }
 
     cloned.mProperties = new Map();
     for (let [name, value] of this.mProperties.entries()) {
       if (value instanceof Ci.calIDateTime) {
         value = value.clone();
       }
@@ -291,29 +291,29 @@ calItemBase.prototype = {
         for (let param in propBucket) {
           newBucket[param] = propBucket[param];
         }
         cloned.mPropertyParams[name] = newBucket;
       }
     }
 
     cloned.mAttachments = [];
-    for (let att of this.getAttachments({})) {
+    for (let att of this.getAttachments()) {
       cloned.mAttachments.push(att.clone());
     }
 
     cloned.mRelations = [];
-    for (let rel of this.getRelations({})) {
+    for (let rel of this.getRelations()) {
       cloned.mRelations.push(rel.clone());
     }
 
-    cloned.mCategories = this.getCategories({});
+    cloned.mCategories = this.getCategories();
 
     cloned.mAlarms = [];
-    for (let alarm of this.getAlarms({})) {
+    for (let alarm of this.getAlarms()) {
       // Clone alarms into new item, assume the alarms from the old item
       // are valid and don't need validation.
       cloned.mAlarms.push(alarm.clone());
     }
 
     let alarmLastAck = this.alarmLastAck;
     if (alarmLastAck) {
       alarmLastAck = alarmLastAck.clone();
@@ -478,49 +478,47 @@ calItemBase.prototype = {
           value: parameters[paramName],
         };
       },
     };
   },
 
   // void getAttendees(out PRUint32 count,
   //                   [array,size_is(count),retval] out calIAttendee attendees);
-  getAttendees: function(countObj) {
+  getAttendees: function() {
     if (!this.mAttendees && this.mIsProxy) {
-      this.mAttendees = this.mParentItem.getAttendees(countObj);
+      this.mAttendees = this.mParentItem.getAttendees();
     }
     if (this.mAttendees) {
-      countObj.value = this.mAttendees.length;
       return this.mAttendees.concat([]); // clone
     } else {
-      countObj.value = 0;
       return [];
     }
   },
 
   // calIAttendee getAttendeeById(in AUTF8String id);
   getAttendeeById: function(id) {
-    let attendees = this.getAttendees({});
+    let attendees = this.getAttendees();
     let lowerCaseId = id.toLowerCase();
     for (let attendee of attendees) {
       // This match must be case insensitive to deal with differing
       // cases of things like MAILTO:
       if (attendee.id.toLowerCase() == lowerCaseId) {
         return attendee;
       }
     }
     return null;
   },
 
   // void removeAttendee(in calIAttendee attendee);
   removeAttendee: function(attendee) {
     this.modify();
     let found = false,
       newAttendees = [];
-    let attendees = this.getAttendees({});
+    let attendees = this.getAttendees();
     let attIdLowerCase = attendee.id.toLowerCase();
 
     for (let i = 0; i < attendees.length; i++) {
       if (attendees[i].id.toLowerCase() == attIdLowerCase) {
         found = true;
       } else {
         newAttendees.push(attendees[i]);
       }
@@ -569,32 +567,29 @@ calItemBase.prototype = {
                 attendee.toString() +
                 "\n" +
                 cal.STACK(20)
             );
           }
         }
       }
       this.modify();
-      this.mAttendees = this.getAttendees({});
+      this.mAttendees = this.getAttendees();
       this.mAttendees.push(attendee);
     }
   },
 
-  // void getAttachments(out PRUint32 count,
-  //                     [array,size_is(count),retval] out calIAttachment attachments);
-  getAttachments: function(aCount) {
+  // Array<calIAttachment> getAttachments();
+  getAttachments: function() {
     if (!this.mAttachments && this.mIsProxy) {
-      this.mAttachments = this.mParentItem.getAttachments(aCount);
+      this.mAttachments = this.mParentItem.getAttachments();
     }
     if (this.mAttachments) {
-      aCount.value = this.mAttachments.length;
       return this.mAttachments.concat([]); // clone
     } else {
-      aCount.value = 0;
       return [];
     }
   },
 
   // void removeAttachment(in calIAttachment attachment);
   removeAttachment: function(aAttachment) {
     this.modify();
     for (let attIndex in this.mAttachments) {
@@ -604,39 +599,36 @@ calItemBase.prototype = {
         break;
       }
     }
   },
 
   // void addAttachment(in calIAttachment attachment);
   addAttachment: function(attachment) {
     this.modify();
-    this.mAttachments = this.getAttachments({});
+    this.mAttachments = this.getAttachments();
     if (!this.mAttachments.some(x => x.hashId == attachment.hashId)) {
       this.mAttachments.push(attachment);
     }
   },
 
   // void removeAllAttachments();
   removeAllAttachments: function() {
     this.modify();
     this.mAttachments = [];
   },
 
-  // void getRelations(out PRUint32 count,
-  //                   [array,size_is(count),retval] out calIRelation relations);
-  getRelations: function(aCount) {
+  // Array<calIRelation> getRelations();
+  getRelations: function() {
     if (!this.mRelations && this.mIsProxy) {
-      this.mRelations = this.mParentItem.getRelations(aCount);
+      this.mRelations = this.mParentItem.getRelations();
     }
     if (this.mRelations) {
-      aCount.value = this.mRelations.length;
       return this.mRelations.concat([]);
     } else {
-      aCount.value = 0;
       return [];
     }
   },
 
   // void removeRelation(in calIRelation relation);
   removeRelation: function(aRelation) {
     this.modify();
     for (let attIndex in this.mRelations) {
@@ -650,17 +642,17 @@ calItemBase.prototype = {
         break;
       }
     }
   },
 
   // void addRelation(in calIRelation relation);
   addRelation: function(aRelation) {
     this.modify();
-    this.mRelations = this.getRelations({});
+    this.mRelations = this.getRelations();
     this.mRelations.push(aRelation);
     // XXX ensure that the relation isn't already there?
   },
 
   // void removeAllRelations();
   removeAllRelations: function() {
     this.modify();
     this.mRelations = [];
@@ -690,34 +682,30 @@ calItemBase.prototype = {
       return this.mOrganizer;
     }
   },
   set organizer(organizer) {
     this.modify();
     this.mOrganizer = organizer;
   },
 
-  // void getCategories(out PRUint32 aCount,
-  //                    [array, size_is(aCount), retval] out wstring aCategories);
-  getCategories: function(aCount) {
+  // Array<AString> getCategories();
+  getCategories: function() {
     if (!this.mCategories && this.mIsProxy) {
-      this.mCategories = this.mParentItem.getCategories(aCount);
+      this.mCategories = this.mParentItem.getCategories();
     }
     if (this.mCategories) {
-      aCount.value = this.mCategories.length;
       return this.mCategories.concat([]); // clone
     } else {
-      aCount.value = 0;
       return [];
     }
   },
 
-  // void setCategories(in PRUint32 aCount,
-  //                    [array, size_is(aCount)] in wstring aCategories);
-  setCategories: function(aCount, aCategories) {
+  // void setCategories(in Array<AString> aCategories);
+  setCategories: function(aCategories) {
     this.modify();
     this.mCategories = aCategories.concat([]);
   },
 
   // attribute AUTF8String icalString;
   get icalString() {
     throw Cr.NS_ERROR_NOT_IMPLEMENTED;
   },
@@ -963,35 +951,35 @@ calItemBase.prototype = {
 
     this.mapPropsToICS(icalcomp, this.icsBasePropMap);
 
     let org = this.organizer;
     if (org) {
       icalcomp.addProperty(org.icalProperty);
     }
 
-    for (let attendee of this.getAttendees({})) {
+    for (let attendee of this.getAttendees()) {
       icalcomp.addProperty(attendee.icalProperty);
     }
 
-    for (let attachment of this.getAttachments({})) {
+    for (let attachment of this.getAttachments()) {
       icalcomp.addProperty(attachment.icalProperty);
     }
 
-    for (let relation of this.getRelations({})) {
+    for (let relation of this.getRelations()) {
       icalcomp.addProperty(relation.icalProperty);
     }
 
     if (this.mRecurrenceInfo) {
       for (let ritem of this.mRecurrenceInfo.getRecurrenceItems({})) {
         icalcomp.addProperty(ritem.icalProperty);
       }
     }
 
-    for (let cat of this.getCategories({})) {
+    for (let cat of this.getCategories()) {
       let catprop = icssvc.createIcalProperty("CATEGORIES");
       catprop.value = cat;
       icalcomp.addProperty(catprop);
     }
 
     if (this.mAlarms) {
       for (let alarm of this.mAlarms) {
         icalcomp.addSubcomponent(alarm.icalComponent);
@@ -1002,30 +990,24 @@ calItemBase.prototype = {
     if (alarmLastAck) {
       let lastAck = cal.getIcsService().createIcalProperty("X-MOZ-LASTACK");
       // - should we further ensure that those are UTC or rely on calAlarmService doing so?
       lastAck.value = alarmLastAck.icalString;
       icalcomp.addProperty(lastAck);
     }
   },
 
-  // void getAlarms(out PRUint32 count, [array, size_is(count), retval] out calIAlarm aAlarms);
-  getAlarms: function(aCount) {
-    if (typeof aCount != "object") {
-      throw Cr.NS_ERROR_XPC_NEED_OUT_OBJECT;
-    }
-
+  // Array<calIAlarm> getAlarms();
+  getAlarms: function() {
     if (!this.mAlarms && this.mIsProxy) {
-      this.mAlarms = this.mParentItem.getAlarms(aCount);
+      this.mAlarms = this.mParentItem.getAlarms();
     }
     if (this.mAlarms) {
-      aCount.value = this.mAlarms.length;
       return this.mAlarms.concat([]); // clone
     } else {
-      aCount.value = 0;
       return [];
     }
   },
 
   /**
    * Adds an alarm. The second parameter is for internal use only, i.e not
    * provided on the interface.
    *
@@ -1039,52 +1021,48 @@ calItemBase.prototype = {
         // Trigger the icalComponent getter to make sure the alarm is valid.
         aAlarm.icalComponent; // eslint-disable-line no-unused-expressions
       } catch (e) {
         throw Cr.NS_ERROR_INVALID_ARG;
       }
     }
 
     this.modify();
-    this.mAlarms = this.getAlarms({});
+    this.mAlarms = this.getAlarms();
     this.mAlarms.push(aAlarm);
   },
 
   // void deleteAlarm(in calIAlarm aAlarm);
   deleteAlarm: function(aAlarm) {
     this.modify();
-    this.mAlarms = this.getAlarms({});
+    this.mAlarms = this.getAlarms();
     for (let i = 0; i < this.mAlarms.length; i++) {
       if (cal.data.compareObjects(this.mAlarms[i], aAlarm, Ci.calIAlarm)) {
         this.mAlarms.splice(i, 1);
         break;
       }
     }
   },
 
   // void clearAlarms();
   clearAlarms: function() {
     this.modify();
     this.mAlarms = [];
   },
 
-  // void getOccurrencesBetween (in calIDateTime aStartDate, in calIDateTime aEndDate,
-  //                             out PRUint32 aCount,
-  //                             [array,size_is(aCount),retval] out calIItemBase aOccurrences);
-  getOccurrencesBetween: function(aStartDate, aEndDate, aCount) {
+  // Array<calIItemBase> getOccurrencesBetween(in calIDateTime aStartDate, in calIDateTime aEndDate);
+  getOccurrencesBetween: function(aStartDate, aEndDate) {
     if (this.recurrenceInfo) {
-      return this.recurrenceInfo.getOccurrences(aStartDate, aEndDate, 0, aCount);
+      return this.recurrenceInfo.getOccurrences(aStartDate, aEndDate, 0, {});
     }
 
     if (cal.item.checkIfInRange(this, aStartDate, aEndDate)) {
-      aCount.value = 1;
       return [this];
     }
 
-    aCount.value = 0;
     return [];
   },
 };
 
 makeMemberAttr(calItemBase, "CREATED", null, "creationDate", true);
 makeMemberAttr(calItemBase, "SUMMARY", null, "title", true);
 makeMemberAttr(calItemBase, "PRIORITY", 0, "priority", true);
 makeMemberAttr(calItemBase, "CLASS", "PUBLIC", "privacy", true);
--- a/calendar/base/src/calItipItem.js
+++ b/calendar/base/src/calItipItem.js
@@ -104,29 +104,29 @@ calItipItem.prototype = {
       item.deleteProperty("RECEIVED-SEQUENCE");
       item.deleteProperty("RECEIVED-DTSTAMP");
       for (let [name] of item.properties) {
         if (name != "X-MOZ-FAKED-MASTER" && name.substr(0, "X-MOZ-".length) == "X-MOZ-") {
           item.deleteProperty(name);
         }
       }
       // never publish an organizer's RECEIVED params:
-      item.getAttendees({}).forEach(att => {
+      item.getAttendees().forEach(att => {
         att.deleteProperty("RECEIVED-SEQUENCE");
         att.deleteProperty("RECEIVED-DTSTAMP");
       });
 
       // according to RfC 6638, the following items must not be exposed in client side
       // email scheduling messages, so let's remove it if present
       let removeSchedulingParams = aCalUser => {
         aCalUser.deleteProperty("SCHEDULE-AGENT");
         aCalUser.deleteProperty("SCHEDULE-FORCE-SEND");
         aCalUser.deleteProperty("SCHEDULE-STATUS");
       };
-      item.getAttendees({}).forEach(removeSchedulingParams);
+      item.getAttendees().forEach(removeSchedulingParams);
       // we're graceful here as some PUBLISHed events may violate RfC by having no organizer
       if (item.organizer) {
         removeSchedulingParams(item.organizer);
       }
 
       item.setProperty("DTSTAMP", stamp);
       item.setProperty("LAST-MODIFIED", lastModified); // need to be last to undirty the item
     }
--- a/calendar/import-export/calOutlookCSVImportExport.js
+++ b/calendar/import-export/calOutlookCSVImportExport.js
@@ -371,17 +371,17 @@ calOutlookCSVImporter.prototype = {
           if (txt) {
             event.setProperty("DESCRIPTION", txt);
           }
         }
         if ("categoriesIndex" in args) {
           txt = this.parseTextField(eventFields[args.categoriesIndex]);
           if (txt) {
             let categories = cal.category.stringToArray(txt);
-            event.setCategories(categories.length, categories);
+            event.setCategories(categories);
           }
         }
         if ("locationIndex" in args) {
           txt = this.parseTextField(eventFields[args.locationIndex]);
           if (txt) {
             event.setProperty("LOCATION", txt);
           }
         }
@@ -493,24 +493,24 @@ calOutlookCSVExporter.prototype = {
       let line = [];
       line.push(item.title);
       line.push(dateString(item.startDate));
       line.push(timeString(item.startDate));
       line.push(dateString(item.endDate));
       line.push(timeString(item.endDate));
       line.push(item.startDate.isDate ? localeEn.valueTrue : localeEn.valueFalse);
       let alarmDate;
-      let alarms = item.getAlarms({});
+      let alarms = item.getAlarms();
       if (alarms.length) {
         alarmDate = cal.alarms.calculateAlarmDate(item, alarms[0]);
       }
       line.push(alarmDate ? localeEn.valueTrue : localeEn.valueFalse);
       line.push(alarmDate ? dateString(alarmDate) : "");
       line.push(alarmDate ? timeString(alarmDate) : "");
-      line.push(txtString(cal.category.arrayToString(item.getCategories({})))); // xxx todo: what's the correct way to encode ',' in csv?, how are multi-values expressed?
+      line.push(txtString(cal.category.arrayToString(item.getCategories()))); // xxx todo: what's the correct way to encode ',' in csv?, how are multi-values expressed?
       line.push(txtString(item.getProperty("DESCRIPTION")));
       line.push(txtString(item.getProperty("LOCATION")));
       line.push(item.privacy == "PRIVATE" ? localeEn.valueTrue : localeEn.valueFalse);
 
       line = line.map(value => `"${String(value).replace(/"/g, '""')}"`);
       str = line.join(",") + exportLineEnding;
 
       let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(
--- a/calendar/lightning/content/imip-bar.js
+++ b/calendar/lightning/content/imip-bar.js
@@ -356,17 +356,17 @@ var ltnImipBar = {
           onOperationComplete: function(aCalendar, aStatus, aOperationType, aId, aDetail) {
             if (Components.isSuccessCode(aStatus) && isDeclineCounter) {
               // TODO: move the DECLINECOUNTER stuff to actionFunc
               aItipItem.getItemList().forEach(aItem => {
                 // we can rely on the received itipItem to reply at this stage
                 // already, the checks have been done in cal.itip.processFoundItems
                 // when setting up the respective aActionFunc
                 let attendees = cal.itip.getAttendeesBySender(
-                  aItem.getAttendees({}),
+                  aItem.getAttendees(),
                   aItipItem.sender
                 );
                 let status = true;
                 if (
                   attendees.length == 1 &&
                   ltnImipBar.foundItems &&
                   ltnImipBar.foundItems.length
                 ) {
@@ -432,17 +432,17 @@ var ltnImipBar = {
           let proposedRID = proposedItem.getProperty("RECURRENCE-ID");
           if (proposedRID) {
             // if this is a counterproposal for a specific occurrence, we use
             // that to compare with
             item = item.recurrenceInfo.getOccurrenceFor(proposedRID).clone();
           }
           let parsedProposal = ltn.invitation.parseCounter(proposedItem, item);
           let potentialProposers = cal.itip.getAttendeesBySender(
-            proposedItem.getAttendees({}),
+            proposedItem.getAttendees(),
             ltnImipBar.itipItem.sender
           );
           let proposingAttendee = potentialProposers.length == 1 ? potentialProposers[0] : null;
           if (
             proposingAttendee &&
             ["OK", "OUTDATED", "NOTLATESTUPDATE"].includes(parsedProposal.result.type)
           ) {
             counterProposal = {
--- a/calendar/lightning/content/lightning-item-iframe.js
+++ b/calendar/lightning/content/lightning-item-iframe.js
@@ -382,27 +382,27 @@ function onLoad() {
   window.initialStartDateValue = args.initialStartDateValue;
 
   window.attendeeTabLabel = document.getElementById("event-grid-tab-attendees").label;
   window.attachmentTabLabel = document.getElementById("event-grid-tab-attachments").label;
   // we store the array of attendees in the window.
   // clone each existing attendee since we still suffer
   // from the 'lost x-properties'-bug.
   window.attendees = [];
-  let attendees = item.getAttendees({});
+  let attendees = item.getAttendees();
   if (attendees && attendees.length) {
     for (let attendee of attendees) {
       window.attendees.push(attendee.clone());
     }
   }
 
   window.organizer = null;
   if (item.organizer) {
     window.organizer = item.organizer.clone();
-  } else if (item.getAttendees({}).length > 0) {
+  } else if (item.getAttendees().length > 0) {
     // previous versions of calendar may have filled ORGANIZER correctly on overridden instances:
     let orgId = item.calendar.getProperty("organizerId");
     if (orgId) {
       let organizer = cal.createAttendee();
       organizer.id = orgId;
       organizer.commonName = item.calendar.getProperty("organizerCN");
       organizer.role = "REQ-PARTICIPANT";
       organizer.participationStatus = "ACCEPTED";
@@ -658,30 +658,30 @@ function loadDialog(aItem) {
       calendarList.selectedIndex = indexToSelect;
     }
   }
 
   // Categories
   if (gNewItemUI) {
     // XXX more to do here with localization, see loadCategories.
     itemProps.initialCategoriesList = cal.l10n.sortArrayByLocaleCollator(cal.category.fromPrefs());
-    itemProps.initialCategories = aItem.getCategories({});
+    itemProps.initialCategories = aItem.getCategories();
 
     // just to demo capsules component
     itemProps.initialCategories = ["Some", "Demo", "Categories"];
   } else {
     loadCategories(aItem);
   }
 
   // Attachment
   if (!gNewItemUI) {
     loadCloudProviders();
   }
   let hasAttachments = capSupported("attachments");
-  let attachments = aItem.getAttachments({});
+  let attachments = aItem.getAttachments();
   if (gNewItemUI) {
     itemProps.initialAttachments = {};
   }
   if (hasAttachments && attachments && attachments.length > 0) {
     for (let attachment of attachments) {
       if (gNewItemUI) {
         if (
           attachment &&
@@ -781,17 +781,17 @@ function loadDialog(aItem) {
     itemProps.initialRepeatUntilDate = untilDate;
     // XXX more to do, see loadRepeat
   } else {
     loadRepeat(repeatType, untilDate, aItem);
   }
 
   if (!gNewItemUI) {
     // load reminders details
-    loadReminders(aItem.getAlarms({}));
+    loadReminders(aItem.getAlarms());
 
     // Synchronize link-top-image with keep-duration-button status
     let keepAttribute =
       document.getElementById("keepduration-button").getAttribute("keep") == "true";
     setBooleanAttribute("link-image-top", "keep", keepAttribute);
 
     updateDateTime();
 
@@ -904,17 +904,17 @@ function changeUndiscloseCheckboxStatus(
 }
 
 /**
  * Loads the item's categories into the category panel
  *
  * @param aItem     The item to load into the category panel
  */
 function loadCategories(aItem) {
-  let itemCategories = aItem.getCategories({});
+  let itemCategories = aItem.getCategories();
   let categoryList = cal.category.fromPrefs();
   for (let cat of itemCategories) {
     if (!categoryList.includes(cat)) {
       categoryList.push(cat);
     }
   }
   cal.l10n.sortArrayByLocaleCollator(categoryList);
 
@@ -1071,17 +1071,17 @@ function categoryTextboxKeypress(event) 
  * @param aItem     The item to set the categories on
  */
 function saveCategories(aItem) {
   let categoryPopup = document.getElementById("item-categories-popup");
   let categoryList = Array.from(
     categoryPopup.querySelectorAll("menuitem.calendar-category[checked]"),
     cat => cat.getAttribute("label")
   );
-  aItem.setCategories(categoryList.length, categoryList);
+  aItem.setCategories(categoryList);
 }
 
 /**
  * Sets up all date related controls from the passed item
  *
  * @param item      The item to parse information out of.
  */
 function loadDateTime(item) {
--- a/calendar/lightning/modules/ltnInvitationUtils.jsm
+++ b/calendar/lightning/modules/ltnInvitationUtils.jsm
@@ -32,17 +32,17 @@ ltn.invitation = {
           header = cal.l10n.getLtnString("itipRequestBody", [organizerString, summary]);
           break;
         case "CANCEL":
           header = cal.l10n.getLtnString("itipCancelBody", [organizerString, summary]);
           break;
         case "COUNTER":
         // falls through
         case "REPLY": {
-          let attendees = item.getAttendees({});
+          let attendees = item.getAttendees();
           let sender = cal.itip.getAttendeesBySender(attendees, aItipItem.sender);
           if (sender.length == 1) {
             if (aItipItem.responseMethod == "COUNTER") {
               header = cal.l10n.getLtnString("itipCounterBody", [sender[0].toString(), summary]);
             } else {
               let statusString =
                 sender[0].participationStatus == "DECLINED"
                   ? "itipReplyBodyDecline"
@@ -207,26 +207,26 @@ ltn.invitation = {
       .replace("*~*~*~*~*~*~*~*~*~*", "");
     field("description", eventDescription, true);
 
     // URL
     field("url", aEvent.getProperty("URL"), true);
 
     // ATTACH - we only display URI but no BINARY type attachments here
     let links = [];
-    let attachments = aEvent.getAttachments({});
+    let attachments = aEvent.getAttachments();
     for (let attachment of attachments) {
       if (attachment.uri) {
         links.push(attachment.uri.spec);
       }
     }
     field("attachments", links.join("<br>"), true);
 
     // ATTENDEE and ORGANIZER fields
-    let attendees = aEvent.getAttendees({});
+    let attendees = aEvent.getAttendees();
     let attendeeTemplate = doc.getElementById("attendee-template");
     let attendeeTable = doc.getElementById("attendee-table");
     let organizerTable = doc.getElementById("organizer-table");
     doc.getElementById("imipHtml-attendees-row").hidden = attendees.length < 1;
     doc.getElementById("imipHtml-organizer-row").hidden = !aEvent.organizer;
 
     let setupAttendee = function(aAttendee) {
       let row = attendeeTemplate.cloneNode(true);
--- a/calendar/providers/caldav/calDavCalendar.js
+++ b/calendar/providers/caldav/calDavCalendar.js
@@ -2870,17 +2870,17 @@ calDavCalendar.prototype = {
     ) {};
     getItemListener.onGetResult = function(aCalendar, aStatus, aItemType, aDetail, aCount, aItems) {
       let itemToUpdate = aItems[0];
       if (aItem.recurrenceId && itemToUpdate.recurrenceInfo) {
         itemToUpdate = itemToUpdate.recurrenceInfo.getOccurrenceFor(aItem.recurrenceId);
       }
       let newItem = itemToUpdate.clone();
 
-      for (let attendee of aItem.getAttendees({})) {
+      for (let attendee of aItem.getAttendees()) {
         let att = newItem.getAttendeeById(attendee.id);
         if (att) {
           newItem.removeAttendee(att);
           att = att.clone();
           att.participationStatus = attendee.participationStatus;
           newItem.addAttendee(att);
         }
       }
@@ -2992,17 +2992,17 @@ calDavCalendar.prototype = {
       // let's make sure we notify calendar users marked for client-side scheduling by email
       let recipients = [];
       for (let item of aItipItem.getItemList()) {
         if (aItipItem.receivedMethod == "REPLY") {
           if (item.organizer.getProperty("SCHEDULE-AGENT") == "CLIENT") {
             recipients.push(item.organizer);
           }
         } else {
-          let atts = item.getAttendees({}).filter(att => {
+          let atts = item.getAttendees().filter(att => {
             return att.getProperty("SCHEDULE-AGENT") == "CLIENT";
           });
           for (let att of atts) {
             recipients.push(att);
           }
         }
       }
       if (recipients.length) {
--- a/calendar/providers/storage/calStorageCalendar.js
+++ b/calendar/providers/storage/calStorageCalendar.js
@@ -1720,17 +1720,17 @@ calStorageCalendar.prototype = {
 
       let name = row.getResultByName("key");
       switch (name) {
         case "DURATION":
           // for events DTEND/DUE is enforced by calEvent/calTodo, so suppress DURATION:
           break;
         case "CATEGORIES": {
           let cats = cal.category.stringToArray(row.getResultByName("value"));
-          item.setCategories(cats.length, cats);
+          item.setCategories(cats);
           break;
         }
         default:
           item.setProperty(name, row.getResultByName("value"));
           break;
       }
     });
 
@@ -1945,17 +1945,17 @@ calStorageCalendar.prototype = {
         await this.executeAsync(selectItem, row => {
           let name = row.getResultByName("key");
           switch (name) {
             case "DURATION":
               // for events DTEND/DUE is enforced by calEvent/calTodo, so suppress DURATION:
               break;
             case "CATEGORIES": {
               let cats = cal.category.stringToArray(row.getResultByName("value"));
-              item.setCategories(cats.length, cats);
+              item.setCategories(cats);
               break;
             }
             default:
               item.setProperty(name, row.getResultByName("value"));
               break;
           }
         });
       } catch (e) {
@@ -2277,17 +2277,17 @@ calStorageCalendar.prototype = {
     params.bindByName("priority", item.getProperty("PRIORITY"));
     params.bindByName("privacy", item.getProperty("CLASS"));
     params.bindByName("ical_status", item.getProperty("STATUS"));
 
     params.bindByName("alarm_last_ack", item.alarmLastAck && item.alarmLastAck.nativeTime);
   },
 
   prepareAttendees: function(stmts, item, olditem) {
-    let attendees = item.getAttendees({});
+    let attendees = item.getAttendees();
     if (item.organizer) {
       attendees = attendees.concat([]);
       attendees.push(item.organizer);
     }
     if (attendees.length > 0) {
       let array = this.prepareAsyncStatement(stmts, this.mInsertAttendee);
       for (let att of attendees) {
         let params = this.prepareAsyncParams(array);
@@ -2333,17 +2333,17 @@ calStorageCalendar.prototype = {
     for (let [name, value] of item.properties) {
       ret = CAL_ITEM_FLAG.HAS_PROPERTIES;
       if (item.isPropertyPromoted(name)) {
         continue;
       }
       this.prepareProperty(stmts, item, name, value);
     }
 
-    let cats = item.getCategories({});
+    let cats = item.getCategories();
     if (cats.length > 0) {
       ret = CAL_ITEM_FLAG.HAS_PROPERTIES;
       this.prepareProperty(stmts, item, "CATEGORIES", cal.category.arrayToString(cats));
     }
 
     return ret;
   },
 
@@ -2380,51 +2380,51 @@ calStorageCalendar.prototype = {
     } else if (item.recurrenceId && item.recurrenceId.isDate) {
       flags |= CAL_ITEM_FLAG.RECURRENCE_ID_ALLDAY;
     }
 
     return flags;
   },
 
   prepareAttachments: function(stmts, item, olditem) {
-    let attachments = item.getAttachments({});
+    let attachments = item.getAttachments();
     if (attachments && attachments.length > 0) {
       let array = this.prepareAsyncStatement(stmts, this.mInsertAttachment);
       for (let att of attachments) {
         let params = this.prepareAsyncParams(array);
         this.setDateParamHelper(params, "recurrence_id", item.recurrenceId);
         params.bindByName("item_id", item.id);
         params.bindByName("icalString", att.icalString);
 
         array.addParams(params);
       }
       return CAL_ITEM_FLAG.HAS_ATTACHMENTS;
     }
     return 0;
   },
 
   prepareRelations: function(stmts, item, olditem) {
-    let relations = item.getRelations({});
+    let relations = item.getRelations();
     if (relations && relations.length > 0) {
       let array = this.prepareAsyncStatement(stmts, this.mInsertRelation);
       for (let rel of relations) {
         let params = this.prepareAsyncParams(array);
         this.setDateParamHelper(params, "recurrence_id", item.recurrenceId);
         params.bindByName("item_id", item.id);
         params.bindByName("icalString", rel.icalString);
 
         array.addParams(params);
       }
       return CAL_ITEM_FLAG.HAS_RELATIONS;
     }
     return 0;
   },
 
   prepareAlarms: function(stmts, item, olditem) {
-    let alarms = item.getAlarms({});
+    let alarms = item.getAlarms();
     if (alarms.length < 1) {
       return 0;
     }
 
     let array = this.prepareAsyncStatement(stmts, this.mInsertAlarm);
     for (let alarm of alarms) {
       let params = this.prepareAsyncParams(array);
       this.setDateParamHelper(params, "recurrence_id", item.recurrenceId);
--- a/calendar/providers/wcap/calWcapCalendarItems.js
+++ b/calendar/providers/wcap/calWcapCalendarItems.js
@@ -139,17 +139,17 @@ calWcapCalendar.prototype.encodeRecurren
   // or whether to replace the rrule, ambiguous documentation!!!
   // check with store(with no uid) upon adoptItem() which behaves strange
   // if rchange=0 is set!
 };
 
 calWcapCalendar.prototype.getAlarmParams = function(item) {
   let params = null;
   // xxx TODO ALARMSUPPORT check if WCAP supports multiple alarms
-  let alarms = item.getAlarms({}).filter(x => x.action == "EMAIL");
+  let alarms = item.getAlarms().filter(x => x.action == "EMAIL");
   let alarm = alarms.length > 0 && alarms[0];
 
   if (alarm) {
     let alarmStart = cal.alarms.calculateAlarmOffset(item, alarm);
     if (alarm.related == alarm.ALARM_RELATED_END) {
       // cs does not support explicit RELATED=END when
       // both start|entry and end|due are written
       let dur = item.duration;
@@ -205,17 +205,17 @@ calWcapCalendar.prototype.isInvitation =
   let orgCalId = getCalId(item.organizer);
   if (!orgCalId || orgCalId == calId) {
     return false;
   }
   return this.getInvitedAttendee(item) != null;
 };
 
 calWcapCalendar.prototype.getInvitedAttendee = function(item) {
-  let att = getAttendeeByCalId(item.getAttendees({}), this.calId);
+  let att = getAttendeeByCalId(item.getAttendees(), this.calId);
   if (!att) {
     // try to find mail address
     let prefMail = this.session.getUserPreferences("X-NSCP-WCAP-PREF-mail");
     if (prefMail.length > 0 && prefMail[0].length > 0) {
       att = item.getAttendeeById("mailto:" + prefMail[0]);
     }
   }
   return att;
@@ -231,17 +231,17 @@ calWcapCalendar.prototype.canNotify = fu
     case "CANCEL":
       // when creating new items, mind that organizer's id
       return (
         !item.organizer || // might yet not be set
         item.organizer.id == calId || // or is set to raw calId
         getCalId(item.organizer) == calId
       );
     case "REPLY": // only if we we're invited from cs, and find matching X-S1CS-CALID:
-      return getAttendeeByCalId(item.getAttendees({}), calId) != null;
+      return getAttendeeByCalId(item.getAttendees(), calId) != null;
     default:
       return false;
   }
 };
 
 function equalDatetimes(one, two) {
   return (!one && !two) || (one && two && one.isDate == two.isDate && one.compare(two) == 0);
 }
@@ -338,22 +338,22 @@ calWcapCalendar.prototype.storeItem = fu
   let method = METHOD_PUBLISH;
   let bNoSmtpNotify = false;
   let params = "";
 
   let calId = this.calId;
   if (!bAddItem && this.isInvitation(item)) {
     // REPLY
     method = METHOD_REPLY;
-    let att = getAttendeeByCalId(item.getAttendees({}), calId);
+    let att = getAttendeeByCalId(item.getAttendees(), calId);
     if (att) {
       log("attendee: " + att.icalProperty.icalString, this);
       let oldAtt = null;
       if (oldItem) {
-        oldAtt = getAttendeeByCalId(oldItem.getAttendees({}), calId);
+        oldAtt = getAttendeeByCalId(oldItem.getAttendees(), calId);
       }
       if (!oldAtt || att.participationStatus != oldAtt.participationStatus) {
         // REPLY first for just this calendar:
         params +=
           "&attendees=PARTSTAT=" + att.participationStatus + "^" + encodeURIComponent(att.id);
       }
     }
   } else {
@@ -388,17 +388,17 @@ calWcapCalendar.prototype.storeItem = fu
     } else {
       // calITodo
       // xxx todo: dtstart is mandatory for cs, so if this is
       //           undefined, assume an allDay todo???
       dtstart = item.entryDate;
       dtend = item.dueDate;
 
       // cs bug: enforce DUE (set to DTSTART) if alarm is set
-      if (!dtend && item.getAlarms({}).length) {
+      if (!dtend && item.getAlarms().length) {
         dtend = dtstart;
       }
 
       bIsAllDay = dtstart && dtstart.isDate;
       if (
         !oldItem ||
         !identicalDatetimes(dtstart, oldItem.entryDate) ||
         !identicalDatetimes(dtend, oldItem.dueDate)
@@ -424,31 +424,31 @@ calWcapCalendar.prototype.storeItem = fu
     if (!orgCalId) {
       // new events yet don't have X-S1CS-CALID set on ORGANIZER or this is outbound iTIP
       let orgId = getOrgId(item);
       if (!orgId || orgId.toLowerCase().replace(/^mailto:/, "") == this.ownerId.toLowerCase()) {
         orgCalId = calId; // own event
       } // else outbound
     }
 
-    let attendees = item.getAttendees({});
+    let attendees = item.getAttendees();
     if (attendees.length > 0) {
       // xxx todo: why ever, X-S1CS-EMAIL is unsupported though documented for calprops... WTF.
       let attParam = encodeAttendees(attendees);
-      if (!oldItem || attParam != encodeAttendees(oldItem.getAttendees({}))) {
+      if (!oldItem || attParam != encodeAttendees(oldItem.getAttendees())) {
         params += "&attendees=" + attParam;
       }
 
       if (orgCalId == calId) {
         method = METHOD_REQUEST;
       } else {
         method = METHOD_UPDATE;
         bNoSmtpNotify = true;
       }
-    } else if (oldItem && oldItem.getAttendees({}).length > 0) {
+    } else if (oldItem && oldItem.getAttendees().length > 0) {
       // else using just PUBLISH
       params += "&attendees="; // clear attendees
     }
 
     if (orgCalId) {
       if (!oldItem || orgCalId != getCalId(oldItem.organizer)) {
         params += "&orgCalid=" + encodeURIComponent(orgCalId);
       }
@@ -460,19 +460,19 @@ calWcapCalendar.prototype.storeItem = fu
       }
     }
 
     let val = item.title;
     if (!oldItem || val != oldItem.title) {
       params += "&summary=" + encodeURIComponent(val);
     }
 
-    let categories = item.getCategories({});
+    let categories = item.getCategories();
     let catParam = encodeCategories(categories);
-    if (!oldItem || catParam != encodeCategories(oldItem.getCategories({}))) {
+    if (!oldItem || catParam != encodeCategories(oldItem.getCategories())) {
       params += "&categories=" + catParam;
     }
 
     val = diffProperty(item, oldItem, "DESCRIPTION");
     if (val !== null) {
       params += "&desc=" + encodeURIComponent(val);
     }
     val = diffProperty(item, oldItem, "LOCATION");
@@ -642,17 +642,17 @@ calWcapCalendar.prototype.storeItem = fu
 
 calWcapCalendar.prototype.tunnelXProps = function(destItem, srcItem) {
   // xxx todo: temp workaround for bug in calItemBase.js
   if (!isParent(srcItem)) {
     return;
   }
   // tunnel alarm X-MOZ-SNOOZE only if alarm is still set:
   // TODO ALARMSUPPORT still needed when showing alarms as EMAIL for wcap?
-  let hasAlarms = destItem.getAlarms({}).length;
+  let hasAlarms = destItem.getAlarms().length;
   for (let [name, value] of srcItem.properties) {
     try {
       if (name.startsWith("X-MOZ-")) {
         switch (name) {
           // keep snooze stamps for occurrences only and if alarm is still set:
           case "X-MOZ-SNOOZE-TIME":
             if (!hasAlarms) {
               break; // alarm has been reset
--- a/calendar/resources/content/mouseoverPreviews.js
+++ b/calendar/resources/content/mouseoverPreviews.js
@@ -266,17 +266,17 @@ function getPreviewForEvent(aEvent, aIsT
       boxAppendLabeledText(vbox, "tooltipCalName", calendarNameString);
     }
 
     if (event.status && event.status != "NONE") {
       let statusString = getEventStatusString(event);
       boxAppendLabeledText(vbox, "tooltipStatus", statusString);
     }
 
-    if (event.organizer && event.getAttendees({}).length > 0) {
+    if (event.organizer && event.getAttendees().length > 0) {
       let organizer = event.organizer;
       boxAppendLabeledText(vbox, "tooltipOrganizer", organizer);
     }
 
     let description = event.getProperty("DESCRIPTION");
     if (description) {
       boxAppendBodySeparator(vbox);
       // display wrapped description lines, like body of message below headers
--- a/calendar/test/unit/test_alarm.js
+++ b/calendar/test/unit/test_alarm.js
@@ -93,35 +93,35 @@ function test_email_alarm() {
   alarm.offset = cal.createDuration();
 
   // Check for at least one attendee
   let attendee1 = cal.createAttendee();
   attendee1.id = "mailto:horst";
   let attendee2 = cal.createAttendee();
   attendee2.id = "mailto:gustav";
 
-  equal(alarm.getAttendees({}).length, 0);
+  equal(alarm.getAttendees().length, 0);
   alarm.addAttendee(attendee1);
-  equal(alarm.getAttendees({}).length, 1);
+  equal(alarm.getAttendees().length, 1);
   alarm.addAttendee(attendee2);
-  equal(alarm.getAttendees({}).length, 2);
+  equal(alarm.getAttendees().length, 2);
   alarm.addAttendee(attendee1);
-  let addedAttendees = alarm.getAttendees({});
+  let addedAttendees = alarm.getAttendees();
   equal(addedAttendees.length, 2);
   equal(addedAttendees[0], attendee2);
   equal(addedAttendees[1], attendee1);
 
   ok(!!alarm.icalComponent.serializeToICS().match(/mailto:horst/));
   ok(!!alarm.icalComponent.serializeToICS().match(/mailto:gustav/));
 
   alarm.deleteAttendee(attendee1);
-  equal(alarm.getAttendees({}).length, 1);
+  equal(alarm.getAttendees().length, 1);
 
   alarm.clearAttendees();
-  equal(alarm.getAttendees({}).length, 0);
+  equal(alarm.getAttendees().length, 0);
 
   // Make sure attendees are correctly folded/imported
   alarm.icalString = dedent`
         BEGIN:VALARM
         ACTION:EMAIL
         TRIGGER;VALUE=DURATION:-PT5M
         ATTENDEE:mailto:test@example.com
         ATTENDEE:mailto:test@example.com
@@ -166,43 +166,43 @@ function test_audio_alarm() {
   // Test attachments
   let sound = cal.createAttachment();
   sound.uri = Services.io.newURI("file:///sound.wav");
   let sound2 = cal.createAttachment();
   sound2.uri = Services.io.newURI("file:///sound2.wav");
 
   // Adding an attachment should work
   alarm.addAttachment(sound);
-  let addedAttachments = alarm.getAttachments({});
+  let addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 1);
   equal(addedAttachments[0], sound);
   ok(alarm.icalString.includes("ATTACH:file:///sound.wav"));
 
   // Adding twice shouldn't change anything
   alarm.addAttachment(sound);
-  addedAttachments = alarm.getAttachments({});
+  addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 1);
   equal(addedAttachments[0], sound);
 
   try {
     alarm.addAttachment(sound2);
     do_throw("Adding a second attachment should fail for type AUDIO");
   } catch (e) {
     // TODO looks like this test is disabled. Why?
   }
 
   // Deleting should work
   alarm.deleteAttachment(sound);
-  addedAttachments = alarm.getAttachments({});
+  addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 0);
 
   // As well as clearing
   alarm.addAttachment(sound);
   alarm.clearAttachments();
-  addedAttachments = alarm.getAttachments({});
+  addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 0);
 
   // AUDIO alarms should only be allowing one attachment, and folding any with the same value
   alarm.icalString = dedent`
         BEGIN:VALARM
         ACTION:AUDIO
         TRIGGER;VALUE=DURATION:-PT5M
         ATTACH:Basso
@@ -232,50 +232,50 @@ function test_custom_alarm() {
   equal(alarm.summary, "summary");
 
   // Test for attendees
   let attendee1 = cal.createAttendee();
   attendee1.id = "mailto:horst";
   let attendee2 = cal.createAttendee();
   attendee2.id = "mailto:gustav";
 
-  equal(alarm.getAttendees({}).length, 0);
+  equal(alarm.getAttendees().length, 0);
   alarm.addAttendee(attendee1);
-  equal(alarm.getAttendees({}).length, 1);
+  equal(alarm.getAttendees().length, 1);
   alarm.addAttendee(attendee2);
-  equal(alarm.getAttendees({}).length, 2);
+  equal(alarm.getAttendees().length, 2);
   alarm.addAttendee(attendee1);
-  equal(alarm.getAttendees({}).length, 2);
+  equal(alarm.getAttendees().length, 2);
 
   alarm.deleteAttendee(attendee1);
-  equal(alarm.getAttendees({}).length, 1);
+  equal(alarm.getAttendees().length, 1);
 
   alarm.clearAttendees();
-  equal(alarm.getAttendees({}).length, 0);
+  equal(alarm.getAttendees().length, 0);
 
   // Test for attachments
   let attach1 = cal.createAttachment();
   attach1.uri = Services.io.newURI("file:///example.txt");
   let attach2 = cal.createAttachment();
   attach2.uri = Services.io.newURI("file:///example2.txt");
 
   alarm.addAttachment(attach1);
   alarm.addAttachment(attach2);
 
-  let addedAttachments = alarm.getAttachments({});
+  let addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 2);
   equal(addedAttachments[0], attach1);
   equal(addedAttachments[1], attach2);
 
   alarm.deleteAttachment(attach1);
-  addedAttachments = alarm.getAttachments({});
+  addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 1);
 
   alarm.clearAttachments();
-  addedAttachments = alarm.getAttachments({});
+  addedAttachments = alarm.getAttachments();
   equal(addedAttachments.length, 0);
 }
 
 // Check if any combination of REPEAT and DURATION work as expected.
 function test_repeat() {
   dump("Testing REPEAT and DURATION properties...");
   let alarm = cal.createAlarm();
 
--- a/calendar/test/unit/test_alarmutils.js
+++ b/calendar/test/unit/test_alarmutils.js
@@ -12,51 +12,51 @@ function run_test() {
 add_task(async function test_setDefaultValues_events() {
   let item, alarm;
 
   Services.prefs.setIntPref("calendar.alarms.onforevents", 1);
   Services.prefs.setStringPref("calendar.alarms.eventalarmunit", "hours");
   Services.prefs.setIntPref("calendar.alarms.eventalarmlen", 60);
   item = cal.createEvent();
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "DISPLAY");
   equal(alarm.offset.icalString, "-P2DT12H");
 
   Services.prefs.setIntPref("calendar.alarms.onforevents", 1);
   Services.prefs.setStringPref("calendar.alarms.eventalarmunit", "yards");
   Services.prefs.setIntPref("calendar.alarms.eventalarmlen", 20);
   item = cal.createEvent();
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "DISPLAY");
   equal(alarm.offset.icalString, "-PT20M");
 
   Services.prefs.setIntPref("calendar.alarms.onforevents", 0);
   item = cal.createEvent();
   cal.alarms.setDefaultValues(item);
-  equal(item.getAlarms({}).length, 0);
+  equal(item.getAlarms().length, 0);
 
   let mockCalendar = {
     getProperty: function() {
       return ["SHOUT"];
     },
   };
 
   Services.prefs.setIntPref("calendar.alarms.onforevents", 1);
   Services.prefs.setStringPref("calendar.alarms.eventalarmunit", "hours");
   Services.prefs.setIntPref("calendar.alarms.eventalarmlen", 60);
   item = cal.createEvent();
   item.calendar = mockCalendar;
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "SHOUT");
   equal(alarm.offset.icalString, "-P2DT12H");
 
   Services.prefs.clearUserPref("calendar.alarms.onforevents");
   Services.prefs.clearUserPref("calendar.alarms.eventalarmunit");
   Services.prefs.clearUserPref("calendar.alarms.eventalarmlen");
@@ -71,52 +71,52 @@ add_task(async function test_setDefaultV
   };
 
   Services.prefs.setIntPref("calendar.alarms.onfortodos", 1);
   Services.prefs.setStringPref("calendar.alarms.todoalarmunit", "hours");
   Services.prefs.setIntPref("calendar.alarms.todoalarmlen", 60);
   item = cal.createTodo();
   equal(item.entryDate, null);
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "DISPLAY");
   equal(alarm.offset.icalString, "-P2DT12H");
   equal(item.entryDate, nowDate);
 
   Services.prefs.setIntPref("calendar.alarms.onfortodos", 1);
   Services.prefs.setStringPref("calendar.alarms.todoalarmunit", "yards");
   Services.prefs.setIntPref("calendar.alarms.todoalarmlen", 20);
   item = cal.createTodo();
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "DISPLAY");
   equal(alarm.offset.icalString, "-PT20M");
 
   Services.prefs.setIntPref("calendar.alarms.onfortodos", 0);
   item = cal.createTodo();
   cal.alarms.setDefaultValues(item);
-  equal(item.getAlarms({}).length, 0);
+  equal(item.getAlarms().length, 0);
 
   let mockCalendar = {
     getProperty: function() {
       return ["SHOUT"];
     },
   };
 
   Services.prefs.setIntPref("calendar.alarms.onfortodos", 1);
   Services.prefs.setStringPref("calendar.alarms.todoalarmunit", "hours");
   Services.prefs.setIntPref("calendar.alarms.todoalarmlen", 60);
   item = cal.createTodo();
   item.calendar = mockCalendar;
   cal.alarms.setDefaultValues(item);
-  alarm = item.getAlarms({})[0];
+  alarm = item.getAlarms()[0];
   ok(alarm);
   equal(alarm.related, alarm.ALARM_RELATED_START);
   equal(alarm.action, "SHOUT");
   equal(alarm.offset.icalString, "-P2DT12H");
 
   Services.prefs.clearUserPref("calendar.alarms.onfortodos");
   Services.prefs.clearUserPref("calendar.alarms.todoalarmunit");
   Services.prefs.clearUserPref("calendar.alarms.todoalarmlen");
--- a/calendar/test/unit/test_attendee.js
+++ b/calendar/test/unit/test_attendee.js
@@ -6,20 +6,18 @@ function run_test() {
   test_values();
   test_serialize();
   test_properties();
   test_doubleParameters(); // Bug 875739
 }
 
 function test_values() {
   function findAttendeesInResults(event, expectedAttendees) {
-    let countObj = {};
     // Getting all attendees
-    let allAttendees = event.getAttendees(countObj);
-    equal(countObj.value, allAttendees.length);
+    let allAttendees = event.getAttendees();
 
     equal(allAttendees.length, expectedAttendees.length);
 
     // Check if all expected attendees are found
     for (let i = 0; i < expectedAttendees.length; i++) {
       ok(allAttendees.includes(expectedAttendees[i]));
     }
 
@@ -79,18 +77,18 @@ function test_values() {
   attendee1.makeImmutable();
   testImmutability(attendee1, properties);
   // Testing cascaded immutability (event -> attendee)
   event.makeImmutable();
   testImmutability(attendee2, properties);
 
   // Testing cloning
   let eventClone = event.clone();
-  let clonedatts = eventClone.getAttendees({});
-  let atts = event.getAttendees({});
+  let clonedatts = eventClone.getAttendees();
+  let atts = event.getAttendees();
   equal(atts.length, clonedatts.length);
 
   for (let i = 0; i < clonedatts.length; i++) {
     // The attributes should not be equal
     notEqual(atts[i], clonedatts[i]);
     // But the ids should
     equal(atts[i].id, clonedatts[i].id);
   }
@@ -283,13 +281,13 @@ function test_doubleParameters() {
     attendee4: {
       param: ["CN", "PARTSTAT", "X-RECEIVED-DTSTAMP", "X-RECEIVED-SEQUENCE"],
       values: ["CN_attendee4", "ACCEPTED", "20130827T124944Z", "0"],
     },
   };
 
   let event = createEventFromIcalString(ics);
   let organizer = [event.organizer];
-  let attendees = event.getAttendees({});
+  let attendees = event.getAttendees();
 
   testParameters(organizer, expectedOrganizer);
   testParameters(attendees, expectedAttendee);
 }
--- a/calendar/test/unit/test_bug1199942.js
+++ b/calendar/test/unit/test_bug1199942.js
@@ -51,17 +51,17 @@ function serializeEvent_test() {
 
   let expectedIds = [
     "mailto:user2@example.net",
     "mailto:user3@example.net",
     "mailto:user4@example.net",
     "urn:uuid:user5",
   ];
   let event = createEventFromIcalString(ics);
-  let attendees = event.getAttendees({});
+  let attendees = event.getAttendees();
 
   // check whether all attendees get returned with expected id
   for (let attendee of attendees) {
     ok(expectedIds.includes(attendee.id));
   }
 
   // serialize the event again and check whether the attendees still are in shape
   let serializer = Cc["@mozilla.org/calendar/ics-serializer;1"].createInstance(
--- a/calendar/test/unit/test_bug1204255.js
+++ b/calendar/test/unit/test_bug1204255.js
@@ -117,17 +117,17 @@ function test_fromICS() {
     { id: "mailto:user2@example.net", partstat: "NEEDS-ACTION", cname: "PREFIXED" },
     { id: "mailto:user3@example.net", partstat: "NEEDS-ACTION", cname: "NOT PREFIXED" },
     { id: "mailto:user4@example.net", partstat: "ACCEPTED", cname: "PREFIXED" },
     { id: "mailto:user5@example.net", partstat: "TENTATIVE", cname: "NOT PREFIXED" },
     { id: "mailto:user6@example.net", partstat: "DECLINED", cname: "NOT PREFIXED" },
     { id: "mailto:user7@example.net", partstat: "DECLINED", cname: "PREFIXED" },
   ];
   let event = createEventFromIcalString(ics);
-  let attendees = event.getAttendees({});
+  let attendees = event.getAttendees();
 
   // check whether all attendees get returned as expected
   equal(attendees.length, expected.length);
   let count = 0;
   for (let attendee of attendees) {
     for (let exp of expected) {
       if (attendee.id == exp.id) {
         equal(attendee.participationStatus, exp.partstat, "partstat matches for " + exp.id);
--- a/calendar/test/unit/test_bug1209399.js
+++ b/calendar/test/unit/test_bug1209399.js
@@ -98,14 +98,14 @@ function test_fromICS() {
     { id: "mailto:user4@example.net", cname: "" },
     { id: "mailto:user5@example.net", cname: "" },
     { id: "mailto:user6@example.net", cname: null },
     { id: "mailto:user7@example.net", cname: "" },
     { id: "mailto:user8@example.net", cname: "" },
   ];
   let event = createEventFromIcalString(ics);
 
-  equal(event.getAttendees({}).length, expected.length, "Check test consistency");
+  equal(event.getAttendees().length, expected.length, "Check test consistency");
   for (let exp of expected) {
     let attendee = event.getAttendeeById(exp.id);
     equal(attendee.commonName, exp.cname, "Test for commonName matching of " + exp.id);
   }
 }
--- a/calendar/test/unit/test_bug494140.js
+++ b/calendar/test/unit/test_bug494140.js
@@ -26,30 +26,30 @@ add_task(async () => {
       "ACTION:DISPLAY\r\n" +
       "TRIGGER;VALUE=DURATION:-PT10M\r\n" +
       "DESCRIPTION:Mozilla Alarm: Test\r\n" +
       "END:VALARM\r\n" +
       "END:VEVENT"
   );
 
   // There should be one alarm, one relation and one attachment
-  equal(item.getAlarms({}).length, 1);
-  equal(item.getRelations({}).length, 1);
-  equal(item.getAttachments({}).length, 1);
+  equal(item.getAlarms().length, 1);
+  equal(item.getRelations().length, 1);
+  equal(item.getAttachments().length, 1);
 
   // Change the occurrence to another day
   let occ = item.recurrenceInfo.getOccurrenceFor(cal.createDateTime("20090604T073000Z"));
   occ.QueryInterface(Ci.calIEvent);
   occ.startDate = cal.createDateTime("20090618T073000Z");
   item.recurrenceInfo.modifyException(occ, true);
 
   // There should still be one alarm, one relation and one attachment
-  equal(item.getAlarms({}).length, 1);
-  equal(item.getRelations({}).length, 1);
-  equal(item.getAttachments({}).length, 1);
+  equal(item.getAlarms().length, 1);
+  equal(item.getRelations().length, 1);
+  equal(item.getAttachments().length, 1);
 
   // Add the item to the storage calendar and retrieve it again
   await new Promise(resolve => {
     storageCal.adoptItem(item, {
       onGetResult: function() {},
       onOperationComplete: resolve,
     });
   });
@@ -58,12 +58,12 @@ add_task(async () => {
       onGetResult: function(cal, stat, type, detail, count, items) {
         resolve(items[0]);
       },
       onOperationComplete: function() {},
     });
   });
 
   // There should still be one alarm, one relation and one attachment
-  equal(retrievedItem.getAlarms({}).length, 1);
-  equal(retrievedItem.getRelations({}).length, 1);
-  equal(retrievedItem.getAttachments({}).length, 1);
+  equal(retrievedItem.getAlarms().length, 1);
+  equal(retrievedItem.getRelations().length, 1);
+  equal(retrievedItem.getAttachments().length, 1);
 });
--- a/calendar/test/unit/test_items.js
+++ b/calendar/test/unit/test_items.js
@@ -90,71 +90,71 @@ function test_attachment() {
 
   let a = cal.createAttachment();
   a.rawData = "horst";
 
   let b = cal.createAttachment();
   b.rawData = "bruno";
 
   e.addAttachment(a);
-  equal(e.getAttachments({}).length, 1);
+  equal(e.getAttachments().length, 1);
 
   e.addAttachment(b);
-  equal(e.getAttachments({}).length, 2);
+  equal(e.getAttachments().length, 2);
 
   e.removeAttachment(a);
-  equal(e.getAttachments({}).length, 1);
+  equal(e.getAttachments().length, 1);
 
   e.removeAllAttachments();
-  equal(e.getAttachments({}).length, 0);
+  equal(e.getAttachments().length, 0);
 }
 
 function test_attendee() {
   let e = cal.createEvent();
   equal(e.getAttendeeById("unknown"), null);
-  equal(e.getAttendees({}).length, 0);
+  equal(e.getAttendees().length, 0);
 
   let a = cal.createAttendee();
   a.id = "mailto:horst";
 
   let b = cal.createAttendee();
   b.id = "mailto:bruno";
 
   e.addAttendee(a);
-  equal(e.getAttendees({}).length, 1);
+  equal(e.getAttendees().length, 1);
   equal(e.getAttendeeById("mailto:horst"), a);
 
   e.addAttendee(b);
-  equal(e.getAttendees({}).length, 2);
+  equal(e.getAttendees().length, 2);
 
   let comp = e.icalComponent;
   let aprop = comp.getFirstProperty("ATTENDEE");
   equal(aprop.value, "mailto:horst");
   aprop = comp.getNextProperty("ATTENDEE");
   equal(aprop.value, "mailto:bruno");
   equal(comp.getNextProperty("ATTENDEE"), null);
 
   e.removeAttendee(a);
-  equal(e.getAttendees({}).length, 1);
+  equal(e.getAttendees().length, 1);
   equal(e.getAttendeeById("mailto:horst"), null);
 
   e.removeAllAttendees();
-  equal(e.getAttendees({}).length, 0);
+  equal(e.getAttendees().length, 0);
 }
 
 function test_categories() {
   let e = cal.createEvent();
 
-  equal(e.getCategories({}).length, 0);
+  equal(e.getCategories().length, 0);
 
   let cat = ["a", "b", "c"];
-  e.setCategories(3, cat);
+  e.setCategories(cat);
 
   cat[0] = "err";
-  equal(e.getCategories({}).join(","), "a,b,c");
+  equal(e.getCategories().join(","), "a,b,c");
 
   let comp = e.icalComponent;
   let getter = comp.getFirstProperty.bind(comp);
 
   cat[0] = "a";
   while (cat.length) {
     equal(cat.shift(), getter("CATEGORIES").value);
     getter = comp.getNextProperty.bind(comp);
@@ -173,23 +173,23 @@ function test_alarm() {
   let ecomp = e.icalComponent;
   let vcomp = ecomp.getFirstSubcomponent("VALARM");
   equal(vcomp.serializeToICS(), alarm.icalString);
 
   let alarm2 = alarm.clone();
 
   e.addAlarm(alarm2);
 
-  equal(e.getAlarms({}).length, 2);
+  equal(e.getAlarms().length, 2);
   e.deleteAlarm(alarm);
-  equal(e.getAlarms({}).length, 1);
-  equal(e.getAlarms({})[0], alarm2);
+  equal(e.getAlarms().length, 1);
+  equal(e.getAlarms()[0], alarm2);
 
   e.clearAlarms();
-  equal(e.getAlarms({}).length, 0);
+  equal(e.getAlarms().length, 0);
 }
 
 function test_immutable() {
   let event = cal.createEvent();
 
   let date = cal.createDateTime();
   date.timezone = cal.getTimezoneService().getTimezone("Europe/Berlin");
   event.alarmLastAck = date;
@@ -203,17 +203,17 @@ function test_immutable() {
   alarm.description = "foo";
   alarm.related = alarm.ALARM_RELATED_START;
   alarm.offset = cal.createDuration("PT1S");
   event.addAlarm(alarm);
 
   event.setProperty("X-NAME", "X-VALUE");
   event.setPropertyParameter("X-NAME", "X-PARAM", "X-PARAMVAL");
 
-  event.setCategories(3, ["a", "b", "c"]);
+  event.setCategories(["a", "b", "c"]);
 
   equal(event.alarmLastAck.timezone.tzid, cal.dtz.UTC.tzid);
 
   event.makeImmutable();
 
   // call again, should not throw
   event.makeImmutable();
 
@@ -226,17 +226,17 @@ function test_immutable() {
   }, /Can not modify immutable data container/);
   throws(() => {
     event.calendar = null;
   }, /Can not modify immutable data container/);
   throws(() => {
     event.parentItem = null;
   }, /Can not modify immutable data container/);
   throws(() => {
-    event.setCategories(3, ["d", "e", "f"]);
+    event.setCategories(["d", "e", "f"]);
   }, /Can not modify immutable data container/);
 
   let event2 = event.clone();
   event2.organizer.id = "two";
 
   equal(org.id, "one");
   equal(event2.organizer.id, "two");
 
--- a/calendar/test/unit/test_relation.js
+++ b/calendar/test/unit/test_relation.js
@@ -38,49 +38,47 @@ function run_test() {
   // test icalproperty
   // eslint-disable-next-line no-unused-expressions
   relation2.icalProperty;
 
   test_icalprop();
 }
 
 function checkRelations(event, expRel) {
-  let countObj = {};
-  let allRel = event.getRelations(countObj);
-  equal(countObj.value, allRel.length);
+  let allRel = event.getRelations();
   equal(allRel.length, expRel.length);
 
   // check if all expacted relations are found
   for (let i = 0; i < expRel.length; i++) {
     ok(allRel.includes(expRel[i]));
   }
 
   // Check if all found relations are expected
   for (let i = 0; i < allRel.length; i++) {
     ok(expRel.includes(allRel[i]));
   }
 }
 
 function modifyRelations(event, oldRel) {
-  let allRel = event.getRelations({});
+  let allRel = event.getRelations();
   let rel = allRel[0];
 
   // modify the properties
   rel.relType = "SIBLING";
   equal(rel.relType, "SIBLING");
   equal(rel.relType, allRel[0].relType);
 
   // remove one relation
   event.removeRelation(rel);
-  equal(event.getRelations({}).length, oldRel.length - 1);
+  equal(event.getRelations().length, oldRel.length - 1);
 
   // add one relation and remove all relations
   event.addRelation(oldRel[0]);
   event.removeAllRelations();
-  equal(event.getRelations({}), 0);
+  equal(event.getRelations(), 0);
 }
 
 function test_icalprop() {
   let rel = cal.createRelation();
 
   rel.relType = "SIBLING";
   rel.setParameter("X-PROP", "VAL");
   rel.relId = "value";
--- a/calendar/test/unit/test_storage.js
+++ b/calendar/test/unit/test_storage.js
@@ -40,39 +40,39 @@ add_task(async () => {
       found: false,
       onGetResult: function(calendar, status, type, detail, count, items) {
         let item = items[0];
 
         // Check start date
         equal(item.startDate.compare(cal.createDateTime("20120101T010101Z")), 0);
 
         // Check attachment
-        let attaches = item.getAttachments({});
+        let attaches = item.getAttachments();
         let attach = attaches[0];
         equal(attaches.length, 1);
         equal(attach.uri.spec, "http://example.com/test.ics");
         equal(attach.formatType, "text/calendar");
         equal(attach.encoding, "BASE64");
         equal(attach.getParameter("FILENAME"), "test.ics");
 
         // Check attendee
-        let attendees = item.getAttendees({});
+        let attendees = item.getAttendees();
         let attendee = attendees[0];
         equal(attendees.length, 1);
         equal(attendee.id, "mailto:test@example.com");
         equal(attendee.commonName, "Name");
         equal(attendee.rsvp, "TRUE");
         equal(attendee.isOrganizer, false);
         equal(attendee.role, "REQ-PARTICIPANT");
         equal(attendee.participationStatus, "ACCEPTED");
         equal(attendee.userType, "INDIVIDUAL");
         equal(attendee.getProperty("X-THING"), "BAR");
 
         // Check relation
-        let relations = item.getRelations({});
+        let relations = item.getRelations();
         let rel = relations[0];
         equal(relations.length, 1);
         equal(rel.relType, "SIBLING");
         equal(rel.relId, "VALUE");
         equal(rel.getParameter("FOO"), "BAR");
 
         // Check recurrence item
         for (let ritem of item.recurrenceInfo.getRecurrenceItems({})) {