Skip to content

Commit 1d39a2e

Browse files
authored
feat(roll): roll to 1617404897000 aka opener & tracing (#611)
1 parent 4ac3256 commit 1d39a2e

17 files changed

+469
-223
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H
88
| :--- | :---: | :---: | :---: |
99
| Chromium <!-- GEN:chromium-version -->91.0.4455.0<!-- GEN:stop --> ||||
1010
| WebKit <!-- GEN:webkit-version -->14.2<!-- GEN:stop --> ||||
11-
| Firefox <!-- GEN:firefox-version -->87.0b10<!-- GEN:stop --> ||||
11+
| Firefox <!-- GEN:firefox-version -->88.0b6<!-- GEN:stop --> ||||
1212

1313
Headless execution is supported for all browsers on all platforms.
1414

playwright/_impl/_browser.py

Lines changed: 23 additions & 0 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 base64
1516
import json
1617
from pathlib import Path
1718
from types import SimpleNamespace
@@ -25,6 +26,7 @@
2526
ViewportSize,
2627
)
2728
from playwright._impl._browser_context import BrowserContext
29+
from playwright._impl._cdp_session import CDPSession
2830
from playwright._impl._connection import ChannelOwner, from_channel
2931
from playwright._impl._helper import ColorScheme, is_safe_close_error, locals_to_params
3032
from playwright._impl._network import serialize_headers
@@ -156,6 +158,27 @@ async def close(self) -> None:
156158
def version(self) -> str:
157159
return self._initializer["version"]
158160

161+
async def new_browser_cdp_session(self) -> CDPSession:
162+
return from_channel(await self._channel.send("newBrowserCDPSession"))
163+
164+
async def start_tracing(
165+
self,
166+
page: Page = None,
167+
path: Union[str, Path] = None,
168+
screenshots: bool = None,
169+
categories: List[str] = None,
170+
) -> None:
171+
params = locals_to_params(locals())
172+
if page:
173+
params["page"] = page._channel
174+
if path:
175+
params["path"] = str(path)
176+
await self._channel.send("startTracing", params)
177+
178+
async def stop_tracing(self) -> bytes:
179+
encoded_binary = await self._channel.send("stopTracing")
180+
return base64.b64decode(encoded_binary)
181+
159182

160183
def normalize_context_params(is_sync: bool, params: Dict) -> None:
161184
params["sdkLanguage"] = "python" if is_sync else "python-async"

playwright/_impl/_browser_context.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
import json
1818
from pathlib import Path
1919
from types import SimpleNamespace
20-
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union, cast
20+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Union, cast
2121

2222
from playwright._impl._api_structures import Cookie, Geolocation, StorageState
2323
from playwright._impl._api_types import Error
24+
from playwright._impl._cdp_session import CDPSession
2425
from playwright._impl._connection import ChannelOwner, from_channel
2526
from playwright._impl._event_context_manager import EventContextManagerImpl
2627
from playwright._impl._helper import (
@@ -33,7 +34,7 @@
3334
locals_to_params,
3435
)
3536
from playwright._impl._network import Request, Route, serialize_headers
36-
from playwright._impl._page import BindingCall, Page
37+
from playwright._impl._page import BindingCall, Page, Worker
3738
from playwright._impl._wait_helper import WaitHelper
3839

3940
if TYPE_CHECKING: # pragma: no cover
@@ -43,8 +44,10 @@
4344
class BrowserContext(ChannelOwner):
4445

4546
Events = SimpleNamespace(
47+
BackgroundPage="backgroundpage",
4648
Close="close",
4749
Page="page",
50+
ServiceWorker="serviceworker",
4851
)
4952

