[Fuchsia] Fix blink layoyut tests to avoid 'pm install' dependency
Blink layout tests were not running properly after `pm install` command
was removed. Added move package installation logic from run_pacakge.py
to Target class and update layout tests runner to call
target.InstallPackage() instead of running `pm install`.
Also removed invalid Fuchsia-specific test expectations that were
added since the test started failing.
Change-Id: I86ad072d0725042f695b84a48ef132b65d32b963
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1526692
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: Dirk Pranke <dpranke@chromium.org>
Reviewed-by: Kevin Marshall <kmarshall@chromium.org>
Auto-Submit: Sergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#642048}
diff --git a/build/fuchsia/run_package.py b/build/fuchsia/run_package.py
index c828a60..d12698c 100644
--- a/build/fuchsia/run_package.py
+++ b/build/fuchsia/run_package.py
@@ -7,16 +7,13 @@
import common
import hashlib
-import json
import logging
import multiprocessing
import os
import re
import select
-import shutil
import subprocess
import sys
-import tempfile
import time
import threading
import uuid
@@ -24,16 +21,10 @@
from symbolizer import SymbolizerFilter
FAR = os.path.join(common.SDK_ROOT, 'tools', 'far')
-PM = os.path.join(common.SDK_ROOT, 'tools', 'pm')
-_REPO_NAME = 'chrome_runner'
# Amount of time to wait for the termination of the system log output thread.
_JOIN_TIMEOUT_SECS = 5
-# Amount of time to wait for Amber to complete package installation, as a
-# mitigation against hangs due to amber/network-related failures.
-_INSTALL_TIMEOUT_SECS = 5 * 60
-
def _AttachKernelLogReader(target):
"""Attaches a kernel log reader as a long-running SSH task."""
@@ -116,76 +107,6 @@
package_name)
-def _UnregisterAmberRepository(target):
- """Unregisters the Amber repository from the target."""
-
- logging.debug('Unregistering Amber repository.')
- target.RunCommand(['amber_ctl', 'rm_src', '-n', _REPO_NAME])
-
- # Re-enable 'devhost' repo if it's present. This is useful for devices that
- # were booted with 'fx serve'.
- target.RunCommand(['amber_ctl', 'enable_src', '-n', 'devhost'], silent=True)
-
-
-def _RegisterAmberRepository(target, tuf_repo, remote_port):
- """Configures a device to use a local TUF repository as an installation source
- for packages.
- |target|: The remote device to configure.
- |tuf_repo|: The host filesystem path to the TUF repository.
- |remote_port|: The reverse-forwarded port used to connect to instance of
- `pm serve` that is serving the contents of |tuf_repo|."""
-
- # Extract the public signing key for inclusion in the config file.
- root_keys = []
- root_json = json.load(open(os.path.join(tuf_repo, 'repository', 'root.json'),
- 'r'))
- for root_key_id in root_json['signed']['roles']['root']['keyids']:
- root_keys.append({
- 'Type': root_json['signed']['keys'][root_key_id]['keytype'],
- 'Value': root_json['signed']['keys'][root_key_id]['keyval']['public']
- })
-
- # "pm serve" can automatically generate a "config.json" file at query time,
- # but the file is unusable because it specifies URLs with port
- # numbers that are unreachable from across the port forwarding boundary.
- # So instead, we generate our own config file with the forwarded port numbers
- # instead.
- config_file = open(os.path.join(tuf_repo, 'repository', 'repo_config.json'),
- 'w')
- json.dump({
- 'ID': _REPO_NAME,
- 'RepoURL': "http://127.0.0.1:%d" % remote_port,
- 'BlobRepoURL': "http://127.0.0.1:%d/blobs" % remote_port,
- 'RatePeriod': 10,
- 'RootKeys': root_keys,
- 'StatusConfig': {
- 'Enabled': True
- },
- 'Auto': True
- }, config_file)
- config_file.close()
-
- # Register the repo.
- return_code = target.RunCommand(
- [('amber_ctl rm_src -n %s; ' +
- 'amber_ctl add_src -f http://127.0.0.1:%d/repo_config.json')
- % (_REPO_NAME, remote_port)])
- if return_code != 0:
- raise Exception('Error code %d when running amber_ctl.' % return_code)
-
-
-def _DrainStreamToStdout(stream, quit_event):
- """Outputs the contents of |stream| until |quit_event| is set."""
-
- while not quit_event.is_set():
- rlist, _, _ = select.select([ stream ], [], [], 0.1)
- if rlist:
- line = rlist[0].readline()
- if not line:
- return
- print line.rstrip()
-
-
class RunPackageArgs:
"""RunPackage() configuration arguments structure.
@@ -211,26 +132,21 @@
return run_package_args
-def GetPackageInfo(package_path):
- """Returns a tuple with the name and version of a package."""
+def _DrainStreamToStdout(stream, quit_event):
+ """Outputs the contents of |stream| until |quit_event| is set."""
- # Query the metadata file which resides next to the package file.
- package_info = json.load(
- open(os.path.join(os.path.dirname(package_path), 'package')))
- return (package_info['name'], package_info['version'])
-
-
-def PublishPackage(tuf_root, package_path):
- """Publishes a combined FAR package to a TUF repository root."""
-
- subprocess.check_call(
- [PM, 'publish', '-a', '-f', package_path, '-r', tuf_root, '-vt', '-v'],
- stderr=subprocess.STDOUT)
+ while not quit_event.is_set():
+ rlist, _, _ = select.select([ stream ], [], [], 0.1)
+ if rlist:
+ line = rlist[0].readline()
+ if not line:
+ return
+ print line.rstrip()
def RunPackage(output_dir, target, package_path, package_name,
package_deps, package_args, args):
- """Copies the Fuchsia package at |package_path| to the target,
+ """Installs the Fuchsia package at |package_path| on the target,
executes it with |package_args|, and symbolizes its output.
output_dir: The path containing the build output files.
@@ -242,7 +158,6 @@
Returns the exit code of the remote package process."""
-
system_logger = (
_AttachKernelLogReader(target) if args.system_logging else None)
try:
@@ -256,35 +171,7 @@
log_output_thread.daemon = True
log_output_thread.start()
- tuf_root = tempfile.mkdtemp()
- pm_serve_task = None
-
- # Publish all packages to the serving TUF repository under |tuf_root|.
- subprocess.check_call([PM, 'newrepo', '-repo', tuf_root])
- all_packages = [package_path] + package_deps
- for next_package_path in all_packages:
- PublishPackage(tuf_root, next_package_path)
-
- # Serve the |tuf_root| using 'pm serve' and configure the target to pull
- # from it.
- serve_port = common.GetAvailableTcpPort()
- pm_serve_task = subprocess.Popen(
- [PM, 'serve', '-d', os.path.join(tuf_root, 'repository'), '-l',
- ':%d' % serve_port, '-q'])
- remote_port = common.ConnectPortForwardingTask(target, serve_port, 0)
- _RegisterAmberRepository(target, tuf_root, remote_port)
-
- # Install all packages.
- for next_package_path in all_packages:
- install_package_name, package_version = GetPackageInfo(next_package_path)
- logging.info('Installing %s version %s.' %
- (install_package_name, package_version))
- return_code = target.RunCommand(['amber_ctl', 'get_up', '-n',
- install_package_name, '-v',
- package_version],
- timeout_secs=_INSTALL_TIMEOUT_SECS)
- if return_code != 0:
- raise Exception('Error while installing %s.' % install_package_name)
+ target.InstallPackage(package_path, package_name, package_deps)
if system_logger:
log_output_quit_event.set()
@@ -330,9 +217,4 @@
log_output_thread.join()
system_logger.kill()
- _UnregisterAmberRepository(target)
- if pm_serve_task:
- pm_serve_task.kill()
- shutil.rmtree(tuf_root)
-
return process.returncode
diff --git a/build/fuchsia/target.py b/build/fuchsia/target.py
index 317186bf..0a2bb23a 100644
--- a/build/fuchsia/target.py
+++ b/build/fuchsia/target.py
@@ -4,9 +4,14 @@
import boot_data
import common
+import json
import logging
+import os
import remote_cmd
+import shutil
+import subprocess
import sys
+import tempfile
import time
@@ -14,6 +19,30 @@
_ATTACH_MAX_RETRIES = 10
_ATTACH_RETRY_INTERVAL = 1
+_PM = os.path.join(common.SDK_ROOT, 'tools', 'pm')
+_REPO_NAME = 'chrome_runner'
+
+# Amount of time to wait for Amber to complete package installation, as a
+# mitigation against hangs due to amber/network-related failures.
+_INSTALL_TIMEOUT_SECS = 5 * 60
+
+
+def _GetPackageInfo(package_path):
+ """Returns a tuple with the name and version of a package."""
+
+ # Query the metadata file which resides next to the package file.
+ package_info = json.load(
+ open(os.path.join(os.path.dirname(package_path), 'package')))
+ return (package_info['name'], package_info['version'])
+
+
+def _PublishPackage(tuf_root, package_path):
+ """Publishes a combined FAR package to a TUF repository root."""
+
+ subprocess.check_call(
+ [_PM, 'publish', '-a', '-f', package_path, '-r', tuf_root, '-vt', '-v'],
+ stderr=subprocess.STDOUT)
+
class _MapRemoteDataPathForPackage:
"""Callable object which remaps /data paths to their package-specific
@@ -210,3 +239,108 @@
elif self._target_cpu == 'x64':
return 'x86_64'
raise Exception('Unknown target_cpu %s:' % self._target_cpu)
+
+
+ def InstallPackage(self, package_path, package_name, package_deps):
+ """Installs a package and it's dependencies on the device. If the package is
+ already installed then it will be updated to the new version.
+
+ package_path: Path to the .far file to be installed.
+ package_name: Package name.
+ package_deps: List of .far files with the packages that the main package
+ depends on. These packages are installed or updated as well.
+ """
+ try:
+ tuf_root = tempfile.mkdtemp()
+ pm_serve_task = None
+
+ # Publish all packages to the serving TUF repository under |tuf_root|.
+ subprocess.check_call([_PM, 'newrepo', '-repo', tuf_root])
+ all_packages = [package_path] + package_deps
+ for next_package_path in all_packages:
+ _PublishPackage(tuf_root, next_package_path)
+
+ # Serve the |tuf_root| using 'pm serve' and configure the target to pull
+ # from it.
+ serve_port = common.GetAvailableTcpPort()
+ pm_serve_task = subprocess.Popen(
+ [_PM, 'serve', '-d', os.path.join(tuf_root, 'repository'), '-l',
+ ':%d' % serve_port, '-q'])
+ remote_port = common.ConnectPortForwardingTask(self, serve_port, 0)
+ self._RegisterAmberRepository(tuf_root, remote_port)
+
+ # Install all packages.
+ for next_package_path in all_packages:
+ install_package_name, package_version = \
+ _GetPackageInfo(next_package_path)
+ logging.info('Installing %s version %s.' %
+ (install_package_name, package_version))
+ return_code = self.RunCommand(['amber_ctl', 'get_up', '-n',
+ install_package_name, '-v',
+ package_version],
+ timeout_secs=_INSTALL_TIMEOUT_SECS)
+ if return_code != 0:
+ raise Exception('Error while installing %s.' % install_package_name)
+
+ finally:
+ self._UnregisterAmberRepository()
+ if pm_serve_task:
+ pm_serve_task.kill()
+ shutil.rmtree(tuf_root)
+
+
+ def _RegisterAmberRepository(self, tuf_repo, remote_port):
+ """Configures a device to use a local TUF repository as an installation
+ source for packages.
+ |tuf_repo|: The host filesystem path to the TUF repository.
+ |remote_port|: The reverse-forwarded port used to connect to instance of
+ `pm serve` that is serving the contents of |tuf_repo|."""
+
+ # Extract the public signing key for inclusion in the config file.
+ root_keys = []
+ root_json_path = os.path.join(tuf_repo, 'repository', 'root.json')
+ root_json = json.load(open(root_json_path, 'r'))
+ for root_key_id in root_json['signed']['roles']['root']['keyids']:
+ root_keys.append({
+ 'Type': root_json['signed']['keys'][root_key_id]['keytype'],
+ 'Value': root_json['signed']['keys'][root_key_id]['keyval']['public']
+ })
+
+ # "pm serve" can automatically generate a "config.json" file at query time,
+ # but the file is unusable because it specifies URLs with port
+ # numbers that are unreachable from across the port forwarding boundary.
+ # So instead, we generate our own config file with the forwarded port
+ # numbers instead.
+ config_file = open(os.path.join(tuf_repo, 'repository', 'repo_config.json'),
+ 'w')
+ json.dump({
+ 'ID': _REPO_NAME,
+ 'RepoURL': "http://127.0.0.1:%d" % remote_port,
+ 'BlobRepoURL': "http://127.0.0.1:%d/blobs" % remote_port,
+ 'RatePeriod': 10,
+ 'RootKeys': root_keys,
+ 'StatusConfig': {
+ 'Enabled': True
+ },
+ 'Auto': True
+ }, config_file)
+ config_file.close()
+
+ # Register the repo.
+ return_code = self.RunCommand(
+ [('amber_ctl rm_src -n %s; ' +
+ 'amber_ctl add_src -f http://127.0.0.1:%d/repo_config.json')
+ % (_REPO_NAME, remote_port)])
+ if return_code != 0:
+ raise Exception('Error code %d when running amber_ctl.' % return_code)
+
+
+ def _UnregisterAmberRepository(self):
+ """Unregisters the Amber repository."""
+
+ logging.debug('Unregistering Amber repository.')
+ self.RunCommand(['amber_ctl', 'rm_src', '-n', _REPO_NAME])
+
+ # Re-enable 'devhost' repo if it's present. This is useful for devices that
+ # were booted with 'fx serve'.
+ self.RunCommand(['amber_ctl', 'enable_src', '-n', 'devhost'], silent=True)
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
index 5233f4d..dd5b0539 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
@@ -146,24 +146,9 @@
ssh_args=forwarding_flags,
stderr=subprocess.PIPE)
- # Copy content_shell package to the device.
- device_package_path = \
- os.path.join('/data', os.path.basename(CONTENT_SHELL_PACKAGE_PATH))
- self._target.PutFile(
- os.path.join(build_path, CONTENT_SHELL_PACKAGE_PATH),
- device_package_path)
-
- pm_install = self._target.RunCommandPiped(
- ['pm', 'install', device_package_path],
- stderr=subprocess.PIPE)
- output = pm_install.stderr.readlines()
- pm_install.wait()
-
- if pm_install.returncode != 0:
- # Don't error out if the package already exists on the device.
- if len(output) != 1 or 'ErrAlreadyExists' not in output[0]:
- raise Exception('Failed to install content_shell: %s' % \
- '\n'.join(output))
+ package_path = os.path.join(build_path, CONTENT_SHELL_PACKAGE_PATH)
+ self._target.InstallPackage(package_path, "content_shell",
+ package_deps=[])
# Process will be forked for each worker, which may make QemuTarget
# unusable (e.g. waitpid() for qemu process returns ECHILD after
diff --git a/third_party/blink/web_tests/platform/fuchsia/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/fuchsia/editing/selection/4402375-expected.png
deleted file mode 100644
index 0bfecee0..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/editing/selection/4402375-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt b/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
deleted file mode 100644
index 6bf47632..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
+++ /dev/null
@@ -1,144 +0,0 @@
-This is a testharness.js-based test.
-Found 140 tests; 132 PASS, 8 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Element.animate() creates an Animation object
-PASS Element.animate() creates an Animation object in the relevant realm of the target element
-PASS Element.animate() creates an Animation object with a KeyframeEffect
-PASS Element.animate() creates an Animation object with a KeyframeEffect that is created in the relevant realm of the target element
-PASS Element.animate() accepts empty keyframe lists (input: [])
-PASS Element.animate() accepts empty keyframe lists (input: null)
-PASS Element.animate() accepts empty keyframe lists (input: undefined)
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification
-FAIL Element.animate() accepts a one shorthand property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-FAIL Element.animate() accepts a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a two property two value property-indexed keyframes specification
-PASS Element.animate() accepts a two property property-indexed keyframes specification with different numbers of values
-PASS Element.animate() accepts a property-indexed keyframes specification with an invalid value
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification that needs to stringify its values
-PASS Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference
-FAIL Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a one property one value property-indexed keyframes specification
-PASS Element.animate() accepts a one property one non-array value property-indexed keyframes specification
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification where the first value is invalid
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification where the second value is invalid
-PASS Element.animate() accepts a property-indexed keyframe with a single offset
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is too short
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is too long
-PASS Element.animate() accepts a property-indexed keyframe with an empty array of offsets
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with an embedded null value
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with a trailing null value
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with leading and trailing null values
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with adjacent null values
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with all null values (and too many at that)
-PASS Element.animate() accepts a property-indexed keyframe with a single null offset
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array
-PASS Element.animate() accepts a property-indexed keyframe without any specified easing
-PASS Element.animate() accepts a property-indexed keyframe with a single easing
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings that is too short
-PASS Element.animate() accepts a property-indexed keyframe with a single-element array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an empty array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings that is too long
-PASS Element.animate() accepts a property-indexed keyframe with a single composite operation
-FAIL Element.animate() accepts a property-indexed keyframe with a composite array assert_equals: value for 'composite' on ComputedKeyframe #2 expected "accumulate" but got "replace"
-PASS Element.animate() accepts a property-indexed keyframe with a composite array that is too short
-PASS Element.animate() accepts a property-indexed keyframe with a composite array that is too long
-PASS Element.animate() accepts a property-indexed keyframe with a single-element composite array
-PASS Element.animate() accepts a one property one keyframe sequence
-PASS Element.animate() accepts a one property two keyframe sequence
-PASS Element.animate() accepts a two property two keyframe sequence
-FAIL Element.animate() accepts a one shorthand property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-FAIL Element.animate() accepts a two property (a shorthand and one of its component longhands) two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a two property keyframe sequence where one property is missing from the first keyframe
-PASS Element.animate() accepts a two property keyframe sequence where one property is missing from the last keyframe
-PASS Element.animate() accepts a one property two keyframe sequence that needs to stringify its values
-PASS Element.animate() accepts a keyframe sequence with a CSS variable reference
-FAIL Element.animate() accepts a keyframe sequence with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "composite,computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a keyframe sequence with duplicate values for a given interior offset
-PASS Element.animate() accepts a keyframe sequence with duplicate values for offsets 0 and 1
-PASS Element.animate() accepts a two property four keyframe sequence
-PASS Element.animate() accepts a single keyframe sequence with omitted offset
-PASS Element.animate() accepts a single keyframe sequence with null offset
-PASS Element.animate() accepts a single keyframe sequence with string offset
-PASS Element.animate() accepts a one property keyframe sequence with some omitted offsets
-PASS Element.animate() accepts a one property keyframe sequence with some null offsets
-PASS Element.animate() accepts a two property keyframe sequence with some omitted offsets
-PASS Element.animate() accepts a one property keyframe sequence with all omitted offsets
-PASS Element.animate() accepts a keyframe sequence with different easing values, but the same easing value for a given offset
-PASS Element.animate() accepts a keyframe sequence with different composite values, but the same composite value for a given offset
-PASS Element.animate() does not accept keyframes with an out-of-bounded positive offset
-PASS Element.animate() does not accept keyframes with an out-of-bounded negative offset
-PASS Element.animate() does not accept property-indexed keyframes not loosely sorted by offset
-PASS Element.animate() does not accept property-indexed keyframes not loosely sorted by offset even though not all offsets are specified
-PASS Element.animate() does not accept property-indexed keyframes with offsets out of range
-PASS Element.animate() does not accept keyframes not loosely sorted by offset
-PASS Element.animate() does not accept property-indexed keyframes with an invalid easing value
-PASS Element.animate() does not accept property-indexed keyframes with an invalid easing value as one of the array values
-PASS Element.animate() does not accept property-indexed keyframe with an invalid easing in the unused part of the array of easings
-PASS Element.animate() does not accept empty property-indexed keyframe with an invalid easing
-PASS Element.animate() does not accept empty property-indexed keyframe with an invalid easings array
-PASS Element.animate() does not accept a keyframe sequence with an invalid easing value
-PASS Element.animate() does not accept property-indexed keyframes with an invalid composite value
-PASS Element.animate() does not accept property-indexed keyframes with an invalid composite value as one of the array values
-PASS Element.animate() does not accept keyframes with an invalid composite value
-PASS Element.animate() accepts a double as an options argument
-PASS Element.animate() accepts a KeyframeAnimationOptions argument
-PASS Element.animate() accepts an absent options argument
-PASS Element.animate() does not accept invalid delay value: NaN
-PASS Element.animate() does not accept invalid delay value: Infinity
-PASS Element.animate() does not accept invalid delay value: -Infinity
-PASS Element.animate() accepts a duration of 'auto' using a dictionary object
-PASS Element.animate() does not accept invalid duration value: -1
-PASS Element.animate() does not accept invalid duration value: NaN
-PASS Element.animate() does not accept invalid duration value: -Infinity
-PASS Element.animate() does not accept invalid duration value: "abc"
-PASS Element.animate() does not accept invalid duration value: -1 using a dictionary object
-PASS Element.animate() does not accept invalid duration value: NaN using a dictionary object
-PASS Element.animate() does not accept invalid duration value: -Infinity using a dictionary object
-PASS Element.animate() does not accept invalid duration value: "abc" using a dictionary object
-PASS Element.animate() does not accept invalid duration value: "100" using a dictionary object
-PASS Element.animate() does not accept invalid easing: ''
-PASS Element.animate() does not accept invalid easing: '7'
-PASS Element.animate() does not accept invalid easing: 'test'
-PASS Element.animate() does not accept invalid easing: 'initial'
-PASS Element.animate() does not accept invalid easing: 'inherit'
-PASS Element.animate() does not accept invalid easing: 'unset'
-PASS Element.animate() does not accept invalid easing: 'unrecognized'
-PASS Element.animate() does not accept invalid easing: 'var(--x)'
-PASS Element.animate() does not accept invalid easing: 'ease-in-out, ease-out'
-PASS Element.animate() does not accept invalid easing: 'cubic-bezier(1.1, 0, 1, 1)'
-PASS Element.animate() does not accept invalid easing: 'cubic-bezier(0, 0, 1.1, 1)'
-PASS Element.animate() does not accept invalid easing: 'cubic-bezier(-0.1, 0, 1, 1)'
-PASS Element.animate() does not accept invalid easing: 'cubic-bezier(0, 0, -0.1, 1)'
-PASS Element.animate() does not accept invalid easing: 'cubic-bezier(0.1, 0, 4, 0.4)'
-PASS Element.animate() does not accept invalid easing: 'steps(-1, start)'
-PASS Element.animate() does not accept invalid easing: 'steps(0.1, start)'
-PASS Element.animate() does not accept invalid easing: 'steps(3, nowhere)'
-PASS Element.animate() does not accept invalid easing: 'steps(-3, end)'
-PASS Element.animate() does not accept invalid easing: 'function (a){return a}'
-PASS Element.animate() does not accept invalid easing: 'function (x){return x}'
-PASS Element.animate() does not accept invalid easing: 'function(x, y){return 0.3}'
-PASS Element.animate() does not accept invalid easing: 'frames(1)'
-PASS Element.animate() does not accept invalid easing: 'frames'
-PASS Element.animate() does not accept invalid easing: 'frames()'
-PASS Element.animate() does not accept invalid easing: 'frames(,)'
-PASS Element.animate() does not accept invalid easing: 'frames(a)'
-PASS Element.animate() does not accept invalid easing: 'frames(2.0)'
-PASS Element.animate() does not accept invalid easing: 'frames(2.5)'
-PASS Element.animate() does not accept invalid easing: 'frames(2 3)'
-PASS Element.animate() does not accept invalid iterationStart value: -1
-PASS Element.animate() does not accept invalid iterationStart value: NaN
-PASS Element.animate() does not accept invalid iterationStart value: Infinity
-PASS Element.animate() does not accept invalid iterationStart value: -Infinity
-PASS Element.animate() does not accept invalid iterations value: -1
-PASS Element.animate() does not accept invalid iterations value: -Infinity
-PASS Element.animate() does not accept invalid iterations value: NaN
-PASS Element.animate() correctly sets the id attribute when no id is specified
-PASS Element.animate() correctly sets the id attribute
-PASS Element.animate() correctly sets the Animation's timeline
-PASS Element.animate() correctly sets the Animation's timeline when triggered on an element in a different document
-FAIL Element.animate() calls play on the Animation assert_equals: expected "running" but got "pending"
-PASS CSSPseudoElement.animate() creates an Animation object
-PASS CSSPseudoElement.animate() creates an Animation object targeting to the correct CSSPseudoElement object
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/getAnimations-expected.txt b/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/getAnimations-expected.txt
deleted file mode 100644
index d5d1c3d7..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Animatable/getAnimations-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-This is a testharness.js-based test.
-PASS Returns an empty array for an element with no animations
-PASS Returns both animations for an element with two animations
-PASS Returns only the animations specific to each sibling element
-PASS Returns only the animations specific to each parent/child element
-PASS Does not return finished animations that do not fill forwards
-PASS Returns finished animations that fill forwards
-PASS Returns animations yet to reach their active phase
-FAIL Does not return reversed finished animations that do not fill backwards assert_array_equals: lengths differ, expected 0 got 1
-PASS Returns reversed finished animations that fill backwards
-FAIL Returns reversed animations yet to reach their active phase assert_array_equals: lengths differ, expected 1 got 0
-FAIL Does not return animations with zero playback rate in before phase assert_array_equals: lengths differ, expected 0 got 1
-PASS Does not return animations with zero playback rate in after phase
-PASS Returns animations based on dynamic changes to individual animations' duration
-PASS Returns animations based on dynamic changes to individual animations' end delay
-PASS Returns animations based on dynamic changes to individual animations' iteration count
-PASS Returns animations based on dynamic changes to individual animations' current time
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Document/getAnimations-expected.txt b/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Document/getAnimations-expected.txt
deleted file mode 100644
index 92d85dc..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/interfaces/Document/getAnimations-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-PASS Test document.getAnimations for non-animated content
-PASS Test document.getAnimations for script-generated animations
-PASS Test the order of document.getAnimations with script generated animations
-PASS Test document.getAnimations for a disconnected node
-PASS Test document.getAnimations with null target
-FAIL Test document.getAnimations for elements inside same-origin iframes assert_equals: expected 1 but got 0
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt b/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt
deleted file mode 100644
index 1046b2d..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/external/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-This is a testharness.js-based test.
-PASS Transformed progress for step-start function
-PASS Transformed progress for steps(1, start) function
-PASS Transformed progress for steps(2, start) function
-PASS Transformed progress for step-end function
-PASS Transformed progress for steps(1) function
-PASS Transformed progress for steps(1, end) function
-PASS Transformed progress for steps(2, end) function
-PASS Transformed progress for frames function
-PASS Transformed progress for linear function
-FAIL Transformed progress for ease function assert_approx_equals: The progress should be approximately 0.40851059137130497 at 250ms expected 0.40851059137130497 +/- 0.01 but got 0.41869212962962965
-PASS Transformed progress for ease-in function
-PASS Transformed progress for ease-in-out function
-PASS Transformed progress for ease-out function
-PASS Transformed progress for easing function which produces values greater than 1
-PASS Transformed progress for easing function which produces values less than 1
-FAIL Test bounds point of step-start easing assert_equals: Progress at 0ms expected 0 but got 0.5
-FAIL Test bounds point of step-start easing with reverse direction assert_equals: Progress at 2000ms expected 0 but got 0.5
-PASS Test bounds point of step-start easing with iterationStart not at a transition point
-FAIL Test bounds point of step-start easing with iterationStart and delay assert_equals: Progress at 0ms expected 0.5 but got 1
-FAIL Test bounds point of step-start easing with iterationStart and reverse direction assert_equals: Progress at 2000ms expected 0.5 but got 1
-FAIL Test bounds point of step(4, start) easing with iterationStart 0.75 and delay assert_equals: Progress at 0ms expected 0.75 but got 1
-FAIL Test bounds point of step-start easing with alternate direction assert_equals: Progress at 3000ms expected 0.5 but got 1
-FAIL Test bounds point of step-start easing with alternate-reverse direction assert_equals: Progress at 3000ms expected 0.5 but got 1
-PASS Test bounds point of step-end easing
-FAIL Test bounds point of step-end easing with iterationStart and delay assert_equals: Progress at 0ms expected 0 but got 0.5
-PASS Test bounds point of step-end easing with iterationStart not at a transition point
-FAIL Test bounds point of steps(jump-both) easing Failed to execute 'animate' on 'Element': 'steps(2, jump-both)' is not a valid value for easing
-FAIL Test bounds point of steps(jump-both) easing with iterationStart and delay Failed to execute 'animate' on 'Element': 'steps(2, jump-both)' is not a valid value for easing
-FAIL Test bounds point of steps(jump-both) easing with iterationStart not at a transition point Failed to execute 'animate' on 'Element': 'steps(2, jump-both)' is not a valid value for easing
-FAIL Test bounds point of steps(jump-none) easing Failed to execute 'animate' on 'Element': 'steps(2, jump-none)' is not a valid value for easing
-FAIL Test bounds point of steps(jump-none) easing with iterationStart and delay Failed to execute 'animate' on 'Element': 'steps(2, jump-none)' is not a valid value for easing
-FAIL Test bounds point of steps(jump-none) easing with iterationStart not at a transition point Failed to execute 'animate' on 'Element': 'steps(2, jump-none)' is not a valid value for easing
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png
deleted file mode 100644
index c147371..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png
deleted file mode 100644
index 7c3fe92..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png
deleted file mode 100644
index e8a69d5..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png
deleted file mode 100644
index 09817f2..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png
deleted file mode 100644
index 4e19d96..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/text/stroking-decorations-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/text/stroking-decorations-expected.png
deleted file mode 100644
index 9c73bcd..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/fast/text/stroking-decorations-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/collapsing_borders/bug41262-3-expected.png b/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/collapsing_borders/bug41262-3-expected.png
deleted file mode 100644
index afbd12b..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/collapsing_borders/bug41262-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/fuchsia/transforms/transformed-caret-expected.png
deleted file mode 100644
index a976df3..0000000
--- a/third_party/blink/web_tests/platform/fuchsia/transforms/transformed-caret-expected.png
+++ /dev/null
Binary files differ