Skip to content

Commit 627d506

Browse files
sadym-chromiummertcanaltin
authored andcommitted
[wdspec] tests for emulation.setUserAgentOverride command (web-platform-tests#54810)
Additionally to the usual tests, I added tests for setting simultaneous emulation per context, user agent and globally. Also `webdriver/tests/support/http_handlers/echo.py` was introduced to accurately represent the actual headers was sent. Required to avoid dependency on `Network` module.
1 parent fd44dc5 commit 627d506

File tree

9 files changed

+629
-0
lines changed

9 files changed

+629
-0
lines changed

tools/webdriver/webdriver/bidi/modules/emulation.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,16 @@ def set_timezone_override(
119119
params["userContexts"] = user_contexts
120120

121121
return params
122+
123+
@command
124+
def set_user_agent_override(
125+
self,
126+
user_agent: Union[str, None],
127+
contexts: Union[List[str], Undefined] = UNDEFINED,
128+
user_contexts: Union[List[str], Undefined] = UNDEFINED,
129+
) -> Mapping[str, Any]:
130+
return {
131+
"userAgent": user_agent,
132+
"contexts": contexts,
133+
"userContexts": user_contexts,
134+
}

webdriver/tests/bidi/emulation/set_user_agent_override/__init__.py

Whitespace-only changes.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import json
2+
3+
import pytest_asyncio
4+
5+
from webdriver.bidi.modules.script import ContextTarget
6+
7+
8+
@pytest_asyncio.fixture
9+
async def default_user_agent(top_context, get_navigator_user_agent):
10+
return await get_navigator_user_agent(top_context)
11+
12+
13+
@pytest_asyncio.fixture
14+
async def get_navigator_user_agent(bidi_session):
15+
async def get_navigator_user_agent(context):
16+
result = await bidi_session.script.evaluate(
17+
expression="window.navigator.userAgent",
18+
target=ContextTarget(context["context"]),
19+
await_promise=False,
20+
)
21+
22+
return result["value"]
23+
24+
return get_navigator_user_agent
25+
26+
27+
@pytest_asyncio.fixture
28+
async def assert_navigation_user_agent(bidi_session, url):
29+
"""
30+
Helper to assert the right `user-agent` header sent in navigation request.
31+
"""
32+
33+
async def assert_navigation_user_agent(context, expected_user_agent):
34+
echo_link = url("webdriver/tests/support/http_handlers/headers_echo.py")
35+
await bidi_session.browsing_context.navigate(context=context["context"],
36+
url=echo_link,
37+
wait="complete")
38+
39+
result = await bidi_session.script.evaluate(
40+
expression="window.document.body.textContent",
41+
target=ContextTarget(context["context"]),
42+
await_promise=False,
43+
)
44+
45+
headers = (json.JSONDecoder().decode(result["value"]))["headers"]
46+
user_agent = headers["user-agent"][0]
47+
48+
assert user_agent == expected_user_agent, \
49+
f"Navigation expected to send user agent '{expected_user_agent}' but sent '{user_agent}'"
50+
51+
return assert_navigation_user_agent
52+
53+
54+
@pytest_asyncio.fixture
55+
async def assert_fetch_user_agent(bidi_session, url):
56+
"""
57+
Helper to assert the right `user-agent` header sent in fetch.
58+
"""
59+
60+
async def assert_navigation_user_agent(context, expected_user_agent):
61+
echo_link = url("webdriver/tests/support/http_handlers/headers_echo.py")
62+
await bidi_session.browsing_context.navigate(context=context["context"],
63+
url=echo_link,
64+
wait="complete")
65+
66+
result = await bidi_session.script.evaluate(
67+
expression=f"fetch('{echo_link}').then(r => r.text())",
68+
target=ContextTarget(context["context"]),
69+
await_promise=True,
70+
)
71+
72+
headers = (json.JSONDecoder().decode(result["value"]))["headers"]
73+
user_agent = headers["user-agent"][0]
74+
75+
assert user_agent == expected_user_agent, \
76+
f"Fetch expected to send user agent '{expected_user_agent}' but sent '{user_agent}'"
77+
78+
return assert_navigation_user_agent
79+
80+
81+
@pytest_asyncio.fixture
82+
async def assert_user_agent(get_navigator_user_agent,
83+
assert_navigation_user_agent, assert_fetch_user_agent):
84+
"""
85+
Helper to assert the right `user-agent` returned by navigator and sent in
86+
navigation and fetch.
87+
"""
88+
89+
async def assert_user_agent(context, expected_user_agent):
90+
assert await get_navigator_user_agent(context) == expected_user_agent, \
91+
"window.navigator.userAgent should be expected"
92+
await assert_navigation_user_agent(context, expected_user_agent)
93+
await assert_fetch_user_agent(context, expected_user_agent)
94+
95+
return assert_user_agent
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import pytest
2+
3+
pytestmark = pytest.mark.asyncio
4+
5+
SOME_USER_AGENT = "SOME_USER_AGENT"
6+
7+
8+
async def test_contexts(bidi_session, new_tab, top_context,
9+
default_user_agent, assert_user_agent):
10+
# Set user-agent override.
11+
await bidi_session.emulation.set_user_agent_override(
12+
contexts=[new_tab["context"]],
13+
user_agent=SOME_USER_AGENT
14+
)
15+
16+
# Assert user-agent override is set only in the required context.
17+
await assert_user_agent(new_tab, SOME_USER_AGENT)
18+
await assert_user_agent(top_context, default_user_agent)
19+
20+
# Reset user-agent override.
21+
await bidi_session.emulation.set_user_agent_override(
22+
contexts=[new_tab["context"]],
23+
user_agent=None
24+
)
25+
26+
# Assert user-agent override is reset.
27+
await assert_user_agent(new_tab, default_user_agent)
28+
await assert_user_agent(top_context, default_user_agent)
29+
30+
31+
async def test_multiple_contexts(bidi_session, new_tab, default_user_agent,
32+
assert_user_agent):
33+
new_context = await bidi_session.browsing_context.create(type_hint="tab")
34+
35+
# Set user-agent override
36+
await bidi_session.emulation.set_user_agent_override(
37+
contexts=[new_tab["context"], new_context["context"]],
38+
user_agent=SOME_USER_AGENT
39+
)
40+
41+
# Assert user-agent override is set in all the required contexts.
42+
await assert_user_agent(new_tab, SOME_USER_AGENT)
43+
await assert_user_agent(new_context, SOME_USER_AGENT)
44+
45+
# Reset user-agent override.
46+
await bidi_session.emulation.set_user_agent_override(
47+
contexts=[new_tab["context"], new_context["context"]],
48+
user_agent=None
49+
)
50+
51+
# Assert user-agent override is reset.
52+
await assert_user_agent(new_tab, default_user_agent)
53+
await assert_user_agent(new_context, default_user_agent)
54+
55+
56+
@pytest.mark.parametrize("domain", ["", "alt"],
57+
ids=["same_origin", "cross_origin"])
58+
async def test_iframe(bidi_session, new_tab, default_user_agent,
59+
assert_user_agent, domain, inline):
60+
# Set user-agent override
61+
await bidi_session.emulation.set_user_agent_override(
62+
contexts=[new_tab["context"]],
63+
user_agent=SOME_USER_AGENT
64+
)
65+
66+
# Assert user-agent override is set in the required context.
67+
await assert_user_agent(new_tab, SOME_USER_AGENT)
68+
69+
iframe_url = inline("<div id='in-iframe'>foo</div>", domain=domain)
70+
page_url = inline(f"<iframe src='{iframe_url}'></iframe>")
71+
72+
# Load the page with iframes.
73+
await bidi_session.browsing_context.navigate(
74+
context=new_tab["context"],
75+
url=page_url,
76+
wait="complete",
77+
)
78+
79+
contexts = await bidi_session.browsing_context.get_tree(
80+
root=new_tab["context"])
81+
iframe = contexts[0]["children"][0]
82+
83+
# Assert user-agent override is set in the iframe context.
84+
await assert_user_agent(iframe, SOME_USER_AGENT)
85+
86+
# Reset user-agent override.
87+
await bidi_session.emulation.set_user_agent_override(
88+
contexts=[new_tab["context"]],
89+
user_agent=None
90+
)
91+
92+
# Assert user-agent override is reset in the iframe context.
93+
await assert_user_agent(iframe, default_user_agent)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import pytest
2+
3+
pytestmark = pytest.mark.asyncio
4+
5+
SOME_USER_AGENT = "SOME_USER_AGENT"
6+
ANOTHER_USER_AGENT = "ANOTHER_USER_AGENT"
7+
8+
9+
async def test_user_agent_set_override_and_reset_globally(bidi_session,
10+
top_context, create_user_context, default_user_agent,
11+
assert_user_agent):
12+
user_context = await create_user_context()
13+
context_in_user_context = await bidi_session.browsing_context.create(
14+
user_context=user_context, type_hint="tab")
15+
16+
await bidi_session.emulation.set_user_agent_override(
17+
user_agent=SOME_USER_AGENT
18+
)
19+
20+
await assert_user_agent(top_context, SOME_USER_AGENT)
21+
await assert_user_agent(context_in_user_context, SOME_USER_AGENT)
22+
23+
another_context_in_user_context = await bidi_session.browsing_context.create(
24+
user_context=user_context, type_hint="tab")
25+
26+
await assert_user_agent(another_context_in_user_context, SOME_USER_AGENT)
27+
28+
# Reset global override.
29+
await bidi_session.emulation.set_user_agent_override(
30+
user_agent=None
31+
)
32+
33+
# Assert the override is reset for existing contexts.
34+
await assert_user_agent(top_context, default_user_agent)
35+
await assert_user_agent(context_in_user_context, default_user_agent)
36+
await assert_user_agent(another_context_in_user_context, default_user_agent)
37+
# Assert the override is reset for new context.
38+
await assert_user_agent(
39+
await bidi_session.browsing_context.create(user_context=user_context,
40+
type_hint="tab"),
41+
default_user_agent)
42+
43+
44+
async def test_user_agent_set_override_and_reset_globally_and_per_context(
45+
bidi_session, top_context, default_user_agent, assert_user_agent):
46+
await bidi_session.emulation.set_user_agent_override(
47+
contexts=[top_context["context"]],
48+
user_agent=SOME_USER_AGENT
49+
)
50+
await assert_user_agent(top_context, SOME_USER_AGENT)
51+
52+
# Set global override.
53+
await bidi_session.emulation.set_user_agent_override(
54+
user_agent=ANOTHER_USER_AGENT
55+
)
56+
57+
# The override per context should still be active.
58+
await assert_user_agent(top_context, SOME_USER_AGENT)
59+
60+
# Reset per-context override.
61+
await bidi_session.emulation.set_user_agent_override(
62+
contexts=[top_context["context"]],
63+
user_agent=None
64+
)
65+
66+
# The global override should be active.
67+
await assert_user_agent(top_context, ANOTHER_USER_AGENT)
68+
69+
# Reset global override.
70+
await bidi_session.emulation.set_user_agent_override(
71+
user_agent=ANOTHER_USER_AGENT
72+
)
73+
74+
# The override should be disabled.
75+
await assert_user_agent(top_context, default_user_agent)
76+
77+
78+
async def test_user_agent_set_override_and_reset_globally_and_per_user_context(
79+
bidi_session, top_context, default_user_agent, assert_user_agent):
80+
await bidi_session.emulation.set_user_agent_override(
81+
user_contexts=["default"],
82+
user_agent=SOME_USER_AGENT
83+
)
84+
await assert_user_agent(top_context, SOME_USER_AGENT)
85+
86+
# Set global override.
87+
await bidi_session.emulation.set_user_agent_override(
88+
user_agent=ANOTHER_USER_AGENT
89+
)
90+
91+
# The override per user context should still be active.
92+
await assert_user_agent(top_context, SOME_USER_AGENT)
93+
94+
# Reset per user context override.
95+
await bidi_session.emulation.set_user_agent_override(
96+
user_contexts=["default"],
97+
user_agent=None
98+
)
99+
100+
# The global override should be active.
101+
await assert_user_agent(top_context, ANOTHER_USER_AGENT)
102+
103+
# Reset global override.
104+
await bidi_session.emulation.set_user_agent_override(
105+
user_agent=None
106+
)
107+
108+
# The override should be disabled.
109+
await assert_user_agent(top_context, default_user_agent)

0 commit comments

Comments
 (0)