diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 356e059a3710..3783d355aa08 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -2419,17 +2419,44 @@ GeckoDriver.prototype.getWindowSize = function (cmd, resp) { /** * 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.} + * 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, + }; }; /**