5053
def __init__(
@@ -59,6 +62,8 @@ def __init__(
5962
self._owner_page: Optional[Page] = None
6063
self._is_closed_or_closing = False
6164
self._options: Dict[str, Any] = {}
65+
self._background_pages: Set[Page] = set()
66+
self._service_workers: Set[Worker] = set()
6267

6368
self._channel.on(
6469
"bindingCall",
@@ -75,14 +80,25 @@ def __init__(
7580
),
7681
)
7782

83+
self._channel.on(
84+
"backgroundPage",
85+
lambda params: self._on_background_page(from_channel(params["page"])),
86+
)
87+
88+
self._channel.on(
89+
"serviceWorker",
90+
lambda params: self._on_service_worker(from_channel(params["worker"])),
91+
)
92+
7893
def __repr__(self) -> str:
7994
return f"<BrowserContext browser={self.browser}>"
8095

8196
def _on_page(self, page: Page) -> None:
82-
print("ON PAGE ARRIVED")
8397
page._set_browser_context(self)
8498
self._pages.append(page)
8599
self.emit(BrowserContext.Events.Page, page)
100+
if page._opener and not page._opener.is_closed():
101+
page._opener.emit(Page.Events.Popup, page)
86102

87103
def _on_route(self, route: Route, request: Request) -> None:
88104
for handler_entry in self._routes:
@@ -262,3 +278,25 @@ def expect_page(
262278
timeout: float = None,
263279
) -> EventContextManagerImpl[Page]:
264280
return self.expect_event(BrowserContext.Events.Page, predicate, timeout)
281+
282+
def _on_background_page(self, page: Page) -> None:
283+
self._background_pages.add(page)
284+
self.emit(BrowserContext.Events.BackgroundPage, page)
285+
286+
def _on_service_worker(self, worker: Worker) -> None:
287+
worker._context = self
288+
self._service_workers.add(worker)
289+
self.emit(BrowserContext.Events.ServiceWorker, worker)
290+
291+
@property
292+
def background_pages(self) -> List[Page]:
293+
return list(self._background_pages)
294+
295+
@property
296+
def service_workers(self) -> List[Worker]:
297+
return list(self._service_workers)
298+
299+
async def new_cdp_session(self, page: Page) -> CDPSession:
300+
return from_channel(
301+
await self._channel.send("newCDPSession", {"page": page._channel})
302+
)

playwright/_impl/_chromium_browser_context.py

Lines changed: 0 additions & 69 deletions
This file was deleted.

playwright/_impl/_object_factory.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from playwright._impl._browser_context import BrowserContext
2020
from playwright._impl._browser_type import BrowserType
2121
from playwright._impl._cdp_session import CDPSession
22-
from playwright._impl._chromium_browser_context import ChromiumBrowserContext
2322
from playwright._impl._connection import ChannelOwner
2423
from playwright._impl._console_message import ConsoleMessage
2524
from playwright._impl._dialog import Dialog
@@ -52,13 +51,6 @@ def create_remote_object(
5251
if type == "BrowserType":
5352
return BrowserType(parent, type, guid, initializer)
5453
if type == "BrowserContext":
55-
browser_name: str = ""
56-
if isinstance(parent, Browser):
57-
browser_name = parent._browser_type.name
58-
if isinstance(parent, BrowserType):
59-
browser_name = parent.name
60-
if browser_name == "chromium":
61-
return ChromiumBrowserContext(parent, type, guid, initializer)
6254
return BrowserContext(parent, type, guid, initializer)
6355
if type == "CDPSession":
6456
return CDPSession(parent, type, guid, initializer)

playwright/_impl/_page.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def __init__(
126126
self._owned_context: Optional["BrowserContext"] = None
127127
self._timeout_settings: TimeoutSettings = TimeoutSettings(None)
128128
self._video: Optional[Video] = None
129+
self._opener = cast("Page", from_nullable_channel(initializer.get("opener")))
129130

130131
self._channel.on(
131132
"bindingCall",
@@ -168,10 +169,6 @@ def __init__(
168169
Page.Events.PageError, parse_error(params["error"]["error"])
169170
),
170171
)
171-
self._channel.on(
172-
"popup",
173-
lambda params: self.emit(Page.Events.Popup, from_channel(params["page"])),
174-
)
175172
self._channel.on(
176173
"request",
177174
lambda params: self.emit(
@@ -316,7 +313,9 @@ def context(self) -> "BrowserContext":
316313
return self._browser_context
317314

318315
async def opener(self) -> Optional["Page"]:
319-
return from_nullable_channel(await self._channel.send("opener"))
316+
if self._opener and self._opener.is_closed():
317+
return None
318+
return self._opener
320319

321320
@property
322321
def main_frame(self) -> Frame:

playwright/async_api/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
BrowserContext,
2929
BrowserType,
3030
CDPSession,
31-
ChromiumBrowserContext,
3231
ConsoleMessage,
3332
Dialog,
3433
Download,
@@ -50,6 +49,8 @@
5049
Worker,
5150
)
5251

52+
ChromiumBrowserContext = BrowserContext
53+
5354
Cookie = playwright._impl._api_structures.Cookie
5455
FilePayload = playwright._impl._api_structures.FilePayload
5556
FloatRect = playwright._impl._api_structures.FloatRect

0 commit comments

Comments
 (0)