|
44 | 44 | from_channel,
|
45 | 45 | from_nullable_channel,
|
46 | 46 | )
|
| 47 | +from playwright._impl._console_message import ConsoleMessage |
| 48 | +from playwright._impl._dialog import Dialog |
47 | 49 | from playwright._impl._event_context_manager import EventContextManagerImpl
|
48 | 50 | from playwright._impl._fetch import APIRequestContext
|
49 | 51 | from playwright._impl._frame import Frame
|
@@ -82,6 +84,8 @@ class BrowserContext(ChannelOwner):
|
82 | 84 | Events = SimpleNamespace(
|
83 | 85 | BackgroundPage="backgroundpage",
|
84 | 86 | Close="close",
|
| 87 | + Console="console", |
| 88 | + Dialog="dialog", |
85 | 89 | Page="page",
|
86 | 90 | ServiceWorker="serviceworker",
|
87 | 91 | Request="request",
|
@@ -136,6 +140,14 @@ def __init__(
|
136 | 140 | "serviceWorker",
|
137 | 141 | lambda params: self._on_service_worker(from_channel(params["worker"])),
|
138 | 142 | )
|
| 143 | + self._channel.on( |
| 144 | + "console", |
| 145 | + lambda params: self._on_console_message(from_channel(params["message"])), |
| 146 | + ) |
| 147 | + |
| 148 | + self._channel.on( |
| 149 | + "dialog", lambda params: self._on_dialog(from_channel(params["dialog"])) |
| 150 | + ) |
139 | 151 | self._channel.on(
|
140 | 152 | "request",
|
141 | 153 | lambda params: self._on_request(
|
@@ -174,6 +186,8 @@ def __init__(
|
174 | 186 | )
|
175 | 187 | self._set_event_to_subscription_mapping(
|
176 | 188 | {
|
| 189 | + BrowserContext.Events.Console: "console", |
| 190 | + BrowserContext.Events.Dialog: "dialog", |
177 | 191 | BrowserContext.Events.Request: "request",
|
178 | 192 | BrowserContext.Events.Response: "response",
|
179 | 193 | BrowserContext.Events.RequestFinished: "requestFinished",
|
@@ -507,6 +521,27 @@ def _on_request_finished(
|
507 | 521 | if response:
|
508 | 522 | response._finished_future.set_result(True)
|
509 | 523 |
|
| 524 | + def _on_console_message(self, message: ConsoleMessage) -> None: |
| 525 | + self.emit(BrowserContext.Events.Console, message) |
| 526 | + page = message.page |
| 527 | + if page: |
| 528 | + page.emit(Page.Events.Console, message) |
| 529 | + |
| 530 | + def _on_dialog(self, dialog: Dialog) -> None: |
| 531 | + has_listeners = self.emit(BrowserContext.Events.Dialog, dialog) |
| 532 | + page = dialog.page |
| 533 | + if page: |
| 534 | + has_listeners = page.emit(Page.Events.Dialog, dialog) or has_listeners |
| 535 | + if not has_listeners: |
| 536 | + # Although we do similar handling on the server side, we still need this logic |
| 537 | + # on the client side due to a possible race condition between two async calls: |
| 538 | + # a) removing "dialog" listener subscription (client->server) |
| 539 | + # b) actual "dialog" event (server->client) |
| 540 | + if dialog.type == "beforeunload": |
| 541 | + asyncio.create_task(dialog.accept()) |
| 542 | + else: |
| 543 | + asyncio.create_task(dialog.dismiss()) |
| 544 | + |
510 | 545 | def _on_request(self, request: Request, page: Optional[Page]) -> None:
|
511 | 546 | self.emit(BrowserContext.Events.Request, request)
|
512 | 547 | if page:
|
|
0 commit comments