Skip to content

Commit 1d39a2e

Browse files
authored
feat(roll): roll to 1617404897000 aka opener & tracing (microsoft#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)
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