Bug 1234020: Part 2l - [webext] Return promises from the alarms API. r=rpl draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 29 Jan 2016 18:58:29 -0800
changeset 328984 b4496250f1446d69f50e43f88f012824c47c038d
parent 328983 1c167b8bb915f45ac1ced1eef69c2708e3ee2fd5
child 328985 bb467ff2b3df47316edfafe39581d316ffad4d2e
push id10445
push usermaglione.k@gmail.com
push dateThu, 04 Feb 2016 21:38:16 +0000
reviewersrpl
bugs1234020
milestone47.0a1
Bug 1234020: Part 2l - [webext] Return promises from the alarms API. r=rpl
toolkit/components/extensions/ext-alarms.js
--- a/toolkit/components/extensions/ext-alarms.js
+++ b/toolkit/components/extensions/ext-alarms.js
@@ -1,16 +1,15 @@
 "use strict";
 
 var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 var {
   EventManager,
-  runSafe,
 } = ExtensionUtils;
 
 // WeakMap[Extension -> Set[Alarm]]
 var alarmsMap = new WeakMap();
 
 // WeakMap[Extension -> Set[callback]]
 var alarmCallbacksMap = new WeakMap();
 
@@ -109,28 +108,32 @@ extensions.registerPrivilegedAPI("alarms
       get: function(args) {
         let name = "", callback;
         if (args.length == 1) {
           callback = args[0];
         } else {
           [name, callback] = args;
         }
 
-        for (let alarm of alarmsMap.get(extension)) {
-          if (alarm.name == name) {
-            runSafe(context, callback, alarm.data);
-            break;
+        let promise = new Promise((resolve, reject) => {
+          for (let alarm of alarmsMap.get(extension)) {
+            if (alarm.name == name) {
+              return resolve(alarm.data);
+            }
           }
-        }
+          reject("No matching alarm");
+        });
+
+        return context.wrapPromise(promise, callback);
       },
 
       getAll: function(callback) {
         let alarms = alarmsMap.get(extension);
         let result = alarms.map(alarm => alarm.data);
-        runSafe(context, callback, result);
+        return context.wrapPromise(Promise.resolve(result), callback);
       },
 
       clear: function(...args) {
         let name = "", callback;
         if (args.length == 1) {
           callback = args[0];
         } else {
           [name, callback] = args;
@@ -141,31 +144,27 @@ extensions.registerPrivilegedAPI("alarms
         for (let alarm of alarms) {
           if (alarm.name == name) {
             alarm.clear();
             cleared = true;
             break;
           }
         }
 
-        if (callback) {
-          runSafe(context, callback, cleared);
-        }
+        return context.wrapPromise(Promise.resolve(cleared), callback);
       },
 
       clearAll: function(callback) {
         let alarms = alarmsMap.get(extension);
         let cleared = false;
         for (let alarm of alarms) {
           alarm.clear();
           cleared = true;
         }
-        if (callback) {
-          runSafe(context, callback, cleared);
-        }
+        return context.wrapPromise(Promise.resolve(cleared), callback);
       },
 
       onAlarm: new EventManager(context, "alarms.onAlarm", fire => {
         let callback = alarm => {
           fire(alarm.data);
         };
 
         alarmCallbacksMap.get(extension).add(callback);