Bug 1356231 - Use native promises instead of devtools promises. r=Mossop draft
authorAlexandre Poirot <poirot.alex@gmail.com>
Tue, 25 Apr 2017 16:59:18 +0200
changeset 568520 833a0e6c138ee6d3c6a53be825cc597b931a42e0
parent 568519 136123eff5c86912ebe4af778cb674a33fae87d3
child 568521 a15053d74aaf82074e00674b0469228f7cd6d1fa
push id55886
push userbmo:poirot.alex@gmail.com
push dateWed, 26 Apr 2017 08:10:38 +0000
reviewersMossop
bugs1356231
milestone55.0a1
Bug 1356231 - Use native promises instead of devtools promises. r=Mossop MozReview-Commit-ID: 9sLPnyHIGrC
toolkit/modules/EventEmitter.jsm
--- a/toolkit/modules/EventEmitter.jsm
+++ b/toolkit/modules/EventEmitter.jsm
@@ -40,18 +40,16 @@
     this.isWorker = false;
     const Cu = Components.utils;
     let console = Cu.import("resource://gre/modules/Console.jsm", {}).console;
     // Bug 1259045: This module is loaded early in firefox startup as a JSM,
     // but it doesn't depends on any real module. We can save a few cycles
     // and bytes by not loading Loader.jsm.
     let require = function(module) {
       switch (module) {
-        case "devtools/shared/defer":
-          return Cu.import("resource://gre/modules/Promise.jsm", {}).Promise.defer;
         case "Services":
           return Cu.import("resource://gre/modules/Services.jsm", {}).Services;
         case "devtools/shared/platform/stack": {
           let obj = {};
           Cu.import("resource://devtools/shared/platform/chrome/stack.js", obj);
           return obj;
         }
       }
@@ -64,17 +62,16 @@
   // ⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠
   // After this point the code may not use Cu.import, and should only
   // require() modules that are "clean-for-content".
   let EventEmitter = this.EventEmitter = function() {};
   module.exports = EventEmitter;
 
   // See comment in JSM module boilerplate when adding a new dependency.
   const Services = require("Services");
-  const defer = require("devtools/shared/defer");
   let loggingEnabled = true;
 
   if (!isWorker) {
     loggingEnabled = Services.prefs.getBoolPref("devtools.dump.emit");
     Services.prefs.addObserver("devtools.dump.emit", {
       observe: () => {
         loggingEnabled = Services.prefs.getBoolPref("devtools.dump.emit");
       }
@@ -143,30 +140,28 @@
      *        one time.
      * @return promise
      *        A promise which is resolved when the event next happens. The
      *        resolution value of the promise is the first event argument. If
      *        you need access to second or subsequent event arguments (it's rare
      *        that this is needed) then use listener
      */
     once(event, listener) {
-      let deferred = defer();
+      return new Promise(resolve => {
+        let handler = (_, first, ...rest) => {
+          this.off(event, handler);
+          if (listener) {
+            listener(event, first, ...rest);
+          }
+          resolve(first);
+        };
 
-      let handler = (_, first, ...rest) => {
-        this.off(event, handler);
-        if (listener) {
-          listener(event, first, ...rest);
-        }
-        deferred.resolve(first);
-      };
-
-      handler._originalListener = listener;
-      this.on(event, handler);
-
-      return deferred.promise;
+        handler._originalListener = listener;
+        this.on(event, handler);
+      });
     },
 
     /**
      * Remove a previously-registered event listener.  Works for events
      * registered with either on or once.
      *
      * @param string event
      *        The event name whose listener we're disconnecting.