Skip to content

Commit f791b88

Browse files
authored
chore(roll): roll Playwright to 1.32.0-beta-1679448099000 (microsoft#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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy