Bug 1319237 - Make GeckoDriver#setWindowSize synchronous; r=automatedtester,maja_zf
Return from the Set Window Size command only after the window resize
DOM event has occurred.
MozReview-Commit-ID: 7ygZuNJZzq2
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -2414,27 +2414,54 @@ GeckoDriver.prototype.getWindowSize = fu
width: win.outerWidth,
height: win.outerHeight,
};
};
/**
* Set the size of the browser window currently in focus.
*
- * Not supported on B2G. The supplied width and height values refer to
- * the window outerWidth and outerHeight values, which include scroll
- * bars, title bars, etc.
+ * The supplied width and height values refer to the window outerWidth
+ * and outerHeight values, which include browser chrome and OS-level
+ * window borders.
+ *
+ * @param {number} width
+ * Requested window outer width.
+ * @param {number} height
+ * Requested window outer height.
+ *
+ * @return {Map.<string, number>}
+ * New outerWidth/outerHeight dimensions.
*/
-GeckoDriver.prototype.setWindowSize = function (cmd, resp) {
+GeckoDriver.prototype.setWindowSize = function* (cmd, resp) {
assert.firefox()
- let {width, height} = cmd.parameters;
- let win = this.getCurrentWindow();
- win.resizeTo(width, height);
- this.getWindowSize(cmd, resp);
+ const {width, height} = cmd.parameters;
+ const win = this.getCurrentWindow();
+
+ yield new Promise(resolve => {
+ // When the DOM resize event claims that it fires _after_ the document
+ // view has been resized, it is lying.
+ //
+ // Because resize events fire at a high rate, DOM modifications
+ // such as updates to outerWidth/outerHeight are not guaranteed to
+ // have processed. To overcome this... abomination... of the web
+ // platform, we throttle the event using setTimeout. If everything
+ // was well in this world we would use requestAnimationFrame, but
+ // it does not seem to like our particular flavour of XUL.
+ const fps15 = 66;
+ const synchronousResize = () => win.setTimeout(resolve, fps15);
+ win.addEventListener("resize", synchronousResize, {once: true});
+ win.resizeTo(width, height);
+ });
+
+ return {
+ width: win.outerWidth,
+ height: win.outerHeight,
+ };
};
/**
* Maximizes the user agent window as if the user pressed the maximise
* button.
*
* Not Supported on B2G or Fennec.
*/