bug 1492499: marionette: accept sizemodechange may not always fire; r=automatedtester,whimboo

Unlike the visibilitychange event, sizemodechange appears to fire in a
mostly reliable way.  However, in the off-chance that sizemodechange
should not fire, we need an escape path so that Marionette returns
within a timely fashion.

Depends on D8414

Differential Revision: https://phabricator.services.mozilla.com/D8415

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andreas Tolfsen 2018-11-08 13:11:20 +00:00
parent aeb2acfd24
commit 4caae08c48

View File

@ -58,6 +58,7 @@ const {MarionettePrefs} = ChromeUtils.import("chrome://marionette/content/prefs.
ChromeUtils.import("chrome://marionette/content/proxy.js"); ChromeUtils.import("chrome://marionette/content/proxy.js");
ChromeUtils.import("chrome://marionette/content/reftest.js"); ChromeUtils.import("chrome://marionette/content/reftest.js");
const { const {
DebounceCallback,
IdlePromise, IdlePromise,
PollPromise, PollPromise,
TimedPromise, TimedPromise,
@ -3069,10 +3070,13 @@ GeckoDriver.prototype.maximizeWindow = async function() {
} }
if (WindowState.from(win.windowState) != win.Maximized) { if (WindowState.from(win.windowState) != win.Maximized) {
let cb;
await new TimedPromise(resolve => { await new TimedPromise(resolve => {
win.addEventListener("sizemodechange", resolve, {once: true}); cb = new DebounceCallback(resolve);
win.addEventListener("sizemodechange", cb);
win.maximize(); win.maximize();
}, {throws: null}); }, {throws: null});
win.removeEventListener("sizemodechange", cb);
// Transitioning into a window state is asynchronous on Linux, // Transitioning into a window state is asynchronous on Linux,
// and we cannot rely on sizemodechange to accurately tell us when // and we cannot rely on sizemodechange to accurately tell us when
@ -3128,10 +3132,13 @@ GeckoDriver.prototype.fullscreenWindow = async function() {
} }
if (WindowState.from(win.windowState) != WindowState.Fullscreen) { if (WindowState.from(win.windowState) != WindowState.Fullscreen) {
await new Promise(resolve => { let cb;
win.addEventListener("sizemodechange", resolve, {once: true}); await new TimedPromise(resolve => {
cb = new DebounceCallback(resolve);
win.addEventListener("sizemodechange", cb);
win.fullScreen = true; win.fullScreen = true;
}); }, {throws: null});
win.removeEventListener("sizemodechange", cb);
} }
return this.curBrowser.rect; return this.curBrowser.rect;
@ -3632,18 +3639,14 @@ function getOuterWindowId(win) {
return win.windowUtils.outerWindowID; return win.windowUtils.outerWindowID;
} }
/**
* Exit fullscreen and wait for `window` to resize.
*
* @param {ChromeWindow} window
* Window to exit fullscreen.
*/
async function exitFullscreen(window) { async function exitFullscreen(window) {
await new Promise(resolve => { let cb;
window.addEventListener("sizemodechange", () => resolve(), {once: true}); await new TimedPromise(resolve => {
cb = new DebounceCallback(resolve);
window.addEventListener("sizemodechange", cb);
window.fullScreen = false; window.fullScreen = false;
}); });
await new IdlePromise(window); window.removeEventListener("sizemodechange", cb);
} }
function restoreWindow(window) { function restoreWindow(window) {