[wdspec] Update tests for "viewport" argument for "browsingContext.setViewport" to check for scrollbar sizes.
Differential Revision: https://phabricator.services.mozilla.com/D205230
bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1878070
gecko-commit: 99d244bc49eb8a6f1528c3331679528dadde4fe1
gecko-reviewers: webdriver-reviewers, whimboo, jdescottes
diff --git a/webdriver/tests/bidi/__init__.py b/webdriver/tests/bidi/__init__.py
index 98b670f..ad1921b 100644
--- a/webdriver/tests/bidi/__init__.py
+++ b/webdriver/tests/bidi/__init__.py
@@ -128,13 +128,21 @@
return remote_mapping_to_dict(result["value"])
-async def get_viewport_dimensions(bidi_session, context: str):
- expression = """
- ({
- height: window.innerHeight || document.documentElement.clientHeight,
- width: window.innerWidth || document.documentElement.clientWidth,
- });
- """
+async def get_viewport_dimensions(bidi_session, context: str, with_scrollbar: bool = True):
+ if with_scrollbar == True:
+ expression = """
+ ({
+ height: window.innerHeight,
+ width: window.innerWidth,
+ });
+ """
+ else:
+ expression = """
+ ({
+ height: document.documentElement.clientHeight,
+ width: document.documentElement.clientWidth,
+ });
+ """
result = await bidi_session.script.evaluate(
expression=expression,
target=ContextTarget(context["context"]),
diff --git a/webdriver/tests/bidi/browsing_context/set_viewport/viewport.py b/webdriver/tests/bidi/browsing_context/set_viewport/viewport.py
index 60f9e47..2e8126b 100644
--- a/webdriver/tests/bidi/browsing_context/set_viewport/viewport.py
+++ b/webdriver/tests/bidi/browsing_context/set_viewport/viewport.py
@@ -184,3 +184,65 @@
)
assert await get_viewport_dimensions(bidi_session, new_tab) == test_viewport
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ "use_horizontal_scrollbar, use_vertical_scrollbar",
+ [
+ (True, False),
+ (False, True),
+ (True, True),
+ ],
+ ids=["horizontal", "vertical", "both"],
+)
+@pytest.mark.parametrize(
+ "doctype",
+ ["html", "html_quirks"],
+ ids=["standard", "quirks"],
+)
+async def test_with_scrollbars(
+ bidi_session,
+ inline,
+ new_tab,
+ use_horizontal_scrollbar,
+ use_vertical_scrollbar,
+ doctype,
+):
+ viewport_dimensions = await get_viewport_dimensions(bidi_session, new_tab)
+
+ width = 100
+ if use_horizontal_scrollbar:
+ width = viewport_dimensions["width"] + 100
+
+ height = 100
+ if use_vertical_scrollbar:
+ height = viewport_dimensions["height"] + 100
+
+ html = f"""<div style="width: {width}px; height: {height}px;">foo</div>"""
+ page_url = inline(html, doctype=doctype)
+
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"], url=page_url, wait="complete"
+ )
+
+ test_viewport = {"width": 499, "height": 599}
+
+ assert await get_viewport_dimensions(bidi_session, new_tab) != test_viewport
+
+ await bidi_session.browsing_context.set_viewport(
+ context=new_tab["context"], viewport=test_viewport
+ )
+
+ assert await get_viewport_dimensions(bidi_session, new_tab) == test_viewport
+
+ viewport_without_scrollbar = await get_viewport_dimensions(
+ bidi_session, new_tab, with_scrollbar=False
+ )
+
+ # The side which has scrollbar takes up space on the other side
+ # (e.g. if we have a horizontal scroll height is going to be smaller than viewport height)
+ if use_horizontal_scrollbar:
+ assert viewport_without_scrollbar["height"] < test_viewport["height"]
+ if use_vertical_scrollbar:
+ assert viewport_without_scrollbar["width"] < test_viewport["width"]
diff --git a/webdriver/tests/support/inline.py b/webdriver/tests/support/inline.py
index ecb2a25..8364e05 100644
--- a/webdriver/tests/support/inline.py
+++ b/webdriver/tests/support/inline.py
@@ -6,6 +6,7 @@
BOILERPLATES = {
"html": "<!doctype html>\n<meta charset={charset}>\n{src}",
+ "html_quirks": "{src}",
"xhtml": """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
@@ -22,6 +23,7 @@
}
MIME_TYPES = {
"html": "text/html",
+ "html_quirks": "text/html",
"xhtml": "application/xhtml+xml",
"xml": "text/xml",
"js": "text/javascript",