diff --git a/tools/wptrunner/wptrunner/browsers/chrome.py b/tools/wptrunner/wptrunner/browsers/chrome.py index b39b8deb76c958..d9d3ed166e10c5 100644 --- a/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tools/wptrunner/wptrunner/browsers/chrome.py @@ -6,7 +6,7 @@ from mozlog.structuredlog import StructuredLogger from . import chrome_spki_certs -from .base import BrowserError +from .base import BrowserError, BrowserSettings from .base import WebDriverBrowser, require_arg from .base import NullBrowser # noqa: F401 from .base import OutputHandler @@ -41,6 +41,8 @@ "update_properties": "update_properties", "timeout_multiplier": "get_timeout_multiplier",} +from ..wpttest import Test + def debug_args(debug_info): if debug_info.interactive: @@ -214,6 +216,7 @@ def __init__(self, super().__init__(logger, **kwargs) self._leak_check = leak_check self._actual_port = None + self._require_webdriver_bidi = None def restart_on_test_type_change(self, new_test_type: str, old_test_type: str) -> bool: # Restart the test runner when switch from/to wdspec tests. Wdspec test @@ -262,6 +265,20 @@ def executor_browser(self): browser_cls, browser_kwargs = super().executor_browser() return browser_cls, {**browser_kwargs, "leak_check": self._leak_check} + @property + def require_webdriver_bidi(self) -> Optional[bool]: + return self._require_webdriver_bidi + + def settings(self, test: Test) -> BrowserSettings: + """ Required to store `require_webdriver_bidi` in browser settings.""" + settings = super().settings(test) + self._require_webdriver_bidi = test.testdriver_features is not None and 'bidi' in test.testdriver_features + + return { + **settings, + "require_webdriver_bidi": self._require_webdriver_bidi + } + class ChromeDriverOutputHandler(OutputHandler): PORT_RE = re.compile(rb'.*was started successfully on port (\d+)\.') diff --git a/tools/wptrunner/wptrunner/executors/executorchrome.py b/tools/wptrunner/wptrunner/executors/executorchrome.py index fa593ce4023106..5007be0741482b 100644 --- a/tools/wptrunner/wptrunner/executors/executorchrome.py +++ b/tools/wptrunner/wptrunner/executors/executorchrome.py @@ -20,6 +20,7 @@ WebDriverFedCMProtocolPart, WebDriverPrintRefTestExecutor, WebDriverProtocol, + WebDriverBidiProtocol, WebDriverRefTestExecutor, WebDriverTestharnessExecutor, WebDriverTestharnessProtocolPart, @@ -211,6 +212,28 @@ def __init__(self, executor, browser, capabilities, **kwargs): super().__init__(executor, browser, capabilities, **kwargs) +# TODO: simplify +class ChromeDriverBidiProtocol(WebDriverBidiProtocol): + implements = [ + ChromeDriverBaseProtocolPart, + ChromeDriverDevToolsProtocolPart, + ChromeDriverFedCMProtocolPart, + ChromeDriverTestharnessProtocolPart, + ] + for base_part in WebDriverBidiProtocol.implements: + if base_part.name not in {part.name for part in implements}: + implements.append(base_part) + + # Prefix to apply to vendor-specific WebDriver extension commands. + vendor_prefix = "goog" + + def __init__(self, executor, browser, capabilities, **kwargs): + self.implements = list(ChromeDriverBidiProtocol.implements) + if getattr(browser, "leak_check", False): + self.implements.append(ChromeDriverLeakProtocolPart) + super().__init__(executor, browser, capabilities, **kwargs) + + def _evaluate_leaks(executor_cls): if hasattr(executor_cls, "base_convert_result"): # Don't wrap more than once, which can cause unbounded recursion. @@ -244,9 +267,17 @@ class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # @_evaluate_leaks class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixin): # type: ignore - protocol_cls = ChromeDriverProtocol - def __init__(self, *args, reuse_window=False, **kwargs): + require_webdriver_bidi = kwargs.get("browser_settings", {}).get("require_webdriver_bidi", + None) + + print(f"!!@@## ChromeDriverTestharnessExecutor, require_webdriver_bidi: {require_webdriver_bidi}") + + if require_webdriver_bidi: + self.protocol_cls = ChromeDriverBidiProtocol + else: + self.protocol_cls = ChromeDriverProtocol + super().__init__(*args, **kwargs) self.reuse_window = reuse_window