Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion playwright/_impl/_browser_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ async def connect(
)
connection._is_sync = self._connection._is_sync
connection._loop.create_task(connection.run())
playwright_future = connection.get_playwright_future()
playwright_future = connection.playwright_future

timeout_future = throw_on_timeout(timeout, Error("Connection timed out"))
done, pending = await asyncio.wait(
Expand Down
44 changes: 21 additions & 23 deletions playwright/_impl/_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def __init__(
) -> None:
self._dispatcher_fiber = dispatcher_fiber
self._transport = transport
self._transport.on_message = lambda msg: self._dispatch(msg)
self._transport.on_message = lambda msg: self.dispatch(msg)
self._waiting_for_object: Dict[str, Callable[[ChannelOwner], None]] = {}
self._last_id = 0
self._objects: Dict[str, ChannelOwner] = {}
Expand All @@ -160,7 +160,7 @@ def __init__(
self._is_sync = False
self._child_ws_connections: List["Connection"] = []
self._loop = loop
self._playwright_future: asyncio.Future["Playwright"] = loop.create_future()
self.playwright_future: asyncio.Future["Playwright"] = loop.create_future()
self._error: Optional[BaseException] = None

async def run_as_sync(self) -> None:
Expand All @@ -172,15 +172,12 @@ async def run(self) -> None:
self._root_object = RootChannelOwner(self)

async def init() -> None:
self._playwright_future.set_result(await self._root_object.initialize())
self.playwright_future.set_result(await self._root_object.initialize())

await self._transport.connect()
self._loop.create_task(init())
await self._transport.run()

def get_playwright_future(self) -> asyncio.Future:
return self._playwright_future

def stop_sync(self) -> None:
self._transport.request_stop()
self._dispatcher_fiber.switch()
Expand Down Expand Up @@ -216,18 +213,18 @@ def _send_message_to_server(
if api_name:
metadata["apiName"] = api_name

message = dict(
id=id,
guid=guid,
method=method,
params=self._replace_channels_with_guids(params, "params"),
metadata=metadata,
)
message = {
"id": id,
"guid": guid,
"method": method,
"params": self._replace_channels_with_guids(params),
"metadata": metadata,
}
self._transport.send(message)
self._callbacks[id] = callback
return callback

def _dispatch(self, msg: ParsedMessagePayload) -> None:
def dispatch(self, msg: ParsedMessagePayload) -> None:
id = msg.get("id")
if id:
callback = self._callbacks.pop(id)
Expand Down Expand Up @@ -280,35 +277,36 @@ def _create_remote_object(
self._waiting_for_object.pop(guid)(result)
return result

def _replace_channels_with_guids(self, payload: Any, param_name: str) -> Any:
def _replace_channels_with_guids(
self,
payload: Any,
) -> Any:
if payload is None:
return payload
if isinstance(payload, Path):
return str(payload)
if isinstance(payload, list):
return list(
map(lambda p: self._replace_channels_with_guids(p, "index"), payload)
)
return list(map(self._replace_channels_with_guids, payload))
if isinstance(payload, Channel):
return dict(guid=payload._guid)
if isinstance(payload, dict):
result = {}
for key in payload:
result[key] = self._replace_channels_with_guids(payload[key], key)
for key, value in payload.items():
result[key] = self._replace_channels_with_guids(value)
return result
return payload

def _replace_guids_with_channels(self, payload: Any) -> Any:
if payload is None:
return payload
if isinstance(payload, list):
return list(map(lambda p: self._replace_guids_with_channels(p), payload))
return list(map(self._replace_guids_with_channels, payload))
if isinstance(payload, dict):
if payload.get("guid") in self._objects:
return self._objects[payload["guid"]]._channel
result = {}
for key in payload:
result[key] = self._replace_guids_with_channels(payload[key])
for key, value in payload.items():
result[key] = self._replace_guids_with_channels(value)
return result
return payload

Expand Down
2 changes: 1 addition & 1 deletion playwright/async_api/_context_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ async def __aenter__(self) -> AsyncPlaywright:
loop,
)
loop.create_task(self._connection.run())
playwright_future = self._connection.get_playwright_future()
playwright_future = self._connection.playwright_future

done, pending = await asyncio.wait(
{self._connection._transport.on_error_future, playwright_future},
Expand Down