Skip to content

Commit 89b957b

Browse files
authored
feat(roll): roll Playwright 1.15.0-next-1631091227000 (#887)
1 parent 651baeb commit 89b957b

20 files changed

+551
-164
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H
44

55
| | Linux | macOS | Windows |
66
| :--- | :---: | :---: | :---: |
7-
| Chromium <!-- GEN:chromium-version -->94.0.4595.0<!-- GEN:stop --> ||||
7+
| Chromium <!-- GEN:chromium-version -->95.0.4636.0<!-- GEN:stop --> ||||
88
| WebKit <!-- GEN:webkit-version -->15.0<!-- GEN:stop --> ||||
99
| Firefox <!-- GEN:firefox-version -->91.0<!-- GEN:stop --> ||||
1010

playwright/_impl/_api_structures.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ class RequestSizes(TypedDict):
109109
requestHeadersSize: int
110110
responseBodySize: int
111111
responseHeadersSize: int
112-
responseTransferSize: int
113112

114113

115114
class ViewportSize(TypedDict):

playwright/_impl/_browser.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from playwright._impl._connection import ChannelOwner, from_channel
3131
from playwright._impl._helper import (
3232
ColorScheme,
33+
ForcedColors,
3334
ReducedMotion,
3435
async_readfile,
3536
is_safe_close_error,
@@ -97,6 +98,7 @@ async def new_context(
9798
hasTouch: bool = None,
9899
colorScheme: ColorScheme = None,
99100
reducedMotion: ReducedMotion = None,
101+
forcedColors: ForcedColors = None,
100102
acceptDownloads: bool = None,
101103
defaultBrowserType: str = None,
102104
proxy: ProxySettings = None,
@@ -138,6 +140,7 @@ async def new_page(
138140
isMobile: bool = None,
139141
hasTouch: bool = None,
140142
colorScheme: ColorScheme = None,
143+
forcedColors: ForcedColors = None,
141144
reducedMotion: ReducedMotion = None,
142145
acceptDownloads: bool = None,
143146
defaultBrowserType: str = None,

playwright/_impl/_browser_context.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,7 @@
1919
from types import SimpleNamespace
2020
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Union, cast
2121

22-
from playwright._impl._api_structures import (
23-
Cookie,
24-
Geolocation,
25-
RequestSizes,
26-
StorageState,
27-
)
22+
from playwright._impl._api_structures import Cookie, Geolocation, StorageState
2823
from playwright._impl._api_types import Error
2924
from playwright._impl._artifact import Artifact
3025
from playwright._impl._cdp_session import CDPSession
@@ -134,9 +129,9 @@ def __init__(
134129
"requestFinished",
135130
lambda params: self._on_request_finished(
136131
from_channel(params["request"]),
132+
from_nullable_channel(params["response"]),
137133
params["responseEndTiming"],
138134
from_nullable_channel(params.get("page")),
139-
params["requestSizes"],
140135
),
141136
)
142137
self._closed_future: asyncio.Future = asyncio.Future()
@@ -366,16 +361,17 @@ def _on_request_failed(
366361
def _on_request_finished(
367362
self,
368363
request: Request,
364+
response: Optional[Response],
369365
response_end_timing: float,
370366
page: Optional[Page],
371-
request_sizes: RequestSizes,
372367
) -> None:
373368
if request._timing:
374369
request._timing["responseEnd"] = response_end_timing
375-
request._sizes = request_sizes
376370
self.emit(BrowserContext.Events.RequestFinished, request)
377371
if page:
378372
page.emit(Page.Events.RequestFinished, request)
373+
if response:
374+
response._finished_future.set_result(True)
379375

380376
def _on_request(self, request: Request, page: Optional[Page]) -> None:
381377
self.emit(BrowserContext.Events.Request, request)

playwright/_impl/_browser_type.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from playwright._impl._helper import (
3636
ColorScheme,
3737
Env,
38+
ForcedColors,
3839
ReducedMotion,
3940
locals_to_params,
4041
not_installed_error,
@@ -128,6 +129,7 @@ async def launch_persistent_context(
128129
hasTouch: bool = None,
129130
colorScheme: ColorScheme = None,
130131
reducedMotion: ReducedMotion = None,
132+
forcedColors: ForcedColors = None,
131133
acceptDownloads: bool = None,
132134
tracesDir: Union[pathlib.Path, str] = None,
133135
chromiumSandbox: bool = None,

playwright/_impl/_element_handle.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@ async def set_checked(
220220
timeout: float = None,
221221
force: bool = None,
222222
noWaitAfter: bool = None,
223-
strict: bool = None,
224223
trial: bool = None,
225224
) -> None:
226225
if checked:

playwright/_impl/_helper.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
]
5656

5757
ColorScheme = Literal["dark", "light", "no-preference"]
58+
ForcedColors = Literal["active", "none"]
5859
ReducedMotion = Literal["no-preference", "reduce"]
5960
DocumentLoadState = Literal["domcontentloaded", "load", "networkidle"]
6061
KeyboardModifier = Literal["Alt", "Control", "Meta", "Shift"]

playwright/_impl/_locator.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,6 @@ async def set_checked(
445445
position: Position = None,
446446
timeout: float = None,
447447
force: bool = None,
448-
strict: bool = None,
449448
noWaitAfter: bool = None,
450449
trial: bool = None,
451450
) -> None:

playwright/_impl/_network.py

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import asyncio
1516
import base64
1617
import json
1718
import mimetypes
@@ -63,14 +64,8 @@ def __init__(
6364
"responseStart": -1,
6465
"responseEnd": -1,
6566
}
66-
self._sizes: RequestSizes = {
67-
"requestBodySize": 0,
68-
"requestHeadersSize": 0,
69-
"responseBodySize": 0,
70-
"responseHeadersSize": 0,
71-
"responseTransferSize": 0,
72-
}
73-
self._headers: Dict[str, str] = parse_headers(self._initializer["headers"])
67+
self._headers: List[Header] = self._initializer["headers"]
68+
self._all_headers_future: Optional[asyncio.Future[List[Header]]] = None
7469

7570
def __repr__(self) -> str:
7671
return f"<Request url={self.url!r} method={self.method!r}>"
@@ -87,9 +82,11 @@ def resource_type(self) -> str:
8782
def method(self) -> str:
8883
return self._initializer["method"]
8984

90-
@property
91-
def sizes(self) -> RequestSizes:
92-
return self._sizes
85+
async def sizes(self) -> RequestSizes:
86+
response = await self.response()
87+
if not response:
88+
raise Error("Unable to fetch sizes for failed request")
89+
return await response._channel.send("sizes")
9390

9491
@property
9592
def post_data(self) -> Optional[str]:
@@ -120,7 +117,7 @@ def post_data_buffer(self) -> Optional[bytes]:
120117

121118
@property
122119
def headers(self) -> Dict[str, str]:
123-
return self._headers
120+
return headers_array_to_object(self._headers, True)
124121

125122
async def response(self) -> Optional["Response"]:
126123
return from_nullable_channel(await self._channel.send("response"))
@@ -148,6 +145,27 @@ def failure(self) -> Optional[str]:
148145
def timing(self) -> ResourceTiming:
149146
return self._timing
150147

148+
async def all_headers(self) -> Dict[str, str]:
149+
return headers_array_to_object(await self._get_headers_if_needed(), True)
150+
151+
async def headers_array(self) -> List[List[str]]:
152+
return list(
153+
map(
154+
lambda header: [header["name"], header["value"]],
155+
await self._get_headers_if_needed(),
156+
)
157+
)
158+
159+
async def _get_headers_if_needed(self) -> List[Header]:
160+
if not self._all_headers_future:
161+
self._all_headers_future = asyncio.Future()
162+
response = await self.response()
163+
if not response:
164+
return self._headers
165+
headers = await response._channel.send("rawRequestHeaders")
166+
self._all_headers_future.set_result(headers)
167+
return await self._all_headers_future
168+
151169

152170
class Route(ChannelOwner):
153171
def __init__(
@@ -238,7 +256,11 @@ def __init__(
238256
self._request._timing["connectEnd"] = timing["connectEnd"]
239257
self._request._timing["requestStart"] = timing["requestStart"]
240258
self._request._timing["responseStart"] = timing["responseStart"]
241-
self._request._headers = parse_headers(self._initializer["requestHeaders"])
259+
self._headers = headers_array_to_object(
260+
cast(List[Header], self._initializer["headers"]), True
261+
)
262+
self._raw_headers_future: Optional[asyncio.Future[List[Header]]] = None
263+
self._finished_future: asyncio.Future[bool] = asyncio.Future()
242264

243265
def __repr__(self) -> str:
244266
return f"<Response url={self.url!r} request={self.request}>"
@@ -263,16 +285,34 @@ def status_text(self) -> str:
263285

264286
@property
265287
def headers(self) -> Dict[str, str]:
266-
return parse_headers(self._initializer["headers"])
288+
return self._headers.copy()
289+
290+
async def all_headers(self) -> Dict[str, str]:
291+
return headers_array_to_object(await self._get_headers_if_needed(), True)
292+
293+
async def headers_array(self) -> List[List[str]]:
294+
return list(
295+
map(
296+
lambda header: [header["name"], header["value"]],
297+
await self._get_headers_if_needed(),
298+
)
299+
)
300+
301+
async def _get_headers_if_needed(self) -> List[Header]:
302+
if not self._raw_headers_future:
303+
self._raw_headers_future = asyncio.Future()
304+
headers = cast(List[Header], await self._channel.send("rawResponseHeaders"))
305+
self._raw_headers_future.set_result(headers)
306+
return await self._raw_headers_future
267307

268308
async def server_addr(self) -> Optional[RemoteAddr]:
269309
return await self._channel.send("serverAddr")
270310

271311
async def security_details(self) -> Optional[SecurityDetails]:
272312
return await self._channel.send("securityDetails")
273313

274-
async def finished(self) -> Optional[str]:
275-
return await self._channel.send("finished")
314+
async def finished(self) -> None:
315+
await self._finished_future
276316

277317
async def body(self) -> bytes:
278318
binary = await self._channel.send("body")
@@ -384,5 +424,8 @@ def serialize_headers(headers: Dict[str, str]) -> List[Header]:
384424
return [{"name": name, "value": value} for name, value in headers.items()]
385425

386426

387-
def parse_headers(headers: List[Header]) -> Dict[str, str]:
388-
return {header["name"].lower(): header["value"] for header in headers}
427+
def headers_array_to_object(headers: List[Header], lower_case: bool) -> Dict[str, str]:
428+
return {
429+
(header["name"].lower() if lower_case else header["name"]): header["value"]
430+
for header in headers
431+
}

playwright/_impl/_page.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from playwright._impl._helper import (
4646
ColorScheme,
4747
DocumentLoadState,
48+
ForcedColors,
4849
KeyboardModifier,
4950
MouseButton,
5051
ReducedMotion,
@@ -513,6 +514,7 @@ async def emulate_media(
513514
media: Literal["print", "screen"] = None,
514515
colorScheme: ColorScheme = None,
515516
reducedMotion: ReducedMotion = None,
517+
forcedColors: ForcedColors = None,
516518
) -> None:
517519
await self._channel.send("emulateMedia", locals_to_params(locals()))
518520

0 commit comments

Comments
 (0)