Skip to content

Commit f791b88

Browse files
authored
chore(roll): roll Playwright to 1.32.0-beta-1679448099000 (#1826)
1 parent 890af94 commit f791b88

21 files changed

+448
-157
lines changed

README.md

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

55
| | Linux | macOS | Windows |
66
| :--- | :---: | :---: | :---: |
7-
| Chromium <!-- GEN:chromium-version -->112.0.5615.20<!-- GEN:stop --> ||||
7+
| Chromium <!-- GEN:chromium-version -->112.0.5615.29<!-- GEN:stop --> ||||
88
| WebKit <!-- GEN:webkit-version -->16.4<!-- GEN:stop --> ||||
9-
| Firefox <!-- GEN:firefox-version -->110.0.1<!-- GEN:stop --> ||||
9+
| Firefox <!-- GEN:firefox-version -->111.0<!-- GEN:stop --> ||||
1010

1111
## Documentation
1212

playwright/_impl/_browser.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,7 @@ async def new_context(
125125

126126
channel = await self._channel.send("newContext", params)
127127
context = cast(BrowserContext, from_channel(channel))
128-
self._contexts.append(context)
129-
context._browser = self
130-
context._options = params
131-
context._set_browser_type(self._browser_type)
128+
self._browser_type._did_create_context(context, params, {})
132129
return context
133130

134131
async def new_page(
@@ -175,11 +172,6 @@ async def new_page(
175172
context._owner_page = page
176173
return page
177174

178-
def _set_browser_type(self, browser_type: "BrowserType") -> None:
179-
self._browser_type = browser_type
180-
for context in self._contexts:
181-
context._set_browser_type(browser_type)
182-
183175
async def close(self) -> None:
184176
if self._is_closed_or_closing:
185177
return

playwright/_impl/_browser_context.py

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import asyncio
1616
import json
17+
import sys
1718
from pathlib import Path
1819
from types import SimpleNamespace
1920
from typing import (
@@ -59,7 +60,6 @@
5960
URLMatcher,
6061
async_readfile,
6162
async_writefile,
62-
is_safe_close_error,
6363
locals_to_params,
6464
prepare_record_har_options,
6565
to_impl,
@@ -71,7 +71,11 @@
7171

7272
if TYPE_CHECKING: # pragma: no cover
7373
from playwright._impl._browser import Browser
74-
from playwright._impl._browser_type import BrowserType
74+
75+
if sys.version_info >= (3, 8): # pragma: no cover
76+
from typing import Literal
77+
else: # pragma: no cover
78+
from typing_extensions import Literal
7579

7680

7781
class BrowserContext(ChannelOwner):
@@ -90,11 +94,15 @@ def __init__(
9094
self, parent: ChannelOwner, type: str, guid: str, initializer: Dict
9195
) -> None:
9296
super().__init__(parent, type, guid, initializer)
97+
# circular import workaround:
98+
self._browser: Optional["Browser"] = None
99+
if parent.__class__.__name__ == "Browser":
100+
self._browser = cast("Browser", parent)
101+
self._browser._contexts.append(self)
93102
self._pages: List[Page] = []
94103
self._routes: List[RouteHandler] = []
95104
self._bindings: Dict[str, Any] = {}
96105
self._timeout_settings = TimeoutSettings(None)
97-
self._browser: Optional["Browser"] = None
98106
self._owner_page: Optional[Page] = None
99107
self._options: Dict[str, Any] = {}
100108
self._background_pages: Set[Page] = set()
@@ -172,6 +180,7 @@ def __init__(
172180
BrowserContext.Events.RequestFailed: "requestFailed",
173181
}
174182
)
183+
self._close_was_called = False
175184

176185
def __repr__(self) -> str:
177186
return f"<BrowserContext browser={self.browser}>"
@@ -226,13 +235,14 @@ def pages(self) -> List[Page]:
226235
def browser(self) -> Optional["Browser"]:
227236
return self._browser
228237

229-
def _set_browser_type(self, browser_type: "BrowserType") -> None:
230-
self._browser_type = browser_type
238+
def _set_options(self, context_options: Dict, browser_options: Dict) -> None:
239+
self._options = context_options
231240
if self._options.get("recordHar"):
232241
self._har_recorders[""] = {
233242
"path": self._options["recordHar"]["path"],
234243
"content": self._options["recordHar"].get("content"),
235244
}
245+
self._tracing._traces_dir = browser_options.get("tracesDir")
236246

237247
async def new_page(self) -> Page:
238248
if self._owner_page:
@@ -328,36 +338,43 @@ async def _record_into_har(
328338
har: Union[Path, str],
329339
page: Optional[Page] = None,
330340
url: Union[Pattern[str], str] = None,
331-
content: HarContentPolicy = None,
332-
mode: HarMode = None,
341+
update_content: HarContentPolicy = None,
342+
update_mode: HarMode = None,
333343
) -> None:
334344
params: Dict[str, Any] = {
335345
"options": prepare_record_har_options(
336346
{
337347
"recordHarPath": har,
338-
"recordHarContent": content or "attach",
339-
"recordHarMode": mode or "minimal",
348+
"recordHarContent": update_content or "attach",
349+
"recordHarMode": update_mode or "minimal",
340350
"recordHarUrlFilter": url,
341351
}
342352
)
343353
}
344354
if page:
345355
params["page"] = page._channel
346356
har_id = await self._channel.send("harStart", params)
347-
self._har_recorders[har_id] = {"path": str(har), "content": content or "attach"}
357+
self._har_recorders[har_id] = {
358+
"path": str(har),
359+
"content": update_content or "attach",
360+
}
348361

349362
async def route_from_har(
350363
self,
351364
har: Union[Path, str],
352365
url: Union[Pattern[str], str] = None,
353366
not_found: RouteFromHarNotFoundPolicy = None,
354367
update: bool = None,
355-
content: HarContentPolicy = None,
356-
mode: HarMode = None,
368+
update_content: Literal["attach", "embed"] = None,
369+
update_mode: HarMode = None,
357370
) -> None:
358371
if update:
359372
await self._record_into_har(
360-
har=har, page=None, url=url, content=content, mode=mode
373+
har=har,
374+
page=None,
375+
url=url,
376+
update_content=update_content,
377+
update_mode=update_mode,
361378
)
362379
return
363380
router = await HarRouter.create(
@@ -400,7 +417,11 @@ def _on_close(self) -> None:
400417
self.emit(BrowserContext.Events.Close, self)
401418

402419
async def close(self) -> None:
403-
try:
420+
if self._close_was_called:
421+
return
422+
self._close_was_called = True
423+
424+
async def _inner_close() -> None:
404425
for har_id, params in self._har_recorders.items():
405426
har = cast(
406427
Artifact,
@@ -422,11 +443,10 @@ async def close(self) -> None:
422443
else:
423444
await har.save_as(params["path"])
424445
await har.delete()
425-
await self._channel.send("close")
426-
await self._closed_future
427-
except Exception as e:
428-
if not is_safe_close_error(e):
429-
raise e
446+
447+
await self._channel._connection.wrap_api_call(_inner_close, True)
448+
await self._channel.send("close")
449+
await self._closed_future
430450

431451
async def _pause(self) -> None:
432452
await self._channel.send("pause")

playwright/_impl/_browser_type.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ async def launch(
9292
browser = cast(
9393
Browser, from_channel(await self._channel.send("launch", params))
9494
)
95-
browser._set_browser_type(self)
95+
self._did_launch_browser(browser)
9696
return browser
9797

9898
async def launch_persistent_context(
@@ -154,8 +154,7 @@ async def launch_persistent_context(
154154
BrowserContext,
155155
from_channel(await self._channel.send("launchPersistentContext", params)),
156156
)
157-
context._options = params
158-
context._set_browser_type(self)
157+
self._did_create_context(context, params, params)
159158
return context
160159

161160
async def connect_over_cdp(
@@ -168,15 +167,14 @@ async def connect_over_cdp(
168167
params = locals_to_params(locals())
169168
response = await self._channel.send_return_as_dict("connectOverCDP", params)
170169
browser = cast(Browser, from_channel(response["browser"]))
170+
self._did_launch_browser(browser)
171171

172172
default_context = cast(
173173
Optional[BrowserContext],
174174
from_nullable_channel(response.get("defaultContext")),
175175
)
176176
if default_context:
177-
browser._contexts.append(default_context)
178-
default_context._browser = browser
179-
browser._set_browser_type(self)
177+
self._did_create_context(default_context, {}, {})
180178
return browser
181179

182180
async def connect(
@@ -231,6 +229,7 @@ async def connect(
231229
pre_launched_browser = playwright._initializer.get("preLaunchedBrowser")
232230
assert pre_launched_browser
233231
browser = cast(Browser, from_channel(pre_launched_browser))
232+
self._did_launch_browser(browser)
234233
browser._should_close_connection_on_close = True
235234

236235
def handle_transport_close() -> None:
@@ -243,9 +242,16 @@ def handle_transport_close() -> None:
243242

244243
transport.once("close", handle_transport_close)
245244

246-
browser._set_browser_type(self)
247245
return browser
248246

247+
def _did_create_context(
248+
self, context: BrowserContext, context_options: Dict, browser_options: Dict
249+
) -> None:
250+
context._set_options(context_options, browser_options)
251+
252+
def _did_launch_browser(self, browser: Browser) -> None:
253+
browser._browser_type = self
254+
249255

250256
def normalize_launch_params(params: Dict) -> None:
251257
if "env" in params:
@@ -261,3 +267,5 @@ def normalize_launch_params(params: Dict) -> None:
261267
params["executablePath"] = str(Path(params["executablePath"]))
262268
if "downloadsPath" in params:
263269
params["downloadsPath"] = str(Path(params["downloadsPath"]))
270+
if "tracesDir" in params:
271+
params["tracesDir"] = str(Path(params["tracesDir"]))

playwright/_impl/_connection.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,17 @@
1919
import sys
2020
import traceback
2121
from pathlib import Path
22-
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union, cast
22+
from typing import (
23+
TYPE_CHECKING,
24+
Any,
25+
Callable,
26+
Dict,
27+
List,
28+
Mapping,
29+
Optional,
30+
Union,
31+
cast,
32+
)
2333

2434
from greenlet import greenlet
2535
from pyee import EventEmitter
@@ -231,7 +241,7 @@ def __init__(
231241
Optional[ParsedStackTrace]
232242
] = contextvars.ContextVar("ApiZone", default=None)
233243
self._local_utils: Optional["LocalUtils"] = local_utils
234-
self._stack_collector: List[List[Dict[str, Any]]] = []
244+
self._tracing_count = 0
235245

236246
@property
237247
def local_utils(self) -> "LocalUtils":
@@ -279,12 +289,11 @@ def call_on_object_with_known_name(
279289
) -> None:
280290
self._waiting_for_object[guid] = callback
281291

282-
def start_collecting_call_metadata(self, collector: Any) -> None:
283-
if collector not in self._stack_collector:
284-
self._stack_collector.append(collector)
285-
286-
def stop_collecting_call_metadata(self, collector: Any) -> None:
287-
self._stack_collector.remove(collector)
292+
def set_in_tracing(self, is_tracing: bool) -> None:
293+
if is_tracing:
294+
self._tracing_count += 1
295+
else:
296+
self._tracing_count -= 1
288297

289298
def _send_message_to_server(
290299
self, guid: str, method: str, params: Dict
@@ -299,8 +308,6 @@ def _send_message_to_server(
299308
)
300309
self._callbacks[id] = callback
301310
stack_trace_information = cast(ParsedStackTrace, self._api_zone.get())
302-
for collector in self._stack_collector:
303-
collector.append({"stack": stack_trace_information["frames"], "id": id})
304311
frames = stack_trace_information.get("frames", [])
305312
location = (
306313
{
@@ -325,6 +332,10 @@ def _send_message_to_server(
325332
}
326333
self._transport.send(message)
327334
self._callbacks[id] = callback
335+
336+
if self._tracing_count > 0 and frames and guid != "localUtils":
337+
self.local_utils.add_stack_to_tracing_no_reply(id, frames)
338+
328339
return callback
329340

330341
def dispatch(self, msg: ParsedMessagePayload) -> None:
@@ -521,3 +532,7 @@ def _extract_stack_trace_information_from_stack(
521532
"frames": parsed_frames,
522533
"apiName": "" if is_internal else api_name,
523534
}
535+
536+
537+
def filter_none(d: Mapping) -> Dict:
538+
return {k: v for k, v in d.items() if v is not None}

playwright/_impl/_fetch.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
ServerFilePayload,
3030
StorageState,
3131
)
32-
from playwright._impl._connection import ChannelOwner, from_channel
32+
from playwright._impl._connection import ChannelOwner, filter_none, from_channel
3333
from playwright._impl._helper import (
3434
Error,
3535
NameValue,
@@ -366,9 +366,6 @@ async def _inner_fetch(
366366
base64.b64encode(post_data_buffer).decode() if post_data_buffer else None
367367
)
368368

369-
def filter_none(input: Dict) -> Dict:
370-
return {k: v for k, v in input.items() if v is not None}
371-
372369
response = await self._channel.send(
373370
"fetch",
374371
filter_none(

playwright/_impl/_local_utils.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
# limitations under the License.
1414

1515
import base64
16-
from typing import Dict, Optional, cast
16+
from typing import Dict, List, Optional, cast
1717

1818
from playwright._impl._api_structures import HeadersArray
19-
from playwright._impl._connection import ChannelOwner
19+
from playwright._impl._connection import ChannelOwner, StackFrame
2020
from playwright._impl._helper import HarLookupResult, locals_to_params
2121

2222

@@ -57,3 +57,21 @@ async def har_close(self, harId: str) -> None:
5757
async def har_unzip(self, zipFile: str, harFile: str) -> None:
5858
params = locals_to_params(locals())
5959
await self._channel.send("harUnzip", params)
60+
61+
async def tracing_started(self, tracesDir: Optional[str], traceName: str) -> str:
62+
params = locals_to_params(locals())
63+
return await self._channel.send("tracingStarted", params)
64+
65+
async def trace_discarded(self, stacks_id: str) -> None:
66+
return await self._channel.send("traceDiscarded", {"stacks_id": stacks_id})
67+
68+
def add_stack_to_tracing_no_reply(self, id: int, frames: List[StackFrame]) -> None:
69+
self._channel.send_no_reply(
70+
"addStackToTracingNoReply",
71+
{
72+
"callData": {
73+
"stack": frames,
74+
"id": id,
75+
}
76+
},
77+
)

0 commit comments

Comments
 (0)