--- 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/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))