tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 019c8e773605623871b7d4fd5a85e6ae7869abbb
parent 587252f1a8b89e386f4b6769976f67af17b6ec49
Author: Maksim Sadym <69349599+sadym-chromium@users.noreply.github.com>
Date:   Wed, 15 Oct 2025 09:00:01 +0000

Bug 1994236 [wpt PR 55355] - [wdspec] fail pending commands on closed websocket, a=testonly

Automatic update from web-platform-tests
[wdspec] fail pending commands on closed websocket (#55355)

When a websocket connection is closed, pending commands remain in a pending state, causing tests to time out. This change ensures commands fail immediately upon connection closure, preventing the tests from waiting for the timeout.

Co-authored-by: Henrik Skupin <mail@hskupin.info>
--

wpt-commits: 70bf03f4ab64c5bf4cdeced6ffaea864fef7fd78
wpt-pr: 55355

Diffstat:
Mtesting/web-platform/tests/tools/webdriver/webdriver/bidi/client.py | 12++++++++++--
Mtesting/web-platform/tests/tools/webdriver/webdriver/bidi/transport.py | 9+++++++--
2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/client.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/client.py @@ -6,7 +6,7 @@ from typing import Any, Awaitable, Callable, List, Optional, Mapping, MutableMap from urllib.parse import urljoin, urlparse from . import modules -from .error import from_error_details +from .error import from_error_details, UnknownErrorException from .transport import Transport @@ -144,7 +144,10 @@ class BidiSession: async def start_transport(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: if self.transport is None: - self.transport = Transport(self.websocket_url, self.on_message, loop=loop) + self.transport = Transport(self.websocket_url, + self.on_message, + loop=loop, + on_closed=self.on_transport_closed) await self.transport.start() elif loop is not None and loop is not self.event_loop: raise ValueError("Transport with a different event loop already exists") @@ -159,6 +162,11 @@ class BidiSession: self.session_id, self.capabilities = await self.session.new( # type: ignore capabilities=self.requested_capabilities) + def on_transport_closed(self): + for future in self.pending_commands.values(): + if future is not None and not future.done(): + future.set_exception(UnknownErrorException("WebSocket connection closed")) + async def send_command( self, method: str, diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/transport.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/transport.py @@ -25,12 +25,15 @@ def get_running_loop() -> asyncio.AbstractEventLoop: class Transport: """Low level message handler for the WebSockets connection""" def __init__(self, url: str, - msg_handler: Callable[[Mapping[str, Any]], Coroutine[Any, Any, None]], - loop: Optional[asyncio.AbstractEventLoop] = None): + msg_handler: Callable[ + [Mapping[str, Any]], Coroutine[Any, Any, None]], + loop: Optional[asyncio.AbstractEventLoop] = None, + on_closed: Optional[Callable[[], None]] = None): self.url = url self.connection: Optional[websockets.WebSocketClientProtocol] = None self.msg_handler = msg_handler self.send_buf: List[Mapping[str, Any]] = [] + self.on_closed = on_closed if loop is None: loop = get_running_loop() @@ -81,6 +84,8 @@ class Transport: await self.handle(msg) except ConnectionClosed: logger.debug("connection closed while reading messages") + if self.on_closed: + self.on_closed() async def wait_closed(self) -> None: if self.connection and not self.connection.closed: