Skip to content

Commit 7331949

Browse files
committed
Bug 1573910 [wpt PR 17239] - WebView support, a=testonly
Automatic update from web-platform-tests Add android_webview to products crbug.com/992947 -- wpt-commits: 7ce48248652b528f3a80b38c68556720baa8f486 wpt-pr: 17239 UltraBlame original commit: c8268335f83d44f9a4dcccc2314cffd7c33eefd1
1 parent 2138395 commit 7331949

File tree

5 files changed

+203
-10
lines changed

5 files changed

+203
-10
lines changed

testing/web-platform/tests/tools/wpt/browser.py

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -581,25 +581,25 @@ def version(self, binary=None, webdriver_binary=None):
581581
return m.group(1)
582582

583583

584-
class ChromeAndroid(Browser):
585-
"""Chrome-specific interface for Android.
584+
class ChromeAndroidBase(Browser):
585+
"""A base class for ChromeAndroid and AndroidWebView.
586586
587+
On Android, WebView is based on Chromium open source project, and on some
588+
versions of Android we share the library with Chrome. Therefore, we have
589+
a very similar WPT runner implementation.
587590
Includes webdriver installation.
588591
"""
589-
590-
product = "chrome_android"
591-
requirements = "requirements_chrome_android.txt"
592+
__metaclass__ = ABCMeta
592593

593594
def __init__(self, logger):
594-
super(ChromeAndroid, self).__init__(logger)
595+
super(ChromeAndroidBase, self).__init__(logger)
595596

596597
def install(self, dest=None, channel=None):
597598
raise NotImplementedError
598599

600+
@abstractmethod
599601
def find_binary(self, venv_path=None, channel=None):
600-
if channel in ("beta", "dev", "canary"):
601-
return "com.chrome." + channel
602-
return "com.android.chrome"
602+
raise NotImplementedError
603603

604604
def find_webdriver(self, channel=None):
605605
return find_executable("chromedriver")
@@ -629,6 +629,49 @@ def version(self, binary=None, webdriver_binary=None):
629629
return match.group(1)
630630

631631

632+
class ChromeAndroid(ChromeAndroidBase):
633+
"""Chrome-specific interface for Android.
634+
"""
635+
636+
product = "chrome_android"
637+
requirements = "requirements_chrome_android.txt"
638+
639+
def find_binary(self, venv_path=None, channel=None):
640+
if channel in ("beta", "dev", "canary"):
641+
return "com.chrome." + channel
642+
return "com.android.chrome"
643+
644+
645+
class AndroidWebview(ChromeAndroidBase):
646+
"""Webview-specific interface for Android.
647+
648+
Design doc:
649+
https://docs.google.com/document/d/19cGz31lzCBdpbtSC92svXlhlhn68hrsVwSB7cfZt54o/view
650+
"""
651+
652+
product = "android_webview"
653+
requirements = "requirements_android_webview.txt"
654+
655+
def find_binary(self, venv_path=None, channel=None):
656+
657+
658+
659+
660+
command = ['adb', 'shell', 'dumpsys', 'webviewupdate']
661+
try:
662+
output = call(*command)
663+
except (subprocess.CalledProcessError, OSError):
664+
self.logger.warning("Failed to call %s" % " ".join(command))
665+
return None
666+
m = re.search(r'^\s*Current WebView package \(name, version\): \((.*), ([0-9.]*)\)$',
667+
output, re.M)
668+
if m is None:
669+
self.logger.warning("Unable to find current WebView package in dumpsys output")
670+
return None
671+
self.logger.warning("Final package name: " + m.group(1))
672+
return m.group(1)
673+
674+
632675
class ChromeiOS(Browser):
633676
"""Chrome-specific interface for iOS.
634677
"""

testing/web-platform/tests/tools/wpt/run.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,29 @@ def setup_kwargs(self, kwargs):
341341
raise WptrunError("Unable to locate or install chromedriver binary")
342342

343343

344+
class AndroidWebview(BrowserSetup):
345+
name = "android_webview"
346+
browser_cls = browser.AndroidWebview
347+
348+
def setup_kwargs(self, kwargs):
349+
if kwargs["webdriver_binary"] is None:
350+
webdriver_binary = self.browser.find_webdriver()
351+
352+
if webdriver_binary is None:
353+
install = self.prompt_install("chromedriver")
354+
355+
if install:
356+
logger.info("Downloading chromedriver")
357+
webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
358+
else:
359+
logger.info("Using webdriver binary %s" % webdriver_binary)
360+
361+
if webdriver_binary:
362+
kwargs["webdriver_binary"] = webdriver_binary
363+
else:
364+
raise WptrunError("Unable to locate or install chromedriver binary")
365+
366+
344367
class Opera(BrowserSetup):
345368
name = "opera"
346369
browser_cls = browser.Opera
@@ -532,6 +555,7 @@ def setup_kwargs(self, kwargs):
532555

533556

534557
product_setup = {
558+
"android_webview": AndroidWebview,
535559
"firefox": Firefox,
536560
"firefox_android": FirefoxAndroid,
537561
"chrome": Chrome,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mozprocess==1.0.0

testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
module global scope.
2323
"""
2424

