mirror of
https://github.com/servo/servo.git
synced 2025-08-07 14:35:33 +01:00
Support device-pixel-ratio in wpt reftests.
This commit is contained in:
parent
6beebd3b4f
commit
198ee0f2c6
10 changed files with 72 additions and 19 deletions
|
@ -123,7 +123,7 @@ class RefTest(URLManifestItem):
|
||||||
item_type = "reftest"
|
item_type = "reftest"
|
||||||
|
|
||||||
def __init__(self, source_file, url, references, url_base="/", timeout=None,
|
def __init__(self, source_file, url, references, url_base="/", timeout=None,
|
||||||
viewport_size=None, manifest=None):
|
viewport_size=None, dpi=None, manifest=None):
|
||||||
URLManifestItem.__init__(self, source_file, url, url_base=url_base, manifest=manifest)
|
URLManifestItem.__init__(self, source_file, url, url_base=url_base, manifest=manifest)
|
||||||
for _, ref_type in references:
|
for _, ref_type in references:
|
||||||
if ref_type not in ["==", "!="]:
|
if ref_type not in ["==", "!="]:
|
||||||
|
@ -131,13 +131,14 @@ class RefTest(URLManifestItem):
|
||||||
self.references = tuple(references)
|
self.references = tuple(references)
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
self.viewport_size = viewport_size
|
self.viewport_size = viewport_size
|
||||||
|
self.dpi = dpi
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_reference(self):
|
def is_reference(self):
|
||||||
return self.source_file.name_is_reference
|
return self.source_file.name_is_reference
|
||||||
|
|
||||||
def meta_key(self):
|
def meta_key(self):
|
||||||
return (self.timeout, self.viewport_size)
|
return (self.timeout, self.viewport_size, self.dpi)
|
||||||
|
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
rv = URLManifestItem.to_json(self)
|
rv = URLManifestItem.to_json(self)
|
||||||
|
@ -146,6 +147,8 @@ class RefTest(URLManifestItem):
|
||||||
rv["timeout"] = self.timeout
|
rv["timeout"] = self.timeout
|
||||||
if self.viewport_size is not None:
|
if self.viewport_size is not None:
|
||||||
rv["viewport_size"] = self.viewport_size
|
rv["viewport_size"] = self.viewport_size
|
||||||
|
if self.dpi is not None:
|
||||||
|
rv["dpi"] = self.dpi
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -157,6 +160,7 @@ class RefTest(URLManifestItem):
|
||||||
url_base=manifest.url_base,
|
url_base=manifest.url_base,
|
||||||
timeout=obj.get("timeout"),
|
timeout=obj.get("timeout"),
|
||||||
viewport_size=obj.get("viewport_size"),
|
viewport_size=obj.get("viewport_size"),
|
||||||
|
dpi=obj.get("dpi"),
|
||||||
manifest=manifest)
|
manifest=manifest)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -197,6 +197,23 @@ class SourceFile(object):
|
||||||
|
|
||||||
return self.viewport_nodes[0].attrib.get("content", None)
|
return self.viewport_nodes[0].attrib.get("content", None)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def dpi_nodes(self):
|
||||||
|
"""List of ElementTree Elements corresponding to nodes in a test that
|
||||||
|
specify device pixel ratios"""
|
||||||
|
return self.root.findall(".//{http://www.w3.org/1999/xhtml}meta[@name='device-pixel-ratio']")
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def dpi(self):
|
||||||
|
"""The device pixel ratio of a test or reference file"""
|
||||||
|
if not self.root:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not self.dpi_nodes:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return self.dpi_nodes[0].attrib.get("content", None)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def testharness_nodes(self):
|
def testharness_nodes(self):
|
||||||
"""List of ElementTree Elements corresponding to nodes representing a
|
"""List of ElementTree Elements corresponding to nodes representing a
|
||||||
|
@ -288,7 +305,8 @@ class SourceFile(object):
|
||||||
rv.append(TestharnessTest(self, url, timeout=self.timeout))
|
rv.append(TestharnessTest(self, url, timeout=self.timeout))
|
||||||
|
|
||||||
elif self.content_is_ref_node:
|
elif self.content_is_ref_node:
|
||||||
rv = [RefTest(self, self.url, self.references, timeout=self.timeout, viewport_size=self.viewport_size)]
|
rv = [RefTest(self, self.url, self.references, timeout=self.timeout,
|
||||||
|
viewport_size=self.viewport_size, dpi=self.dpi)]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# If nothing else it's a helper file, which we don't have a specific type for
|
# If nothing else it's a helper file, which we don't have a specific type for
|
||||||
|
|
|
@ -206,12 +206,12 @@ class RefTestImplementation(object):
|
||||||
def logger(self):
|
def logger(self):
|
||||||
return self.executor.logger
|
return self.executor.logger
|
||||||
|
|
||||||
def get_hash(self, test, viewport_size):
|
def get_hash(self, test, viewport_size, dpi):
|
||||||
timeout = test.timeout * self.timeout_multiplier
|
timeout = test.timeout * self.timeout_multiplier
|
||||||
key = (test.url, viewport_size)
|
key = (test.url, viewport_size, dpi)
|
||||||
|
|
||||||
if key not in self.screenshot_cache:
|
if key not in self.screenshot_cache:
|
||||||
success, data = self.executor.screenshot(test, viewport_size)
|
success, data = self.executor.screenshot(test, viewport_size, dpi)
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
return False, data
|
return False, data
|
||||||
|
@ -236,6 +236,7 @@ class RefTestImplementation(object):
|
||||||
|
|
||||||
def run_test(self, test):
|
def run_test(self, test):
|
||||||
viewport_size = test.viewport_size
|
viewport_size = test.viewport_size
|
||||||
|
dpi = test.dpi
|
||||||
self.message = []
|
self.message = []
|
||||||
|
|
||||||
# Depth-first search of reference tree, with the goal
|
# Depth-first search of reference tree, with the goal
|
||||||
|
@ -249,7 +250,7 @@ class RefTestImplementation(object):
|
||||||
nodes, relation = stack.pop()
|
nodes, relation = stack.pop()
|
||||||
|
|
||||||
for i, node in enumerate(nodes):
|
for i, node in enumerate(nodes):
|
||||||
success, data = self.get_hash(node, viewport_size)
|
success, data = self.get_hash(node, viewport_size, dpi)
|
||||||
if success is False:
|
if success is False:
|
||||||
return {"status": data[0], "message": data[1]}
|
return {"status": data[0], "message": data[1]}
|
||||||
|
|
||||||
|
@ -266,7 +267,7 @@ class RefTestImplementation(object):
|
||||||
|
|
||||||
for i, (node, screenshot) in enumerate(zip(nodes, screenshots)):
|
for i, (node, screenshot) in enumerate(zip(nodes, screenshots)):
|
||||||
if screenshot is None:
|
if screenshot is None:
|
||||||
success, screenshot = self.retake_screenshot(node, viewport_size)
|
success, screenshot = self.retake_screenshot(node, viewport_size, dpi)
|
||||||
if success:
|
if success:
|
||||||
screenshots[i] = screenshot
|
screenshots[i] = screenshot
|
||||||
|
|
||||||
|
@ -277,12 +278,12 @@ class RefTestImplementation(object):
|
||||||
"message": "\n".join(self.message),
|
"message": "\n".join(self.message),
|
||||||
"extra": {"reftest_screenshots": log_data}}
|
"extra": {"reftest_screenshots": log_data}}
|
||||||
|
|
||||||
def retake_screenshot(self, node, viewport_size):
|
def retake_screenshot(self, node, viewport_size, dpi):
|
||||||
success, data = self.executor.screenshot(node, viewport_size)
|
success, data = self.executor.screenshot(node, viewport_size, dpi)
|
||||||
if not success:
|
if not success:
|
||||||
return False, data
|
return False, data
|
||||||
|
|
||||||
key = (node.url, viewport_size)
|
key = (node.url, viewport_size, dpi)
|
||||||
hash_val, _ = self.screenshot_cache[key]
|
hash_val, _ = self.screenshot_cache[key]
|
||||||
self.screenshot_cache[key] = hash_val, data
|
self.screenshot_cache[key] = hash_val, data
|
||||||
return True, data
|
return True, data
|
||||||
|
|
|
@ -385,9 +385,10 @@ class MarionetteRefTestExecutor(RefTestExecutor):
|
||||||
|
|
||||||
return self.convert_result(test, result)
|
return self.convert_result(test, result)
|
||||||
|
|
||||||
def screenshot(self, test, viewport_size):
|
def screenshot(self, test, viewport_size, dpi):
|
||||||
# https://github.com/w3c/wptrunner/issues/166
|
# https://github.com/w3c/wptrunner/issues/166
|
||||||
assert viewport_size is None
|
assert viewport_size is None
|
||||||
|
assert dpi is None
|
||||||
|
|
||||||
timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None
|
timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None
|
||||||
|
|
||||||
|
|
|
@ -247,9 +247,10 @@ class SeleniumRefTestExecutor(RefTestExecutor):
|
||||||
|
|
||||||
return self.convert_result(test, result)
|
return self.convert_result(test, result)
|
||||||
|
|
||||||
def screenshot(self, test, viewport_size):
|
def screenshot(self, test, viewport_size, dpi):
|
||||||
# https://github.com/w3c/wptrunner/issues/166
|
# https://github.com/w3c/wptrunner/issues/166
|
||||||
assert viewport_size is None
|
assert viewport_size is None
|
||||||
|
assert dpi is None
|
||||||
|
|
||||||
return SeleniumRun(self._screenshot,
|
return SeleniumRun(self._screenshot,
|
||||||
self.protocol.webdriver,
|
self.protocol.webdriver,
|
||||||
|
|
|
@ -196,7 +196,7 @@ class ServoRefTestExecutor(ProcessTestExecutor):
|
||||||
os.rmdir(self.tempdir)
|
os.rmdir(self.tempdir)
|
||||||
ProcessTestExecutor.teardown(self)
|
ProcessTestExecutor.teardown(self)
|
||||||
|
|
||||||
def screenshot(self, test, viewport_size):
|
def screenshot(self, test, viewport_size, dpi):
|
||||||
full_url = self.test_url(test)
|
full_url = self.test_url(test)
|
||||||
|
|
||||||
with TempFilename(self.tempdir) as output_path:
|
with TempFilename(self.tempdir) as output_path:
|
||||||
|
@ -216,6 +216,9 @@ class ServoRefTestExecutor(ProcessTestExecutor):
|
||||||
if viewport_size:
|
if viewport_size:
|
||||||
command += ["--resolution", viewport_size]
|
command += ["--resolution", viewport_size]
|
||||||
|
|
||||||
|
if dpi:
|
||||||
|
command += ["--device-pixel-ratio", dpi]
|
||||||
|
|
||||||
self.command = debug_args + command
|
self.command = debug_args + command
|
||||||
|
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
|
|
|
@ -226,9 +226,10 @@ class ServoWebDriverRefTestExecutor(RefTestExecutor):
|
||||||
message += traceback.format_exc(e)
|
message += traceback.format_exc(e)
|
||||||
return test.result_cls("ERROR", message), []
|
return test.result_cls("ERROR", message), []
|
||||||
|
|
||||||
def screenshot(self, test, viewport_size):
|
def screenshot(self, test, viewport_size, dpi):
|
||||||
# https://github.com/w3c/wptrunner/issues/166
|
# https://github.com/w3c/wptrunner/issues/166
|
||||||
assert viewport_size is None
|
assert viewport_size is None
|
||||||
|
assert dpi is None
|
||||||
|
|
||||||
timeout = (test.timeout * self.timeout_multiplier + extra_timeout
|
timeout = (test.timeout * self.timeout_multiplier + extra_timeout
|
||||||
if self.debug_info is None else None)
|
if self.debug_info is None else None)
|
||||||
|
|
|
@ -216,7 +216,7 @@ class ReftestTest(Test):
|
||||||
|
|
||||||
def __init__(self, url, inherit_metadata, test_metadata, references,
|
def __init__(self, url, inherit_metadata, test_metadata, references,
|
||||||
timeout=DEFAULT_TIMEOUT, path=None, viewport_size=None,
|
timeout=DEFAULT_TIMEOUT, path=None, viewport_size=None,
|
||||||
protocol="http"):
|
dpi=None, protocol="http"):
|
||||||
Test.__init__(self, url, inherit_metadata, test_metadata, timeout, path, protocol)
|
Test.__init__(self, url, inherit_metadata, test_metadata, timeout, path, protocol)
|
||||||
|
|
||||||
for _, ref_type in references:
|
for _, ref_type in references:
|
||||||
|
@ -225,6 +225,7 @@ class ReftestTest(Test):
|
||||||
|
|
||||||
self.references = references
|
self.references = references
|
||||||
self.viewport_size = viewport_size
|
self.viewport_size = viewport_size
|
||||||
|
self.dpi = dpi
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_manifest(cls,
|
def from_manifest(cls,
|
||||||
|
@ -250,6 +251,7 @@ class ReftestTest(Test):
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
path=manifest_test.path,
|
path=manifest_test.path,
|
||||||
viewport_size=manifest_test.viewport_size,
|
viewport_size=manifest_test.viewport_size,
|
||||||
|
dpi=manifest_test.dpi,
|
||||||
protocol="https" if hasattr(manifest_test, "https") and manifest_test.https else "http")
|
protocol="https" if hasattr(manifest_test, "https") and manifest_test.https else "http")
|
||||||
|
|
||||||
nodes[url] = node
|
nodes[url] = node
|
||||||
|
|
|
@ -130,7 +130,7 @@ class RefTest(URLManifestItem):
|
||||||
item_type = "reftest"
|
item_type = "reftest"
|
||||||
|
|
||||||
def __init__(self, source_file, url, references, url_base="/", timeout=None,
|
def __init__(self, source_file, url, references, url_base="/", timeout=None,
|
||||||
viewport_size=None, manifest=None):
|
viewport_size=None, dpi=None, manifest=None):
|
||||||
URLManifestItem.__init__(self, source_file, url, url_base=url_base, manifest=manifest)
|
URLManifestItem.__init__(self, source_file, url, url_base=url_base, manifest=manifest)
|
||||||
for _, ref_type in references:
|
for _, ref_type in references:
|
||||||
if ref_type not in ["==", "!="]:
|
if ref_type not in ["==", "!="]:
|
||||||
|
@ -138,13 +138,14 @@ class RefTest(URLManifestItem):
|
||||||
self.references = tuple(references)
|
self.references = tuple(references)
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
self.viewport_size = viewport_size
|
self.viewport_size = viewport_size
|
||||||
|
self.dpi = dpi
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_reference(self):
|
def is_reference(self):
|
||||||
return self.source_file.name_is_reference
|
return self.source_file.name_is_reference
|
||||||
|
|
||||||
def meta_key(self):
|
def meta_key(self):
|
||||||
return (self.timeout, self.viewport_size)
|
return (self.timeout, self.viewport_size, self.dpi)
|
||||||
|
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
rv = URLManifestItem.to_json(self)
|
rv = URLManifestItem.to_json(self)
|
||||||
|
@ -153,6 +154,8 @@ class RefTest(URLManifestItem):
|
||||||
rv["timeout"] = self.timeout
|
rv["timeout"] = self.timeout
|
||||||
if self.viewport_size is not None:
|
if self.viewport_size is not None:
|
||||||
rv["viewport_size"] = self.viewport_size
|
rv["viewport_size"] = self.viewport_size
|
||||||
|
if self.dpi is not None:
|
||||||
|
rv["dpi"] = self.dpi
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -165,6 +168,7 @@ class RefTest(URLManifestItem):
|
||||||
url_base=manifest.url_base,
|
url_base=manifest.url_base,
|
||||||
timeout=obj.get("timeout"),
|
timeout=obj.get("timeout"),
|
||||||
viewport_size=obj.get("viewport_size"),
|
viewport_size=obj.get("viewport_size"),
|
||||||
|
dpi=obj.get("dpi"),
|
||||||
manifest=manifest)
|
manifest=manifest)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -197,6 +197,23 @@ class SourceFile(object):
|
||||||
|
|
||||||
return self.viewport_nodes[0].attrib.get("content", None)
|
return self.viewport_nodes[0].attrib.get("content", None)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def dpi_nodes(self):
|
||||||
|
"""List of ElementTree Elements corresponding to nodes in a test that
|
||||||
|
specify device pixel ratios"""
|
||||||
|
return self.root.findall(".//{http://www.w3.org/1999/xhtml}meta[@name='device-pixel-ratio']")
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def dpi(self):
|
||||||
|
"""The device pixel ratio of a test or reference file"""
|
||||||
|
if not self.root:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not self.dpi_nodes:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return self.dpi_nodes[0].attrib.get("content", None)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def testharness_nodes(self):
|
def testharness_nodes(self):
|
||||||
"""List of ElementTree Elements corresponding to nodes representing a
|
"""List of ElementTree Elements corresponding to nodes representing a
|
||||||
|
@ -288,7 +305,8 @@ class SourceFile(object):
|
||||||
rv.append(TestharnessTest(self, url, timeout=self.timeout))
|
rv.append(TestharnessTest(self, url, timeout=self.timeout))
|
||||||
|
|
||||||
elif self.content_is_ref_node:
|
elif self.content_is_ref_node:
|
||||||
rv = [RefTest(self, self.url, self.references, timeout=self.timeout, viewport_size=self.viewport_size)]
|
rv = [RefTest(self, self.url, self.references, timeout=self.timeout,
|
||||||
|
viewport_size=self.viewport_size, dpi=self.dpi)]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# If nothing else it's a helper file, which we don't have a specific type for
|
# If nothing else it's a helper file, which we don't have a specific type for
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue