Commit 6a152ab1 authored by Robert Ma's avatar Robert Ma Committed by Commit Bot

Roll chromium wpt tools to right before MANIFEST v8

This will be the last roll before we have to rewrite WPTManifest in
blinkpy or migrate to wptrunner.

--ignore-glob has been upstreamed in
https://github.com/web-platform-tests/wpt/pull/20242 so the patch is
removed.

Change-Id: Id9683a351eb7b465dfebc08aa8ae638f5b791754
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2050731
Commit-Queue: Robert Ma <robertma@chromium.org>
Reviewed-by: default avatarLuke Z <lpz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#740834}
parent 6f8d7ca4
...@@ -32,7 +32,7 @@ Local Modifications: None ...@@ -32,7 +32,7 @@ Local Modifications: None
Name: web-platform-tests - Test Suites for Web Platform specifications Name: web-platform-tests - Test Suites for Web Platform specifications
Short Name: wpt Short Name: wpt
URL: https://github.com/web-platform-tests/wpt/ URL: https://github.com/web-platform-tests/wpt/
Version: eb55d6105892b783a8bfeb3a34b251171fe2228b Version: 3061f228d3d8b900b3aec8c7642ff58fc04ea011
License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html) License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html)
License File: wpt/wpt/LICENSE.md License File: wpt/wpt/LICENSE.md
Security Critical: no Security Critical: no
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
./tools/__init__.py ./tools/__init__.py
./tools/ci/commands.json ./tools/ci/commands.json
./tools/conftest.py ./tools/conftest.py
./tools/docker/commands.json
./tools/gitignore/__init__.py ./tools/gitignore/__init__.py
./tools/gitignore/gitignore.py ./tools/gitignore/gitignore.py
./tools/lint/__init__.py ./tools/lint/__init__.py
......
...@@ -9,7 +9,7 @@ cd $DIR ...@@ -9,7 +9,7 @@ cd $DIR
TARGET_DIR=$DIR/wpt TARGET_DIR=$DIR/wpt
REMOTE_REPO="https://github.com/web-platform-tests/wpt.git" REMOTE_REPO="https://github.com/web-platform-tests/wpt.git"
WPT_HEAD=eb55d6105892b783a8bfeb3a34b251171fe2228b WPT_HEAD=3061f228d3d8b900b3aec8c7642ff58fc04ea011
function clone { function clone {
# Remove existing repo if already exists. # Remove existing repo if already exists.
......
diff --git a/tools/lint/lint.py b/tools/lint/lint.py
index 6a71dc860f..5b156b1c45 100644
--- a/tools/lint/lint.py
+++ b/tools/lint/lint.py
@@ -818,6 +818,7 @@ def create_parser():
help="Output markdown")
parser.add_argument("--repo-root", help="The WPT directory. Use this"
"option if the lint script exists outside the repository")
+ parser.add_argument("--ignore-glob", help="Additional file glob to ignore.")
parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole "
"working directory, not just files that changed")
return parser
@@ -841,17 +842,22 @@ def main(**kwargs):
paths = lint_paths(kwargs, repo_root)
- return lint(repo_root, paths, output_format)
+ ignore_glob = kwargs.get("ignore_glob")
+ return lint(repo_root, paths, output_format, ignore_glob)
-def lint(repo_root, paths, output_format):
- # type: (str, List[str], str) -> int
+
+def lint(repo_root, paths, output_format, ignore_glob):
+ # type: (str, List[str], str, str) -> int
error_count = defaultdict(int) # type: Dict[Text, int]
last = None
with open(os.path.join(repo_root, "lint.whitelist")) as f:
whitelist, ignored_files = parse_whitelist(f)
+ if ignore_glob:
+ ignored_files.add(ignore_glob)
+
output_errors = {"json": output_errors_json,
"markdown": output_errors_markdown,
"normal": output_errors_text}[output_format]
diff --git a/tools/wpt/paths b/tools/wpt/paths diff --git a/tools/wpt/paths b/tools/wpt/paths
index 4528222fbf..93c97dc02b 100644 index 4528222fbf..93c97dc02b 100644
--- a/tools/wpt/paths --- a/tools/wpt/paths
+++ b/tools/wpt/paths +++ b/tools/wpt/paths
@@ -1,6 +1,4 @@ @@ -1,5 +1,3 @@
-tools/ci/ -tools/ci/
-tools/docker/
tools/lint/ tools/lint/
tools/manifest/ tools/manifest/
tools/serve/ tools/serve/
-tools/taskcluster/
tools/wpt/ tools/wpt/
{
"docker-run": {"path": "frontend.py", "script": "run", "parser": "parser_run", "help": "Run wpt docker image",
"virtualenv": false},
"docker-build": {"path": "frontend.py", "script": "build", "help": "Build wpt docker image",
"virtualenv": false}
}
...@@ -269,7 +269,7 @@ class PathFilter(object): ...@@ -269,7 +269,7 @@ class PathFilter(object):
target.append(item) target.append(item)
dirnames[:] = keep_dirs dirnames[:] = keep_dirs
assert ".git" not in dirnames assert not any(".git" == name for name, _ in dirnames)
yield orig_dirpath, dirnames, keep_files yield orig_dirpath, dirnames, keep_files
def __call__(self, def __call__(self,
......
...@@ -843,7 +843,7 @@ def create_parser(): ...@@ -843,7 +843,7 @@ def create_parser():
help="Output machine-readable JSON format") help="Output machine-readable JSON format")
parser.add_argument("--markdown", action="store_true", parser.add_argument("--markdown", action="store_true",
help="Output markdown") help="Output markdown")
parser.add_argument("--repo-root", help="The WPT directory. Use this" parser.add_argument("--repo-root", help="The WPT directory. Use this "
"option if the lint script exists outside the repository") "option if the lint script exists outside the repository")
parser.add_argument("--ignore-glob", help="Additional file glob to ignore.") parser.add_argument("--ignore-glob", help="Additional file glob to ignore.")
parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole " parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole "
......
...@@ -351,7 +351,7 @@ class RoutesBuilder(object): ...@@ -351,7 +351,7 @@ class RoutesBuilder(object):
if headers is None: if headers is None:
headers = {} headers = {}
handler = handlers.StaticHandler(path, format_args, content_type, **headers) handler = handlers.StaticHandler(path, format_args, content_type, **headers)
self.add_handler(b"GET", str(route), handler) self.add_handler("GET", str(route), handler)
def add_mount_point(self, url_base, path): def add_mount_point(self, url_base, path):
url_base = "/%s/" % url_base.strip("/") if url_base != "/" else "/" url_base = "/%s/" % url_base.strip("/") if url_base != "/" else "/"
......
...@@ -737,6 +737,10 @@ class Element(object): ...@@ -737,6 +737,10 @@ class Element(object):
def selected(self): def selected(self):
return self.send_element_command("GET", "selected") return self.send_element_command("GET", "selected")
@command
def screenshot(self):
return self.send_element_command("GET", "screenshot")
@command @command
def attribute(self, name): def attribute(self, name):
return self.send_element_command("GET", "attribute/%s" % name) return self.send_element_command("GET", "attribute/%s" % name)
......
...@@ -6,14 +6,14 @@ import stat ...@@ -6,14 +6,14 @@ import stat
import errno import errno
import subprocess import subprocess
import tempfile import tempfile
import urlparse
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from datetime import datetime, timedelta from datetime import datetime, timedelta
from distutils.spawn import find_executable from distutils.spawn import find_executable
from six.moves.urllib.parse import urlsplit
import requests import requests
from utils import call, get, untar, unzip from .utils import call, get, untar, unzip
uname = platform.uname() uname = platform.uname()
...@@ -41,6 +41,14 @@ def handle_remove_readonly(func, path, exc): ...@@ -41,6 +41,14 @@ def handle_remove_readonly(func, path, exc):
raise raise
def get_ext(filename):
"""Get the extension from a filename with special handling for .tar.foo"""
name, ext = os.path.splitext(filename)
if name.endswith(".tar"):
ext = ".tar%s" % ext
return ext
class Browser(object): class Browser(object):
__metaclass__ = ABCMeta __metaclass__ = ABCMeta
...@@ -48,8 +56,13 @@ class Browser(object): ...@@ -48,8 +56,13 @@ class Browser(object):
self.logger = logger self.logger = logger
@abstractmethod @abstractmethod
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
"""Download a package or installer for the browser""" """Download a package or installer for the browser
:param dest: Directory in which to put the dowloaded package
:param channel: Browser channel to download
:param rename: Optional name for the downloaded package; the original
extension is preserved.
"""
return NotImplemented return NotImplemented
@abstractmethod @abstractmethod
...@@ -133,7 +146,7 @@ class Firefox(Browser): ...@@ -133,7 +146,7 @@ class Firefox(Browser):
return dest return dest
def download(self, dest=None, channel="nightly"): def download(self, dest=None, channel="nightly", rename=None):
product = { product = {
"nightly": "firefox-nightly-latest-ssl", "nightly": "firefox-nightly-latest-ssl",
"beta": "firefox-beta-latest-ssl", "beta": "firefox-beta-latest-ssl",
...@@ -172,11 +185,14 @@ class Firefox(Browser): ...@@ -172,11 +185,14 @@ class Firefox(Browser):
filename = filenames[0] filename = filenames[0]
if not filename: if not filename:
filename = urlparse.urlsplit(resp.url).path.rsplit("/", 1)[1] filename = urlsplit(resp.url).path.rsplit("/", 1)[1]
if not filename: if not filename:
filename = "firefox.tar.bz2" filename = "firefox.tar.bz2"
if rename:
filename = "%s%s" % (rename, get_ext(filename))
installer_path = os.path.join(dest, filename) installer_path = os.path.join(dest, filename)
with open(installer_path, "wb") as f: with open(installer_path, "wb") as f:
...@@ -441,7 +457,7 @@ class FirefoxAndroid(Browser): ...@@ -441,7 +457,7 @@ class FirefoxAndroid(Browser):
product = "firefox_android" product = "firefox_android"
requirements = "requirements_firefox.txt" requirements = "requirements_firefox.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
if dest is None: if dest is None:
dest = os.pwd dest = os.pwd
...@@ -464,7 +480,10 @@ class FirefoxAndroid(Browser): ...@@ -464,7 +480,10 @@ class FirefoxAndroid(Browser):
(task_id, "public/build/geckoview-androidTest.apk")) (task_id, "public/build/geckoview-androidTest.apk"))
resp.raise_for_status() resp.raise_for_status()
apk_path = os.path.join(dest, "geckoview-androidTest.apk") filename = "geckoview-androidTest.apk"
if rename:
filename = "%s%s" % (rename, get_ext(filename)[1])
apk_path = os.path.join(dest, filename)
with open(apk_path, "wb") as f: with open(apk_path, "wb") as f:
f.write(resp.content) f.write(resp.content)
...@@ -500,7 +519,7 @@ class Chrome(Browser): ...@@ -500,7 +519,7 @@ class Chrome(Browser):
product = "chrome" product = "chrome"
requirements = "requirements_chrome.txt" requirements = "requirements_chrome.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -658,7 +677,7 @@ class ChromeAndroidBase(Browser): ...@@ -658,7 +677,7 @@ class ChromeAndroidBase(Browser):
super(ChromeAndroidBase, self).__init__(logger) super(ChromeAndroidBase, self).__init__(logger)
self.device_serial = None self.device_serial = None
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -766,7 +785,7 @@ class ChromeiOS(Browser): ...@@ -766,7 +785,7 @@ class ChromeiOS(Browser):
product = "chrome_ios" product = "chrome_ios"
requirements = "requirements_chrome_ios.txt" requirements = "requirements_chrome_ios.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -802,7 +821,7 @@ class Opera(Browser): ...@@ -802,7 +821,7 @@ class Opera(Browser):
self.logger.warning("Unable to find the browser binary.") self.logger.warning("Unable to find the browser binary.")
return None return None
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -874,7 +893,7 @@ class EdgeChromium(Browser): ...@@ -874,7 +893,7 @@ class EdgeChromium(Browser):
edgedriver_name = "msedgedriver" edgedriver_name = "msedgedriver"
requirements = "requirements_edge_chromium.txt" requirements = "requirements_edge_chromium.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -888,8 +907,10 @@ class EdgeChromium(Browser): ...@@ -888,8 +907,10 @@ class EdgeChromium(Browser):
if not binary: if not binary:
# Use paths from different Edge channels starting with Release\Beta\Dev\Canary # Use paths from different Edge channels starting with Release\Beta\Dev\Canary
winpaths = [os.path.expanduser("~\\AppData\\Local\\Microsoft\\Edge\\Application"), winpaths = [os.path.expanduser("~\\AppData\\Local\\Microsoft\\Edge\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Beta\\Application"), os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Beta\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Dev\\Application"), os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Dev\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Beta\\Application"), os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Beta\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Dev\\Application"), os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Dev\\Application"),
os.path.expanduser("~\\AppData\Local\\Microsoft\\Edge SxS\\Application")] os.path.expanduser("~\\AppData\Local\\Microsoft\\Edge SxS\\Application")]
...@@ -973,7 +994,7 @@ class Edge(Browser): ...@@ -973,7 +994,7 @@ class Edge(Browser):
product = "edge" product = "edge"
requirements = "requirements_edge.txt" requirements = "requirements_edge.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -1007,7 +1028,7 @@ class InternetExplorer(Browser): ...@@ -1007,7 +1028,7 @@ class InternetExplorer(Browser):
product = "ie" product = "ie"
requirements = "requirements_ie.txt" requirements = "requirements_ie.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -1035,7 +1056,7 @@ class Safari(Browser): ...@@ -1035,7 +1056,7 @@ class Safari(Browser):
product = "safari" product = "safari"
requirements = "requirements_safari.txt" requirements = "requirements_safari.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -1066,11 +1087,11 @@ class Safari(Browser): ...@@ -1066,11 +1087,11 @@ class Safari(Browser):
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
self.logger.warning("Failed to call %s --version" % webdriver_binary) self.logger.warning("Failed to call %s --version" % webdriver_binary)
return None return None
m = re.match(r"Included with Safari (.*)", version_string) m = re.match(br"Included with Safari (.*)", version_string)
if not m: if not m:
self.logger.warning("Failed to extract version from: %s" % version_string) self.logger.warning("Failed to extract version from: %s" % version_string)
return None return None
return m.group(1) return m.group(1).decode()
class Servo(Browser): class Servo(Browser):
...@@ -1105,14 +1126,15 @@ class Servo(Browser): ...@@ -1105,14 +1126,15 @@ class Servo(Browser):
url = "https://download.servo.org/nightly/%s/servo-latest%s" % (platform, extension) url = "https://download.servo.org/nightly/%s/servo-latest%s" % (platform, extension)
return get(url) return get(url)
def download(self, dest=None, channel="nightly"): def download(self, dest=None, channel="nightly", rename=None):
if dest is None: if dest is None:
dest = os.pwd dest = os.pwd
resp = self._get(dest, channel) resp = self._get(dest, channel)
_, extension, _ = self.platform_components() _, extension, _ = self.platform_components()
with open(os.path.join(dest, "servo-latest%s" % (extension,)), "w") as f: filename = rename if rename is not None else "servo-latest"
with open(os.path.join(dest, "%s%s" % (filename, extension,)), "w") as f:
f.write(resp.content) f.write(resp.content)
def install(self, dest=None, channel="nightly"): def install(self, dest=None, channel="nightly"):
...@@ -1159,7 +1181,7 @@ class Sauce(Browser): ...@@ -1159,7 +1181,7 @@ class Sauce(Browser):
product = "sauce" product = "sauce"
requirements = "requirements_sauce.txt" requirements = "requirements_sauce.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -1184,7 +1206,7 @@ class WebKit(Browser): ...@@ -1184,7 +1206,7 @@ class WebKit(Browser):
product = "webkit" product = "webkit"
requirements = "requirements_webkit.txt" requirements = "requirements_webkit.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
...@@ -1212,7 +1234,7 @@ class WebKitGTKMiniBrowser(WebKit): ...@@ -1212,7 +1234,7 @@ class WebKitGTKMiniBrowser(WebKit):
gcc = find_executable("gcc") gcc = find_executable("gcc")
if gcc: if gcc:
try: try:
triplet = call(gcc, "-dumpmachine").strip() triplet = call(gcc, "-dumpmachine").decode().strip()
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
pass pass
# Add Debian/Ubuntu path # Add Debian/Ubuntu path
...@@ -1231,7 +1253,7 @@ class WebKitGTKMiniBrowser(WebKit): ...@@ -1231,7 +1253,7 @@ class WebKitGTKMiniBrowser(WebKit):
if binary is None: if binary is None:
return None return None
try: # WebKitGTK MiniBrowser before 2.26.0 doesn't support --version try: # WebKitGTK MiniBrowser before 2.26.0 doesn't support --version
output = call(binary, "--version").strip() output = call(binary, "--version").decode().strip()
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
return None return None
# Example output: "WebKitGTK 2.26.1" # Example output: "WebKitGTK 2.26.1"
...@@ -1250,7 +1272,7 @@ class Epiphany(Browser): ...@@ -1250,7 +1272,7 @@ class Epiphany(Browser):
product = "epiphany" product = "epiphany"
requirements = "requirements_epiphany.txt" requirements = "requirements_epiphany.txt"
def download(self, dest=None, channel=None): def download(self, dest=None, channel=None, rename=None):
raise NotImplementedError raise NotImplementedError
def install(self, dest=None, channel=None): def install(self, dest=None, channel=None):
......
import argparse import argparse
import browser
import sys import sys
from . import browser
latest_channels = { latest_channels = {
'firefox': 'nightly', 'firefox': 'nightly',
...@@ -44,6 +43,9 @@ def get_parser(): ...@@ -44,6 +43,9 @@ def get_parser():
'latest browser release on the selected channel.') 'latest browser release on the selected channel.')
parser.add_argument('--download-only', action="store_true", parser.add_argument('--download-only', action="store_true",
help="Download the selected component but don't install it") help="Download the selected component but don't install it")
parser.add_argument('--rename', action="store", default=None,
help="Filename, excluding extension for downloaded archive "
"(only with --download-only)")
parser.add_argument('-d', '--destination', parser.add_argument('-d', '--destination',
help='filesystem directory to place the component') help='filesystem directory to place the component')
return parser return parser
...@@ -76,10 +78,11 @@ def run(venv, **kwargs): ...@@ -76,10 +78,11 @@ def run(venv, **kwargs):
"No --destination argument, and no default for the environment") "No --destination argument, and no default for the environment")
install(browser, kwargs["component"], destination, channel, install(browser, kwargs["component"], destination, channel,
download_only=kwargs["download_only"]) download_only=kwargs["download_only"], rename=kwargs["rename"])
def install(name, component, destination, channel="nightly", logger=None, download_only=False): def install(name, component, destination, channel="nightly", logger=None, download_only=False,
rename=None):
if logger is None: if logger is None:
import logging import logging
logger = logging.getLogger("install") logger = logging.getLogger("install")
...@@ -91,6 +94,9 @@ def install(name, component, destination, channel="nightly", logger=None, downlo ...@@ -91,6 +94,9 @@ def install(name, component, destination, channel="nightly", logger=None, downlo
subclass = getattr(browser, name.title()) subclass = getattr(browser, name.title())
sys.stdout.write('Now installing %s %s...\n' % (name, component)) sys.stdout.write('Now installing %s %s...\n' % (name, component))
path = getattr(subclass(logger), method)(dest=destination, channel=channel) kwargs = {}
if download_only and rename:
kwargs["rename"] = rename
path = getattr(subclass(logger), method)(dest=destination, channel=channel, **kwargs)
if path: if path:
sys.stdout.write('Binary %s as %s\n' % ("downloaded" if download_only else "installed", path,)) sys.stdout.write('Binary %s as %s\n' % ("downloaded" if download_only else "installed", path,))
tools/ci/
tools/docker/
tools/lint/ tools/lint/
tools/manifest/ tools/manifest/
tools/serve/ tools/serve/
......
...@@ -705,8 +705,9 @@ def setup_logging(kwargs, default_config=None, formatter_defaults=None): ...@@ -705,8 +705,9 @@ def setup_logging(kwargs, default_config=None, formatter_defaults=None):
def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs):
from wptrunner import wptcommandline from wptrunner import wptcommandline
from six import iteritems
kwargs = utils.Kwargs(kwargs.iteritems()) kwargs = utils.Kwargs(iteritems(kwargs))
product_parts = kwargs["product"].split(":") product_parts = kwargs["product"].split(":")
kwargs["product"] = product_parts[0].replace("-", "_") kwargs["product"] = product_parts[0].replace("-", "_")
......
...@@ -247,7 +247,7 @@ def affected_testfiles(files_changed, # type: Iterable[Text] ...@@ -247,7 +247,7 @@ def affected_testfiles(files_changed, # type: Iterable[Text]
nontests_changed = set(files_changed) nontests_changed = set(files_changed)
wpt_manifest = load_manifest(manifest_path, manifest_update) wpt_manifest = load_manifest(manifest_path, manifest_update)
test_types = ["testharness", "reftest", "wdspec"] test_types = ["crashtest", "testharness", "reftest", "wdspec"]
support_files = {os.path.join(wpt_root, path) support_files = {os.path.join(wpt_root, path)
for _, path, _ in wpt_manifest.itertypes("support")} for _, path, _ in wpt_manifest.itertypes("support")}
wdspec_test_files = {os.path.join(wpt_root, path) wdspec_test_files = {os.path.join(wpt_root, path)
......
...@@ -40,13 +40,14 @@ def load_commands(): ...@@ -40,13 +40,14 @@ def load_commands():
return rv return rv
def parse_args(argv, commands): def parse_args(argv, commands = load_commands()):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use") parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use")
parser.add_argument("--skip-venv-setup", action="store_true", parser.add_argument("--skip-venv-setup", action="store_true",
dest="skip_venv_setup", dest="skip_venv_setup",
help="Whether to use the virtualenv as-is. Must set --venv as well") help="Whether to use the virtualenv as-is. Must set --venv as well")
parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception") parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception")
parser.add_argument("--py3", action="store_true", help="Run with python3")
subparsers = parser.add_subparsers(dest="command") subparsers = parser.add_subparsers(dest="command")
for command, props in iteritems(commands): for command, props in iteritems(commands):
subparsers.add_parser(command, help=props["help"], add_help=False) subparsers.add_parser(command, help=props["help"], add_help=False)
......
try:
import html
except ImportError:
import cgi as html
import json import json
import os import os
import sys import sys
...@@ -17,6 +13,11 @@ from .request import Authentication ...@@ -17,6 +13,11 @@ from .request import Authentication
from .response import MultipartContent from .response import MultipartContent
from .utils import HTTPException from .utils import HTTPException
try:
from html import escape
except ImportError:
from cgi import escape
__all__ = ["file_handler", "python_script_handler", __all__ = ["file_handler", "python_script_handler",
"FunctionHandler", "handler", "json_handler", "FunctionHandler", "handler", "json_handler",
"as_is_handler", "ErrorHandler", "BasicAuthHandler"] "as_is_handler", "ErrorHandler", "BasicAuthHandler"]
...@@ -79,7 +80,7 @@ class DirectoryHandler(object): ...@@ -79,7 +80,7 @@ class DirectoryHandler(object):
<ul> <ul>
%(items)s %(items)s
</ul> </ul>
""" % {"path": html.escape(url_path), """ % {"path": escape(url_path),
"items": "\n".join(self.list_items(url_path, path))} # noqa: E122 "items": "\n".join(self.list_items(url_path, path))} # noqa: E122
def list_items(self, base_path, path): def list_items(self, base_path, path):
...@@ -95,15 +96,29 @@ class DirectoryHandler(object): ...@@ -95,15 +96,29 @@ class DirectoryHandler(object):
link = urljoin(base_path, "..") link = urljoin(base_path, "..")
yield ("""<li class="dir"><a href="%(link)s">%(name)s</a></li>""" % yield ("""<li class="dir"><a href="%(link)s">%(name)s</a></li>""" %
{"link": link, "name": ".."}) {"link": link, "name": ".."})
items = []
prev_item = None
for item in sorted(os.listdir(path)): for item in sorted(os.listdir(path)):
link = html.escape(quote(item)) if prev_item and prev_item + ".headers" == item:
items[-1][1] = item
prev_item = None
continue
items.append([item, None])
prev_item = item
for item, dot_headers in items:
link = escape(quote(item))
dot_headers_markup = ""
if dot_headers is not None:
dot_headers_markup = (""" (<a href="%(link)s">.headers</a>)""" %
{"link": escape(quote(dot_headers))})
if os.path.isdir(os.path.join(path, item)): if os.path.isdir(os.path.join(path, item)):
link += "/" link += "/"
class_ = "dir" class_ = "dir"
else: else:
class_ = "file" class_ = "file"
yield ("""<li class="%(class)s"><a href="%(link)s">%(name)s</a></li>""" % yield ("""<li class="%(class)s"><a href="%(link)s">%(name)s</a>%(headers)s</li>""" %
{"link": link, "name": html.escape(item), "class": class_}) {"link": link, "name": escape(item), "class": class_,
"headers": dot_headers_markup})
def wrap_pipeline(path, request, response): def wrap_pipeline(path, request, response):
......
try:
from html import escape
except ImportError:
from cgi import escape
from collections import deque from collections import deque
import base64 import base64
import gzip as gzip_module import gzip as gzip_module
...@@ -10,10 +6,15 @@ import os ...@@ -10,10 +6,15 @@ import os
import re import re
import time import time
import uuid import uuid
from six.moves import StringIO
from six.moves import StringIO
from six import text_type, binary_type from six import text_type, binary_type
try:
from html import escape
except ImportError:
from cgi import escape
def resolve_content(response): def resolve_content(response):
return b"".join(item for item in response.iter_content(read_file=True)) return b"".join(item for item in response.iter_content(read_file=True))
...@@ -396,8 +397,8 @@ class SubFunctions(object): ...@@ -396,8 +397,8 @@ class SubFunctions(object):
def uuid(request): def uuid(request):
return str(uuid.uuid4()) return str(uuid.uuid4())
# Maintain a whitelist of supported algorithms, restricted to those that # Maintain a list of supported algorithms, restricted to those that are
# are available on all platforms [1]. This ensures that test authors do not # available on all platforms [1]. This ensures that test authors do not
# unknowingly introduce platform-specific tests. # unknowingly introduce platform-specific tests.
# #
# [1] https://docs.python.org/2/library/hashlib.html # [1] https://docs.python.org/2/library/hashlib.html
......
...@@ -2,4 +2,11 @@ ...@@ -2,4 +2,11 @@
if __name__ == "__main__": if __name__ == "__main__":
from tools.wpt import wpt from tools.wpt import wpt
wpt.main() from sys import version_info, argv, exit
args, extra = wpt.parse_args(argv[1:])
if args.py3 and version_info.major < 3:
from subprocess import call
exit(call(['python3', argv[0]] + [args.command] + extra))
else:
wpt.main()
# This file exists to allow `python wpt <command>` to work on Windows: # This file exists to allow `python wpt <command>` to work on Windows:
# https://github.com/web-platform-tests/wpt/pull/6907 # https://github.com/web-platform-tests/wpt/pull/6907
execfile("wpt") exec(compile(open("wpt", "r").read(), "wpt", 'exec'))
...@@ -6507,7 +6507,7 @@ crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-0 ...@@ -6507,7 +6507,7 @@ crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-0
crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-08.html [ Pass Failure ] crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-08.html [ Pass Failure ]
crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-09.html [ Pass Failure ] crbug.com/1050039 [ Mac ] virtual/omt-worker-fetch/fast/workers/worker-onerror-09.html [ Pass Failure ]
crbug.com/1050212 [ Win ] external/wpt/infrastructure/server/wpt-server-http.sub.html [ Skip ] crbug.com/1050212 external/wpt/infrastructure/server/wpt-server-http.sub.html [ Skip ]
# Sheriff 2020-02-10 # Sheriff 2020-02-10
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment