Bug 1359053 - Reject interaction.flushEventLoop if window is discarded; r?maja_zf draft
authorAndreas Tolfsen <ato@mozilla.com>
Mon, 17 Apr 2017 18:42:18 +0100
changeset 567140 045a9bb1c09cc997faec760165572854b82844ac
parent 567113 e17cbb839dd225a2da7e5d5bec43cf94e11749d8
child 625543 9a7222ac12b18597ef963bd8dfdcadd0100d6d15
push id55463
push userbmo:ato@mozilla.com
push dateMon, 24 Apr 2017 13:34:16 +0000
reviewersmaja_zf
bugs1359053
milestone55.0a1
Bug 1359053 - Reject interaction.flushEventLoop if window is discarded; r?maja_zf The window reference may have been discarded as a result of interaction. For example, this may happen when clicking a button that deletes the host <iframe> element containing the child window. In this case, the WindowProxy will set its closed property to true, to indicate that the browsing context has been discarded. We only want to flush the event loop of windows that exist, and so we return early from interaction.flushEventLoop if the window has been closed. MozReview-Commit-ID: LtTHQRudKvk
testing/marionette/interaction.js
--- a/testing/marionette/interaction.js
+++ b/testing/marionette/interaction.js
@@ -286,23 +286,30 @@ interaction.selectOption = function (el)
  * If the document is unloaded during this request, the promise is
  * rejected.
  *
  * @param {Window} win
  *     Associated window.
  *
  * @return {Promise}
  *     Promise is accepted once event queue is flushed, or rejected if
- *     |win| is unloaded before the queue can be flushed.
+ *     |win| has closed or been unloaded before the queue can be flushed.
  */
 interaction.flushEventLoop = function* (win) {
   let unloadEv;
+
   return new Promise((resolve, reject) => {
+    if (win.closed) {
+      reject();
+      return;
+    }
+
     unloadEv = reject;
     win.addEventListener("unload", unloadEv, {once: true});
+
     win.requestAnimationFrame(resolve);
   }).then(() => {
     win.removeEventListener("unload", unloadEv);
   });
 };
 
 /**
  * Appends |path| to an <input type=file>'s file list.