Bug 1364389 - Create Window Rect Webdriver Web Platform Tests. r?ato draft
authorDavid Burns <dburns@mozilla.com>
Mon, 22 May 2017 13:17:17 +0100
changeset 619384 ff654c79c609059f7aa02e6a9725347b569bf60c
parent 619251 71df96e65afad583532ff8351b1c1022324507c6
child 619385 4ceeb07cf6b927678610dc6a289ebfd0b56174fe
push id71661
push userbmo:dburns@mozilla.com
push dateTue, 01 Aug 2017 23:09:37 +0000
reviewersato
bugs1364389
milestone56.0a1
Bug 1364389 - Create Window Rect Webdriver Web Platform Tests. r?ato These tests exercise the {Get|Set} Window Rect commands. https://w3c.github.io/webdriver/webdriver-spec.html#get-window-rect https://w3c.github.io/webdriver/webdriver-spec.html#set-window-rect MozReview-Commit-ID: LcMqFzhASQT
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/webdriver/tests/get_window_rect.py.ini
testing/web-platform/meta/webdriver/tests/set_window_rect.py.ini
testing/web-platform/tests/webdriver/tests/get_window_rect.py
testing/web-platform/tests/webdriver/tests/set_window_rect.py
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -402877,22 +402877,34 @@
     ]
    ],
    "webdriver/tests/element_click/select.py": [
     [
      "/webdriver/tests/element_click/select.py",
      {}
     ]
    ],
+   "webdriver/tests/get_window_rect.py": [
+    [
+     "/webdriver/tests/get_window_rect.py",
+     {}
+    ]
+   ],
    "webdriver/tests/navigation.py": [
     [
      "/webdriver/tests/navigation.py",
      {}
     ]
    ],
+   "webdriver/tests/set_window_rect.py": [
+    [
+     "/webdriver/tests/set_window_rect.py",
+     {}
+    ]
+   ],
    "webdriver/tests/window_maximizing.py": [
     [
      "/webdriver/tests/window_maximizing.py",
      {}
     ]
    ]
   }
  },
@@ -491873,17 +491885,17 @@
    "6b3d7b9ae7d5b28510385cccaaade09268409cab",
    "testharness"
   ],
   "css/css-align-3/content-distribution/place-content-shorthand-006.html": [
    "016c2ff7902fc01d8368645b7177e3932aa64d42",
    "testharness"
   ],
   "css/css-align-3/default-alignment/justify-items-legacy-001.html": [
-   "31e799b7f436952f136efbab01f1b648d108b3cc",
+   "bcf17f709a9b87ef728262b658d1dfa65afc93bb",
    "testharness"
   ],
   "css/css-align-3/default-alignment/place-items-shorthand-001.html": [
    "cc69bbbee852e6cd203d3f39dac2a1e05a428361",
    "testharness"
   ],
   "css/css-align-3/default-alignment/place-items-shorthand-002.html": [
    "77bb21f97a9448b03da8b97adc3accf1308eb647",
@@ -588921,17 +588933,17 @@
    "3763f117f8973ca9a994354ccbf22cb7114ece7a",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection-start-end.html": [
    "e38a79075e27780327f49e7ae9cadd2558165eac",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection-value-interactions.html": [
-   "0f93258e5237c49fa24efe5180409e48721e8025",
+   "c568d7fe10cb4c2071b5d38530ad601988a789ea",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection.html": [
    "7f3969423e86313ec20846c84f8deecc95048b82",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
    "f824af3b23cc1d0412783dbcbcbdee818a501d56",
@@ -621665,35 +621677,43 @@
    "a5a1cbce9f0ef66c19065cb8ba761c8fd27cc4ac",
    "support"
   ],
   "webdriver/tests/conftest.py": [
    "ab95734024a8e152ed84128eb804344740be91d4",
    "support"
   ],
   "webdriver/tests/contexts.py": [
-   "9c4be1b08b99945621b149d1aa2aa64167caad50",
+   "479379109115668183643e8a050396219332887d",
    "wdspec"
   ],
   "webdriver/tests/cookies.py": [
    "e31177e638269864031e44808945fa1e7c46031c",
    "wdspec"
   ],
   "webdriver/tests/element_click/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/element_click/select.py": [
    "5ba51b660c7203bba3ada597c2f56fe094358e1f",
    "wdspec"
   ],
+  "webdriver/tests/get_window_rect.py": [
+   "2d4c13edc4e659af864750d0341c06ff969a687f",
+   "wdspec"
+  ],
   "webdriver/tests/navigation.py": [
    "cec2987258d9c807a247da9e0216b3af1f171484",
    "wdspec"
   ],
