Bug 1391691 - Make WebDriver:MinimizeWindow idempotent. r=automatedtester draft
authorAndreas Tolfsen <ato@sny.no>
Fri, 18 Aug 2017 18:30:50 +0100
changeset 650447 310a76953028b6a64df55215abb02436d1c84fb7
parent 650446 535872620741ffdd424f1794b355e1f0975ba76c
child 650448 25ec5cfd4c859d0af2493514410579821c28f101
child 650450 6b00586b1aa0e16f335ab730152466051e85fdca
push id75393
push userbmo:ato@sny.no
push dateTue, 22 Aug 2017 11:04:53 +0000
reviewersautomatedtester
bugs1391691
milestone57.0a1
Bug 1391691 - Make WebDriver:MinimizeWindow idempotent. r=automatedtester MozReview-Commit-ID: 4XBw0UFfZ1O
testing/marionette/driver.js
testing/marionette/harness/marionette_harness/tests/unit/test_window_minimize.py
testing/web-platform/meta/MANIFEST.json
testing/web-platform/tests/webdriver/tests/minimize_window.py
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -3013,17 +3013,19 @@ GeckoDriver.prototype.setScreenOrientati
 
   if (!win.screen.mozLockOrientation(mozOr)) {
     throw new WebDriverError(`Unable to set screen orientation: ${or}`);
   }
 };
 
 /**
  * Synchronously minimizes the user agent window as if the user pressed
- * the minimize button, or restores it if it is already minimized.
+ * the minimize button.
+ *
+ * No action is taken if the window is already minimized.
  *
  * Not supported on Fennec.
  *
  * @return {Object.<string, number>}
  *     Window rect and window state.
  *
  * @throws {UnsupportedOperationError}
  *     Not available for current application.
@@ -3032,25 +3034,23 @@ GeckoDriver.prototype.setScreenOrientati
  * @throws {UnexpectedAlertOpenError}
  *     A modal dialog is open, blocking this operation.
  */
 GeckoDriver.prototype.minimizeWindow = async function(cmd, resp) {
   assert.firefox();
   const win = assert.window(this.getCurrentWindow());
   assert.noUserPrompt(this.dialog);
 
-  await new Promise(resolve => {
-    win.addEventListener("sizemodechange", resolve, {once: true});
-
-    if (win.windowState == win.STATE_MINIMIZED) {
-      win.restore();
-    } else {
+  let state = WindowState.from(win.windowState);
+  if (state != WindowState.Minimized) {
+    await new Promise(resolve => {
+      win.addEventListener("sizemodechange", resolve, {once: true});
       win.minimize();
-    }
-  });
+    });
+  }
 
   return this.curBrowser.rect;
 };
 
 /**
  * Synchronously maximizes the user agent window as if the user pressed
  * the maximize button, or restores it if it is already maximized.
  *
--- a/testing/marionette/harness/marionette_harness/tests/unit/test_window_minimize.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_minimize.py
@@ -8,33 +8,29 @@ from marionette_harness import Marionett
 
 class TestWindowMinimize(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
 
         self.original_size = self.marionette.window_size
 
+    def is_minimized(self):
+        return self.marionette.execute_script("return document.hidden", sandbox=None)
+
     def assert_window_minimized(self, resp):
         self.assertEqual("minimized", resp["state"])
 
     def assert_window_restored(self, actual):
         self.assertEqual("normal", actual["state"])
-        self.assertEqual(self.original_size["width"], actual["width"])
-        self.assertEqual(self.original_size["height"], actual["height"])
 
-    def test_minimize_twice_restores(self):
-        resp = self.marionette.minimize_window()
-        self.assert_window_minimized(resp)
-
-        # restore the window
-        resp = self.marionette.minimize_window()
-        self.assert_window_restored(resp)
+    def test_minimize_twice_is_idempotent(self):
+        self.assert_window_minimized(self.marionette.minimize_window())
+        self.assert_window_minimized(self.marionette.minimize_window())
 
     def test_minimize_stress(self):
         for i in range(1, 25):
-            expect_minimized = bool(i % 2)
-
-            resp = self.marionette.minimize_window()
-            if expect_minimized:
+            if self.is_minimized:
+                resp = self.marionette.set_window_rect(width=800, height=600)
+                self.assert_window_restored(resp)
+            else:
+                resp = self.marionette.minimize_window()
                 self.assert_window_minimized(resp)
-            else:
-                self.assert_window_restored(resp)
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -626288,17 +626288,17 @@
    "94b6f474bb4417cf2c06cb5fc6042c01bde98aa2",
    "support"
   ],
   "webdriver/tests/conftest.py": [
    "ab95734024a8e152ed84128eb804344740be91d4",
    "support"
   ],
   "webdriver/tests/contexts/maximize_window.py": [
-   "55cb76c60c7914bc024f470f6d1f0a47294b6fe3",
+   "de49d5d8cc03e863dfe7e29ca8c10678d9b45e83",
    "wdspec"
   ],
   "webdriver/tests/contexts/resizing_and_positioning.py": [
    "479379109115668183643e8a050396219332887d",
    "wdspec"
   ],
   "webdriver/tests/cookies/cookies.py": [
    "e31177e638269864031e44808945fa1e7c46031c",
@@ -626320,29 +626320,29 @@
    "2d4c13edc4e659af864750d0341c06ff969a687f",
    "wdspec"
   ],
   "webdriver/tests/interface.html": [
    "d783d0dd370f58b264ef238d8da5cd8601dc3c7f",
    "testharness"
   ],
   "webdriver/tests/minimize_window.py": [
-   "99fa058dd78c2f3a2d2c34dc7096edb9ca12ac4f",
+   "1702102e8fde6bdae599d73530eaccb739021cfc",
    "wdspec"
   ],
   "webdriver/tests/navigation/current_url.py": [
    "cec2987258d9c807a247da9e0216b3af1f171484",
    "wdspec"
   ],
   "webdriver/tests/navigation/get_title.py": [
    "16bdf435f3d05ceca30394dee6d82adcb64c997b",
    "wdspec"
   ],
   "webdriver/tests/set_window_rect.py": [
-   "89b247aae02cf1aee8c7e4832db424840b66d12d",
+   "39ecd9d8d31f1e099d266ed1fb3877b11bc60b72",
    "wdspec"
   ],
   "webdriver/tests/state/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/state/get_element_attribute.py": [
    "7d531acbe34c1f48f519158f813c5bce88b33259",
@@ -626380,17 +626380,17 @@
    "5a31a3917a5157516c10951a3b3d5ffb43b992d9",
    "support"
   ],
   "webdriver/tests/support/asserts.py": [
    "c6d7303efd64a6a632a1cd1eef10acf1d7de04cd",
    "support"
   ],
   "webdriver/tests/support/fixtures.py": [
-   "055884949ae77f5f1ac49d205c590344606dedfb",
+   "14df244cafec544d0a2e162aa4cd3122791615f3",
    "support"
   ],
   "webdriver/tests/support/http_request.py": [
    "cb40c781fea2280b98135522def5e6a116d7b946",
    "support"
   ],
   "webdriver/tests/support/inline.py": [
    "bc85126e5637145e81f27d037f3a9090747130c8",
--- a/testing/web-platform/tests/webdriver/tests/minimize_window.py
+++ b/testing/web-platform/tests/webdriver/tests/minimize_window.py
@@ -1,56 +1,73 @@
 from tests.support.inline import inline
 from tests.support.asserts import assert_error, assert_success
 
+
 alert_doc = inline("<script>window.alert()</script>")
 
+
+def minimize(session):
+    return session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
+
+
 # 10.7.4 Minimize Window
+
+
 def test_minimize_no_browsing_context(session, create_window):
-    # Step 1
+    # step 1
     session.window_handle = create_window()
     session.close()
-    result = session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
-    assert_error(result, "no such window")
+    response = minimize(session)
+    assert_error(response, "no such window")
 
 
 def test_handle_user_prompt(session):
-    # Step 2
+    # step 2
     session.url = alert_doc
-    result = session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
-    assert_error(result, "unexpected alert open")
+    response = minimize(session)
+    assert_error(response, "unexpected alert open")
 
 
 def test_minimize(session):
-    before_size = session.window.size
     assert session.window.state == "normal"
 
     # step 4
-    result = session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
-    assert_success(result)
+    response = minimize(session)
+    assert_success(response)
 
     assert session.window.state == "minimized"
 
 
 def test_payload(session):
-    before_size = session.window.size
     assert session.window.state == "normal"
 
-    result = session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
+    response = minimize(session)
 
     # step 5
-    assert result.status == 200
-    assert isinstance(result.body["value"], dict)
+    assert response.status == 200
+    assert isinstance(response.body["value"], dict)
 
-    resp = result.body["value"]
-    assert "width" in resp
-    assert "height" in resp
-    assert "x" in resp
-    assert "y" in resp
-    assert "state" in resp
-    assert isinstance(resp["width"], (int, float))
-    assert isinstance(resp["height"], (int, float))
-    assert isinstance(resp["x"], (int, float))
-    assert isinstance(resp["y"], (int, float))
-    assert isinstance(resp["state"], basestring)
+    value = response.body["value"]
+    assert "width" in value
+    assert "height" in value
+    assert "x" in value
+    assert "y" in value
+    assert "state" in value
+    assert isinstance(value["width"], (int, float))
+    assert isinstance(value["height"], (int, float))
+    assert isinstance(value["x"], (int, float))
+    assert isinstance(value["y"], (int, float))
+    assert isinstance(value["state"], basestring)
 
     assert session.window.state == "minimized"
 
+
+def test_minimize_twice_is_idempotent(session):
+    assert session.execute_script("return document.hidden") is False
+
+    first_response = minimize(session)
+    assert_success(first_response)
+    assert session.execute_script("return document.hidden") is True
+
+    second_response = minimize(session)
+    assert_success(second_response)
+    assert session.execute_script("return document.hidden") is True