Skip to content

Commit 33b559d

Browse files
authored
Add WebDriver BiDi worker tests (web-platform-tests#44291)
1 parent d56b139 commit 33b559d

File tree

3 files changed

+249
-0
lines changed

3 files changed

+249
-0
lines changed

webdriver/tests/bidi/script/realm_created/realm_created.py

+143
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from webdriver.bidi.modules.script import RealmTarget
55
from webdriver.error import TimeoutException
6+
from ... import any_string, recursive_compare
67
from .. import create_sandbox
78

89

@@ -220,3 +221,145 @@ async def test_script_when_realm_is_created(
220221
)
221222

222223
assert result == {"type": "number", "value": 3}
224+
225+
226+
async def test_dedicated_worker(
227+
wait_for_future_safe,
228+
bidi_session,
229+
subscribe_events,
230+
top_context,
231+
inline,
232+
event_loop,
233+
):
234+
await subscribe_events(events=[REALM_CREATED_EVENT])
235+
236+
window_realm = None
237+
worker_realm = event_loop.create_future()
238+
239+
async def on_event(method, data):
240+
if data["type"] == "dedicated-worker":
241+
if worker_realm.done():
242+
raise "More than one dedicated worker"
243+
else:
244+
worker_realm.set_result(data)
245+
elif data["type"] == "window":
246+
nonlocal window_realm
247+
window_realm = data
248+
249+
remove_listener = bidi_session.add_event_listener(REALM_CREATED_EVENT, on_event)
250+
251+
worker_url = inline("while(true){}", doctype="js")
252+
url = inline(f"<script>const worker = new Worker('{worker_url}');</script>")
253+
await bidi_session.browsing_context.navigate(
254+
url=url, context=top_context["context"], wait="complete"
255+
)
256+
257+
realm = await wait_for_future_safe(worker_realm)
258+
remove_listener()
259+
260+
recursive_compare(
261+
{
262+
"type": "dedicated-worker",
263+
"realm": any_string,
264+
"origin": worker_url,
265+
"owners": [window_realm["realm"]],
266+
},
267+
realm,
268+
)
269+
270+
271+
async def test_shared_worker(
272+
wait_for_future_safe,
273+
bidi_session,
274+
subscribe_events,
275+
top_context,
276+
inline,
277+
event_loop,
278+
):
279+
await subscribe_events(events=[REALM_CREATED_EVENT])
280+
281+
window_realm = None
282+
worker_realm = event_loop.create_future()
283+
284+
async def on_event(method, data):
285+
if data["type"] == "shared-worker":
286+
if worker_realm.done():
287+
raise "More than one shared worker"
288+
else:
289+
worker_realm.set_result(data)
290+
elif data["type"] == "window":
291+
nonlocal window_realm
292+
window_realm = data
293+
294+
remove_listener = bidi_session.add_event_listener(REALM_CREATED_EVENT, on_event)
295+
296+
worker_url = inline("while(true){}", doctype="js")
297+
url = inline(
298+
f"""<script>
299+
const worker = new SharedWorker('{worker_url}');
300+
</script>"""
301+
)
302+
await bidi_session.browsing_context.navigate(
303+
url=url, context=top_context["context"], wait="complete"
304+
)
305+
306+
realm = await wait_for_future_safe(worker_realm)
307+
remove_listener()
308+
309+
recursive_compare(
310+
{
311+
"type": "shared-worker",
312+
"realm": any_string,
313+
"origin": worker_url,
314+
},
315+
realm,
316+
)
317+
318+
319+
async def test_service_worker(
320+
wait_for_future_safe,
321+
bidi_session,
322+
subscribe_events,
323+
top_context,
324+
inline,
325+
event_loop,
326+
):
327+
await subscribe_events(events=[REALM_CREATED_EVENT])
328+
329+
window_realm = None
330+
worker_realm = event_loop.create_future()
331+
332+
async def on_event(method, data):
333+
if data["type"] == "service-worker":
334+
if worker_realm.done():
335+
raise "More than one service worker"
336+
else:
337+
worker_realm.set_result(data)
338+
elif data["type"] == "window":
339+
nonlocal window_realm
340+
window_realm = data
341+
342+
remove_listener = bidi_session.add_event_listener(REALM_CREATED_EVENT, on_event)
343+
344+
worker_url = inline("while(true){}", doctype="js")
345+
url = inline(
346+
f"""<script>
347+
navigator.serviceWorker.register('{worker_url}');
348+
navigator.serviceWorker.startMessages();
349+
</script>"""
350+
)
351+
await bidi_session.browsing_context.navigate(
352+
url=url, context=top_context["context"], wait="complete"
353+
)
354+
355+
realm = await wait_for_future_safe(worker_realm)
356+
remove_listener()
357+
358+
recursive_compare(
359+
{
360+
"type": "service-worker",
361+
"realm": any_string,
362+
"origin": worker_url,
363+
},
364+
realm,
365+
)

webdriver/tests/bidi/script/realm_destroyed/realm_destroyed.py

+104
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from tests.support.sync import AsyncPoll
33
from webdriver.error import TimeoutException
4+
from ..realm_created.realm_created import REALM_CREATED_EVENT
45

56
from .. import create_sandbox
67

@@ -236,3 +237,106 @@ async def on_event(method, data):
236237
assert result[0]["realm"] in destroyed_realm_ids
237238

238239
remove_listener()
240+
241+
242+
async def test_dedicated_worker(
243+
wait_for_future_safe,
244+
bidi_session,
245+
subscribe_events,
246+
top_context,
247+
inline,
248+
event_loop,
249+
):
250+
await subscribe_events(events=[REALM_CREATED_EVENT, REALM_DESTROYED_EVENT])
251+
252+
found = event_loop.create_future()
253+
worker_realm = event_loop.create_future()
254+
255+
async def on_realm_created_event(method, data):
256+
if data["type"] == "dedicated-worker":
257+
if worker_realm.done():
258+
raise "More than one dedicated worker"
259+
else:
260+
worker_realm.set_result(data)
261+
262+
async def on_realm_destroyed_event(method, data):
263+
if worker_realm.done() and data["realm"] == worker_realm.result()["realm"]:
264+
found.set_result(True)
265+
266+
remove_realm_created_listener = bidi_session.add_event_listener(
267+
REALM_CREATED_EVENT, on_realm_created_event
268+
)
269+
remove_realm_destroyed_listener = bidi_session.add_event_listener(
270+
REALM_DESTROYED_EVENT, on_realm_destroyed_event
271+
)
272+
273+
worker_url = inline("while(true){}", doctype="js")
274+
url = inline(
275+
f"""<script>
276+
const worker = new Worker('{worker_url}');
277+
setTimeout(() => {{
278+
worker.terminate();
279+
}}, 100);
280+
</script>"""
281+
)
282+
await bidi_session.browsing_context.navigate(
283+
url=url, context=top_context["context"], wait="complete"
284+
)
285+
286+
assert await wait_for_future_safe(found)
287+
remove_realm_created_listener()
288+
remove_realm_destroyed_listener()
289+
290+
291+
async def test_shared_worker(
292+
wait_for_future_safe,
293+
bidi_session,
294+
subscribe_events,
295+
top_context,
296+
inline,
297+
event_loop,
298+
):
299+
await subscribe_events(events=[REALM_CREATED_EVENT, REALM_DESTROYED_EVENT])
300+
301+
found = event_loop.create_future()
302+
worker_realm = event_loop.create_future()
303+
304+
async def on_realm_created_event(method, data):
305+
if data["type"] == "shared-worker":
306+
if worker_realm.done():
307+
raise "More than one dedicated worker"
308+
else:
309+
worker_realm.set_result(data)
310+
311+
async def on_realm_destroyed_event(method, data):
312+
if worker_realm.done() and data["realm"] == worker_realm.result()["realm"]:
313+
found.set_result(True)
314+
315+
remove_realm_created_listener = bidi_session.add_event_listener(
316+
REALM_CREATED_EVENT, on_realm_created_event
317+
)
318+
remove_realm_destroyed_listener = bidi_session.add_event_listener(
319+
REALM_DESTROYED_EVENT, on_realm_destroyed_event
320+
)
321+
322+
worker_url = inline("while(true){}", doctype="js")
323+
url = inline(
324+
f"""<script>
325+
const worker = new SharedWorker('{worker_url}');
326+
</script>"""
327+
)
328+
await bidi_session.browsing_context.navigate(
329+
url=url, context=top_context["context"], wait="complete"
330+
)
331+
# Wait for the worker realm before navigating to ensure we aren't navigating
332+
# too early.
333+
assert await wait_for_future_safe(worker_realm)
334+
335+
url = inline("")
336+
await bidi_session.browsing_context.navigate(
337+
url=url, context=top_context["context"], wait="complete"
338+
)
339+
assert await wait_for_future_safe(found)
340+
341+
remove_realm_created_listener()
342+
remove_realm_destroyed_listener()

webdriver/tests/support/inline.py

+2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
</body>
1919
</html>""",
2020
"xml": """<?xml version="1.0" encoding="{charset}"?>\n{src}""",
21+
"js": "",
2122
}
2223
MIME_TYPES = {
2324
"html": "text/html",
2425
"xhtml": "application/xhtml+xml",
2526
"xml": "text/xml",
27+
"js": "text/javascript",
2628
}
2729

2830

0 commit comments

Comments
 (0)