25-
product_list = ["chrome",
25+
product_list = ["android_webview",
26+
"chrome",
2627
"chrome_android",
2728
"chrome_ios",
2829
"edgechromium",
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import subprocess
2+
3+
from .base import Browser, ExecutorBrowser, require_arg
4+
from .base import get_timeout_multiplier
5+
from .chrome import executor_kwargs as chrome_executor_kwargs
6+
from ..webdriver_server import ChromeDriverServer
7+
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,
8+
WebDriverRefTestExecutor)
9+
from ..executors.executorchrome import ChromeDriverWdspecExecutor
10+
11+
12+
__wptrunner__ = {"product": "android_webview",
13+
"check_args": "check_args",
14+
"browser": "SystemWebViewShell",
15+
"executor": {"testharness": "WebDriverTestharnessExecutor",
16+
"reftest": "WebDriverRefTestExecutor",
17+
"wdspec": "ChromeDriverWdspecExecutor"},
18+
"browser_kwargs": "browser_kwargs",
19+
"executor_kwargs": "executor_kwargs",
20+
"env_extras": "env_extras",
21+
"env_options": "env_options",
22+
"timeout_multiplier": "get_timeout_multiplier"}
23+
24+
_wptserve_ports = set()
25+
26+
27+
def check_args(**kwargs):
28+
require_arg(kwargs, "webdriver_binary")
29+
30+
31+
def browser_kwargs(test_type, run_info_data, config, **kwargs):
32+
return {"binary": kwargs["binary"],
33+
"webdriver_binary": kwargs["webdriver_binary"],
34+
"webdriver_args": kwargs.get("webdriver_args")}
35+
36+
37+
def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
38+
**kwargs):
39+
40+
_wptserve_ports.update(set(
41+
server_config['ports']['http'] + server_config['ports']['https'] +
42+
server_config['ports']['ws'] + server_config['ports']['wss']
43+
))
44+
45+
executor_kwargs = chrome_executor_kwargs(test_type, server_config,
46+
cache_manager, run_info_data,
47+
**kwargs)
48+
del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"]
49+
del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"]
50+
capabilities = executor_kwargs["capabilities"]
51+
52+
53+
capabilities["goog:chromeOptions"]["androidPackage"] = \
54+
"org.chromium.webview_shell"
55+
capabilities["goog:chromeOptions"]["androidActivity"] = ".WebPlatformTestsActivity"
56+
57+
58+
executor_kwargs["pause_after_test"] = False
59+
60+
executor_kwargs["restart_after_test"] = True
61+
executor_kwargs["close_after_done"] = False
62+
return executor_kwargs
63+
64+
65+
def env_extras(**kwargs):
66+
return []
67+
68+
69+
def env_options():
70+
return {}
71+
72+
73+
74+
class SystemWebViewShell(Browser):
75+
"""Chrome is backed by chromedriver, which is supplied through
76+
``wptrunner.webdriver.ChromeDriverServer``.
77+
"""
78+
79+
def __init__(self, logger, binary, webdriver_binary="chromedriver",
80+
webdriver_args=None):
81+
"""Creates a new representation of Chrome. The `binary` argument gives
82+
the browser binary to use for testing."""
83+
Browser.__init__(self, logger)
84+
self.binary = binary
85+
self.server = ChromeDriverServer(self.logger,
86+
binary=webdriver_binary,
87+
args=webdriver_args)
88+
self.setup_adb_reverse()
89+
90+
def _adb_run(self, args):
91+
self.logger.info('adb ' + ' '.join(args))
92+
subprocess.check_call(['adb'] + args)
93+
94+
def setup_adb_reverse(self):
95+
self._adb_run(['wait-for-device'])
96+
self._adb_run(['forward', '--remove-all'])
97+
self._adb_run(['reverse', '--remove-all'])
98+
99+
100+
for port in _wptserve_ports:
101+
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
102+
103+
def start(self, **kwargs):
104+
self.server.start(block=False)
105+
106+
def stop(self, force=False):
107+
self.server.stop(force=force)
108+
109+
def pid(self):
110+
return self.server.pid
111+
112+
def is_alive(self):
113+
114+
115+
116+
return self.server.is_alive()
117+
118+
def cleanup(self):
119+
self.stop()
120+
self._adb_run(['forward', '--remove-all'])
121+
self._adb_run(['reverse', '--remove-all'])
122+
123+
def executor_browser(self):
124+
return ExecutorBrowser, {"webdriver_url": self.server.url}

0 commit comments

Comments
 (0)