+  "webdriver/tests/set_window_rect.py": [
+   "8aef7d228fc9c1e8cf1029d8f1f7669602b6e877",
+   "wdspec"
+  ],
   "webdriver/tests/support/__init__.py": [
    "5a31a3917a5157516c10951a3b3d5ffb43b992d9",
    "support"
   ],
   "webdriver/tests/support/asserts.py": [
    "cf1d298a9dc61b07eb9efe1ff3ed98a318d48bc4",
    "support"
   ],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webdriver/tests/get_window_rect.py.ini
@@ -0,0 +1,8 @@
+[get_window_rect.py]
+  type: wdspec
+  [get_window_rect.py::test_get_window_rect_prompt_accept]
+    expected: FAIL
+
+  [get_window_rect.py::test_get_window_rect_handle_prompt_missing_value]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webdriver/tests/set_window_rect.py.ini
@@ -0,0 +1,14 @@
+[set_window_rect.py]
+  type: wdspec
+  [set_window_rect.py::test_set_window_rect_prompt_accept]
+    expected: FAIL
+
+  [set_window_rect.py::test_set_window_rect_handle_prompt_missing_value]
+    expected: FAIL
+
+  [set_window_rect.py::test_set_window_fullscreen]
+    expected: FAIL
+
+  [set_window_rect.py::test_set_window_rect_window_minimized]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/tests/get_window_rect.py
@@ -0,0 +1,85 @@
+from support.asserts import assert_error, assert_dialog_handled, assert_success
+from support.fixtures import create_dialog
+from support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+# 10.7.1 Get Window Rect
+
+def test_get_window_rect_no_browsing_context(session, create_window):
+    # Step 1
+    session.window_handle = create_window()
+    session.close()
+    result = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+
+    assert_error(result, "no such window")
+
+
+def test_get_window_rect_prompt_accept(new_session):
+    # Step 2
+    _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+    session.url = inline("<title>WD doc title</title>")
+
+    create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #1")
+
+    create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #2")
+
+    create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #3")
+
+
+def test_get_window_rect_handle_prompt_missing_value(session, create_dialog):
+    # Step 2
+    session.url = inline("<title>WD doc title</title>")
+    create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #1")
+
+    create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #2")
+
+    create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+    result = session.transport.send("GET",
+                                    "session/%s/window/rect" % session.session_id)
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #3")
+
+
+def test_get_window_rect_payload(session):
+    # step 3
+    result = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+
+    assert result.status == 200
+    assert isinstance(result.body["value"], dict)
+    assert "width" in result.body["value"]
+    assert "height" in result.body["value"]
+    assert "x" in result.body["value"]
+    assert "y" in result.body["value"]
+    assert isinstance(result.body["value"]["width"], (int, float))
+    assert isinstance(result.body["value"]["height"], (int, float))
+    assert isinstance(result.body["value"]["x"], (int, float))
+    assert isinstance(result.body["value"]["y"], (int, float))
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/tests/set_window_rect.py
@@ -0,0 +1,268 @@
+import pytest
+
+from support.inline import inline
+from support.fixtures import create_dialog
+from support.asserts import assert_error, assert_dialog_handled, assert_success
+
+alert_doc = inline("<script>window.alert()</script>")
+
+# 10.7.2 Set Window Rect
+
+def test_set_window_rect_prompt_accept(new_session):
+    # Step 2
+    _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+    session.url = inline("<title>WD doc title</title>")
+
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+
+    create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #1")
+
+    create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #2")
+
+    create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+    assert result.status == 200
+    assert_dialog_handled(session, "dismiss #3")
+
+
+def test_set_window_rect_handle_prompt_missing_value(session, create_dialog):
+    # Step 2
+    get_response = session.transport.send("GET",
+                                          "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+
+    session.url = inline("<title>WD doc title</title>")
+    create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #1")
+
+    create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #2")
+
+    create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["y"]),
+                                     "y": int(original["y"])})
+
+    assert_error(result, "unexpected alert open")
+    assert_dialog_handled(session, "dismiss #3")
+
+
+@pytest.mark.parametrize("data", [
+    {"height": None, "width": None, "x": "a", "y": "b"},
+    {"height": "a", "width": "b", "x": None, "y": None},
+    {"height": None, "width": None, "x": 10.1, "y": 10.1},
+    {"height": 10.1, "width": 10.1, "x": None, "y": None},
+    {"height": True, "width": False, "x": None, "y": None},
+    {"height": None, "width": None, "x": True, "y": False},
+    {"height": [], "width": [], "x": None, "y": None},
+    {"height": None, "width": None, "x": [], "y": []},
+    {"height": [], "width": [], "x": [], "y": []},
+    {"height": {}, "width": {}, "x": None, "y": None},
+    {"height": None, "width": None, "x": {}, "y": {}},
+])
+def test_set_window_rect_invalid_params(session, data):
+    # step 8-9
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    data)
+
+    assert_error(result, "invalid argument")
+
+
+def test_set_window_fullscreen(session):
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+
+    # step 10
+    session.transport.send("POST",
+                           "session/%s/window/fullscreen" % session.session_id)
+    assert session.execute_script("return document.fullscreenElement != null")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"width": 400, "height": 400})
+    assert session.execute_script("return document.fullscreenElement == null")
+    assert_success(result, {"x": original["x"],
+                            "y": original["y"],
+                            "width": 400,
+                            "height": 400})
+
+
+def test_set_window_rect_window_minimized(session):
+    # step 11
+    session.minimize()
+    assert session.execute_script("return document.hidden")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"width": 400, "height": 400})
+    assert not session.execute_script("return document.hidden")
+    assert_success(result, {"width": 400, "height": 400})
+
+
+def test_set_window_height_width(session):
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+
+    # Step 12
+    _max = session.execute_script("""
+        return {
+          width: window.screen.availWidth,
+          height: window.screen.availHeight,
+        }""")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"width": _max["width"] - 100,
+                                     "height": _max["height"] - 100})
+
+    # Step 14
+    assert_success(result, {"x": original["x"], "y": original["y"],
+                            "width": _max["width"] - 100,
+                            "height": _max["height"] - 100})
+
+
+def test_set_window_height_width_larger_than_max(session):
+    # Step 12
+    _max = session.execute_script("""
+        return {
+          width: window.screen.availWidth,
+          height: window.screen.availHeight,
+        }""")
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"width": _max["width"] + 100,
+                                     "height": _max["width"] + 100})
+
+    # Step 14
+    assert result.status == 200
+    assert result.body["value"]["width"] >= _max["width"]
+    assert result.body["value"]["height"] >= _max["height"]
+
+
+def test_set_window_height_width_as_current(session):
+    # Step 12
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"width": int(original["width"]),
+                                     "height": int(original["height"])})
+
+    # Step 14
+    assert_success(result, {"x": original["x"],
+                            "y": original["y"],
+                            "width": original["width"],
+                            "height": original["height"]})
+
+
+def test_set_window_rect_x_y(session):
+    # Step 13
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["x"]) + 10,
+                                     "y": int(original["y"]) + 10})
+    # Step 14
+    assert_success(result, {"x": original["x"] + 10,
+                            "y": original["y"] + 10,
+                            "width": original["width"],
+                            "height": original["height"]})
+
+
+def test_set_window_rect_negative_x_y(session):
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+
+    # Step 13
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": - 8,
+                                     "y": - 8})
+
+    os = session.capabilities["platformName"]
+    # Step 14
+    if os == "linux":
+        # certain WMs prohibit windows from being moved off-screen
+        assert_success(result, {"x": 0, "y": 0,
+                                "width": original["width"],
+                                "height": original["height"]})
+
+    # On macOS, windows can only be moved off the screen on the
+    # horizontal axis.  The system menu bar also blocks windows from
+    # being moved to (0,0).
+    elif os == "darwin":
+        assert_success(result, {"x": -8, "y": 23,
+                                "width": original["width"],
+                                "height": original["height"]})
+
+    # It turns out that Windows is the only platform on which the
+    # window can be reliably positioned off-screen.
+    elif os == "windows_nt":
+        assert_success(result, {"x": -8, "y": -8,
+                                "width": original["width"],
+                                "height": original["height"]})
+
+
+
+def test_set_window_x_y_as_current(session):
+    # Step 13
+    get_response = session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+    original = get_response.body["value"]
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": int(original["x"]),
+                                     "y": int(original["y"])})
+    # Step 14
+    assert_success(result, {"x": original["x"],
+                            "y": original["y"],
+                            "width": original["width"],
+                            "height": original["height"]})
+
+def test_set_window_rect_payload(session):
+    # step 14
+    result = session.transport.send("POST",
+                                    "session/%s/window/rect" % session.session_id,
+                                    {"x": 400,
+                                     "y": 400})
+
+    assert result.status == 200
+    assert isinstance(result.body["value"], dict)
+    assert "width" in result.body["value"]
+    assert "height" in result.body["value"]
+    assert "x" in result.body["value"]
+    assert "y" in result.body["value"]
+    assert isinstance(result.body["value"]["width"], (int, float))
+    assert isinstance(result.body["value"]["height"], (int, float))
+    assert isinstance(result.body["value"]["x"], (int, float))
+    assert isinstance(result.body["value"]["y"], (int, float))