Skip to content

Commit 731b539

Browse files
authored
chore: implement Request.service_worker (#3013)
1 parent 2d30755 commit 731b539

File tree

5 files changed

+58
-3
lines changed

5 files changed

+58
-3
lines changed

playwright/_impl/_network.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
from playwright._impl._browser_context import BrowserContext
6767
from playwright._impl._fetch import APIResponse
6868
from playwright._impl._frame import Frame
69-
from playwright._impl._page import Page
69+
from playwright._impl._page import Page, Worker
7070

7171

7272
class FallbackOverrideParameters(TypedDict, total=False):
@@ -184,6 +184,13 @@ def url(self) -> str:
184184
def resource_type(self) -> str:
185185
return self._initializer["resourceType"]
186186

187+
@property
188+
def service_worker(self) -> Optional["Worker"]:
189+
return cast(
190+
Optional["Worker"],
191+
from_nullable_channel(self._initializer.get("serviceWorker")),
192+
)
193+
187194
@property
188195
def method(self) -> str:
189196
return cast(str, self._fallback_overrides.method or self._initializer["method"])

playwright/async_api/_generated.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@ def resource_type(self) -> str:
113113
"""
114114
return mapping.from_maybe_impl(self._impl_obj.resource_type)
115115

116+
@property
117+
def service_worker(self) -> typing.Optional["Worker"]:
118+
"""Request.service_worker
119+
120+
The Service `Worker` that is performing the request.
121+
122+
**Details**
123+
124+
This method is Chromium only. It's safe to call when using other browsers, but it will always be `null`.
125+
126+
Requests originated in a Service Worker do not have a `request.frame()` available.
127+
128+
Returns
129+
-------
130+
Union[Worker, None]
131+
"""
132+
return mapping.from_impl_nullable(self._impl_obj.service_worker)
133+
116134
@property
117135
def method(self) -> str:
118136
"""Request.method

playwright/sync_api/_generated.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@ def resource_type(self) -> str:
113113
"""
114114
return mapping.from_maybe_impl(self._impl_obj.resource_type)
115115

116+
@property
117+
def service_worker(self) -> typing.Optional["Worker"]:
118+
"""Request.service_worker
119+
120+
The Service `Worker` that is performing the request.
121+
122+
**Details**
123+
124+
This method is Chromium only. It's safe to call when using other browsers, but it will always be `null`.
125+
126+
Requests originated in a Service Worker do not have a `request.frame()` available.
127+
128+
Returns
129+
-------
130+
Union[Worker, None]
131+
"""
132+
return mapping.from_impl_nullable(self._impl_obj.service_worker)
133+
116134
@property
117135
def method(self) -> str:
118136
"""Request.method

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import zipfile
2222
from typing import Dict
2323

24-
driver_version = "1.57.0"
24+
driver_version = "1.57.0-beta-1764944708000"
2525

2626
base_wheel_bundles = [
2727
{

tests/sync/test_network.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def handle_request(route: Route) -> None:
9292
assert response.json() == {"foo": "bar"}
9393

9494

95-
def test_should_report_if_request_was_from_service_worker(
95+
def test_should_report_if_response_was_from_service_worker(
9696
page: Page, server: Server
9797
) -> None:
9898
response = page.goto(server.PREFIX + "/serviceworkers/fetch/sw.html")
@@ -102,3 +102,15 @@ def test_should_report_if_request_was_from_service_worker(
102102
with page.expect_response("**/example.txt") as response_info:
103103
page.evaluate("() => fetch('/example.txt')")
104104
assert response_info.value.from_service_worker
105+
106+
107+
@pytest.mark.only_browser("chromium")
108+
def test_should_report_service_worker_request(page: Page, server: Server) -> None:
109+
with page.context.expect_event("serviceworker") as worker_info:
110+
page.goto(server.PREFIX + "/serviceworkers/fetch/sw.html")
111+
page.evaluate("() => window.activationPromise")
112+
with page.context.expect_event(
113+
"request", lambda r: r.service_worker is not None
114+
) as request_info:
115+
page.evaluate("() => fetch('/example.txt')")
116+
assert request_info.value.service_worker == worker_info.value

0 commit comments

Comments
 (0)