Bug 1307015 - Use addEventListener(..., { once: true }). r=felipe draft
authorBlake Kaplan <mrbkap@gmail.com>
Fri, 17 Feb 2017 15:30:49 -0800
changeset 486470 d10241bb93ca8f3105e0b005dfc8dba1def8a0c3
parent 484998 e9b926463f9ea76b836ebecd824506e1febee19e
child 486471 2b4868714ef405e1f179f0d3bfc395b1cecd5d72
push id45990
push userbmo:mrbkap@mozilla.com
push dateFri, 17 Feb 2017 23:36:54 +0000
reviewersfelipe
bugs1307015
milestone54.0a1
Bug 1307015 - Use addEventListener(..., { once: true }). r=felipe I didn't realize this existed! This lets us simplify some things. MozReview-Commit-ID: 8KwFLaHqi3v
testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
--- a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
+++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
@@ -606,32 +606,26 @@ this.BrowserTestUtils = {
    *       will cause the returned promise to be rejected instead of waiting for
    *       the next event, since this is probably a bug in the test.
    *
    * @returns {Promise}
    * @resolves The Event object.
    */
   waitForEvent(subject, eventName, capture, checkFn, wantsUntrusted) {
     return new Promise((resolve, reject) => {
-      subject.addEventListener(eventName, function listener(event) {
+      subject.addEventListener(eventName, (event) => {
         try {
           if (checkFn && !checkFn(event)) {
             return;
           }
-          subject.removeEventListener(eventName, listener, capture);
           resolve(event);
         } catch (ex) {
-          try {
-            subject.removeEventListener(eventName, listener, capture);
-          } catch (ex2) {
-            // Maybe the provided object does not support removeEventListener.
-          }
           reject(ex);
         }
-      }, capture, wantsUntrusted);
+      }, { capture, once: true }, wantsUntrusted);
     });
   },
 
   /**
    * Like waitForEvent, but adds the event listener to the message manager
    * global for browser.
    *
    * @param {string} eventName
@@ -670,19 +664,18 @@ this.BrowserTestUtils = {
               let completion = resolve;
               try {
                 if (checkFn && !checkFn(event)) {
                   return;
                 }
               } catch (e) {
                 completion = () => reject(e);
               }
-              removeEventListener(eventName, listener, capture);
               completion();
-            }, capture, wantsUntrusted);
+            }, { capture, once: true }, wantsUntrusted);
           });
         });
   },
 
   /**
    * Like browserLoaded, but waits for an error page to appear.
    * This explicitly deals with cases where the browser is not currently remote and a
    * remoteness switch will occur before the error page is loaded, which is tricky