Bug 1249055 - Calling alarms.getAll() throws an exception, r?kmag draft
authorbsilverberg <bsilverberg@mozilla.com>
Thu, 18 Feb 2016 10:12:04 -0500
changeset 331870 5f6f99d23b575ff44d63ff2730e779a0f00aa29a
parent 331542 709f559b5406e8555cf84dd09bdc747b076f142c
child 333428 c30f077424f96b9cb4b804b82719eaa61e9f45e1
push id11105
push userbmo:bob.silverberg@gmail.com
push dateThu, 18 Feb 2016 15:13:14 +0000
reviewerskmag
bugs1249055
milestone47.0a1
Bug 1249055 - Calling alarms.getAll() throws an exception, r?kmag Fix a bug in getAll() Fix a bug in get() Add tests for get(), getAll(), clear() and clearAll() MozReview-Commit-ID: 8ML0F4K3LgM
toolkit/components/extensions/ext-alarms.js
toolkit/components/extensions/test/mochitest/test_ext_alarms.html
--- a/toolkit/components/extensions/ext-alarms.js
+++ b/toolkit/components/extensions/ext-alarms.js
@@ -100,17 +100,17 @@ extensions.registerPrivilegedAPI("alarms
         } else {
           [name, alarmInfo] = args;
         }
 
         let alarm = new Alarm(extension, name, alarmInfo);
         alarmsMap.get(extension).add(alarm);
       },
 
-      get: function(args) {
+      get: function(...args) {
         let name = "", callback;
         if (args.length == 1) {
           callback = args[0];
         } else {
           [name, callback] = args;
         }
 
         let promise = new Promise((resolve, reject) => {
@@ -122,17 +122,17 @@ extensions.registerPrivilegedAPI("alarms
           reject("No matching alarm");
         });
 
         return context.wrapPromise(promise, callback);
       },
 
       getAll: function(callback) {
         let alarms = alarmsMap.get(extension);
-        let result = alarms.map(alarm => alarm.data);
+        let result = Array.from(alarms, alarm => alarm.data);
         return context.wrapPromise(Promise.resolve(result), callback);
       },
 
       clear: function(...args) {
         let name = "", callback;
         if (args.length == 1) {
           callback = args[0];
         } else {
--- a/toolkit/components/extensions/test/mochitest/test_ext_alarms.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_alarms.html
@@ -17,24 +17,23 @@ add_task(function* test_alarm_without_pe
   function backgroundScript() {
     browser.test.log("running alarm script");
 
     browser.test.assertTrue(!browser.alarms,
                             "alarm API should not be available if the alarm permission is not required");
     browser.test.notifyPass("alarms_permission");
   }
 
-  let extensionData = {
-    background: "(" + backgroundScript.toString() + ")()",
+  let extension = ExtensionTestUtils.loadExtension({
+    background: `(${backgroundScript})()`,
     manifest: {
       permissions: [],
     },
-  };
+  });
 
-  let extension = ExtensionTestUtils.loadExtension(extensionData);
   yield extension.startup();
   info("extension loaded");
   yield extension.awaitFinish("alarms_permission");
   yield extension.unload();
   info("extension unloaded");
 });
 
 
@@ -48,24 +47,23 @@ add_task(function* test_alarm_fires() {
       browser.test.notifyPass("alarms");
     });
     chrome.alarms.create(ALARM_NAME, {delayInMinutes: 0.02});
     setTimeout(() => {
       browser.test.notifyFail("alarms test failed, took too long");
     }, 10000);
   }
 
-  let extensionData = {
-    background: "(" + backgroundScript.toString() + ")()",
+  let extension = ExtensionTestUtils.loadExtension({
+    background: `(${backgroundScript})()`,
     manifest: {
       permissions: ["alarms"],
     },
-  };
+  });
 
-  let extension = ExtensionTestUtils.loadExtension(extensionData);
   yield extension.startup();
   info("extension loaded");
   yield extension.awaitFinish("alarms");
   yield extension.unload();
   info("extension unloaded");
 });
 
 
@@ -88,27 +86,96 @@ add_task(function* test_periodic_alarm_f
     setTimeout(() => {
       browser.test.notifyFail("alarms test failed, took too long");
       chrome.alarms.clear(ALARM_NAME, (wasCleared) => {
         browser.test.assertTrue(wasCleared, "alarm should be cleared");
       });
     }, 30000);
   }
 
-  let extensionData = {
-    background: "(" + backgroundScript.toString() + ")()",
+  let extension = ExtensionTestUtils.loadExtension({
+    background: `(${backgroundScript})()`,
     manifest: {
       permissions: ["alarms"],
     },
-  };
+  });
 
-  let extension = ExtensionTestUtils.loadExtension(extensionData);
   yield extension.startup();
   info("extension loaded");
   yield extension.awaitFinish("alarms");
   yield extension.unload();
   info("extension unloaded");
 });
 
+
+add_task(function* test_get_get_all_clear_all_alarms() {
+  function backgroundScript() {
+    const ALARM_NAME = "test_alarm";
+
+    let suffixes = [0, 1, 2];
+
+    suffixes.forEach(suffix => {
+      chrome.alarms.create(ALARM_NAME + suffix, {when: Date.now() + (suffix + 1) * 10000});
+    });
+
+    chrome.alarms.getAll(alarms => {
+      browser.test.assertEq(suffixes.length, alarms.length);
+      alarms.forEach((alarm, index) => {
+        browser.test.assertEq(ALARM_NAME + index, alarm.name, "expected alarm returned");
+      });
+
+      suffixes.forEach(suffix => {
+        chrome.alarms.get(ALARM_NAME + suffix, alarm => {
+          browser.test.assertEq(ALARM_NAME + suffix, alarm.name, "expected alarm returned");
+          browser.test.sendMessage(`get-${suffix}`);
+        });
+      });
+
+      chrome.alarms.clear(ALARM_NAME + suffixes[0], wasCleared => {
+        browser.test.assertTrue(wasCleared, "alarm was cleared");
+        chrome.alarms.getAll(alarms => {
+          browser.test.assertEq(2, alarms.length, "alarm was removed");
+        });
+
+        chrome.alarms.get(ALARM_NAME + suffixes[0], alarm => {
+          browser.test.assertEq(undefined, alarm, "non-existent alarm should be undefined");
+          browser.test.sendMessage(`get-invalid`);
+        });
+
+        chrome.alarms.clearAll(wasCleared => {
+          browser.test.assertTrue(wasCleared, "alarms were cleared");
+          chrome.alarms.getAll(alarms => {
+            browser.test.assertEq(0, alarms.length, "no alarms exist");
+          });
+          browser.test.sendMessage("clearAll");
+        });
+
+        browser.test.sendMessage("clear");
+      });
+
+      browser.test.sendMessage("getAll");
+    });
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    background: `(${backgroundScript})()`,
+    manifest: {
+      permissions: ["alarms"],
+    },
+  });
+
+  yield Promise.all([
+    extension.startup(),
+    extension.awaitMessage("getAll"),
+    extension.awaitMessage("get-0"),
+    extension.awaitMessage("get-1"),
+    extension.awaitMessage("get-2"),
+    extension.awaitMessage("clear"),
+    extension.awaitMessage("get-invalid"),
+    extension.awaitMessage("clearAll"),
+  ]);
+  yield extension.unload();
+});
+
 </script>
 
 </body>
 </html>