[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