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
--- 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>