diff --git a/BUILD.gn b/BUILD.gn
index f39930e..a325e9f 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -965,13 +965,15 @@
     }
 
     data = [
+      "$root_build_dir/resources/inspector/",
       "//testing/scripts/common.py",
-      "//testing/xvfb.py",
       "//testing/scripts/run_isolated_script_test.py",
+      "//testing/xvfb.py",
       "//third_party/WebKit/LayoutTests/",
       "//third_party/WebKit/PerformanceTests/",
+      "//third_party/WebKit/Source/platform/audio/resources/Composite.flac",
+      "//third_party/WebKit/Source/platform/audio/resources/Composite.wav",
       "//third_party/WebKit/Tools/Scripts/",
-      "$root_build_dir/resources/inspector/",
     ]
 
     if (is_win) {
diff --git a/DEPS b/DEPS
index 7199c16d..52aff2b 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'ee5db9409665e270a377c2c3be7d3b017830cfc2',
+  'v8_revision': 'a2104e4aebf5d9a498b54eb1f350fa596e9f1efd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '84a7af661032933b0bd10cdc1f656cdf6b6781c3',
+  'catapult_revision': 'df581f5fc8deac24b0027c260b6bace47906161b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -232,7 +232,7 @@
     Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '365b8a20ce38c37e5489ffcbd4f255558aa526bb', # commit position 16686
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '3a40828f8b801ca81849298e0c2b93a08e8188a5', # commit position 16713
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc
index bad8fc6e..4de1a8b3 100644
--- a/base/allocator/allocator_shim.cc
+++ b/base/allocator/allocator_shim.cc
@@ -21,6 +21,10 @@
 #include "base/allocator/winheap_stubs_win.h"
 #endif
 
+#if defined(OS_MACOSX)
+#include <malloc/malloc.h>
+#endif
+
 // No calls to malloc / new in this file. They would would cause re-entrancy of
 // the shim, which is hard to deal with. Keep this code as simple as possible
 // and don't use any external C++ object here, not even //base ones. Even if
@@ -96,7 +100,7 @@
 
 void* UncheckedAlloc(size_t size) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
-  return chain_head->alloc_function(chain_head, size);
+  return chain_head->alloc_function(chain_head, size, nullptr);
 }
 
 void InsertAllocatorDispatch(AllocatorDispatch* dispatch) {
@@ -158,53 +162,63 @@
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   void* ptr;
   do {
-    ptr = chain_head->alloc_function(chain_head, size);
+    void* context = nullptr;
+#if defined(OS_MACOSX)
+    context = malloc_default_zone();
+#endif
+    ptr = chain_head->alloc_function(chain_head, size, context);
   } while (!ptr && CallNewHandler(size));
   return ptr;
 }
 
 void ShimCppDelete(void* address) {
+  void* context = nullptr;
+#if defined(OS_MACOSX)
+  context = malloc_default_zone();
+#endif
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
-  return chain_head->free_function(chain_head, address);
+  return chain_head->free_function(chain_head, address, context);
 }
 
-void* ShimMalloc(size_t size) {
+void* ShimMalloc(size_t size, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   void* ptr;
   do {
-    ptr = chain_head->alloc_function(chain_head, size);
+    ptr = chain_head->alloc_function(chain_head, size, context);
   } while (!ptr && g_call_new_handler_on_malloc_failure &&
            CallNewHandler(size));
   return ptr;
 }
 
-void* ShimCalloc(size_t n, size_t size) {
+void* ShimCalloc(size_t n, size_t size, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   void* ptr;
   do {
-    ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size);
+    ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size,
+                                                      context);
   } while (!ptr && g_call_new_handler_on_malloc_failure &&
            CallNewHandler(size));
   return ptr;
 }
 
-void* ShimRealloc(void* address, size_t size) {
+void* ShimRealloc(void* address, size_t size, void* context) {
   // realloc(size == 0) means free() and might return a nullptr. We should
   // not call the std::new_handler in that case, though.
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   void* ptr;
   do {
-    ptr = chain_head->realloc_function(chain_head, address, size);
+    ptr = chain_head->realloc_function(chain_head, address, size, context);
   } while (!ptr && size && g_call_new_handler_on_malloc_failure &&
            CallNewHandler(size));
   return ptr;
 }
 
-void* ShimMemalign(size_t alignment, size_t size) {
+void* ShimMemalign(size_t alignment, size_t size, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   void* ptr;
   do {
-    ptr = chain_head->alloc_aligned_function(chain_head, alignment, size);
+    ptr = chain_head->alloc_aligned_function(chain_head, alignment, size,
+                                             context);
   } while (!ptr && g_call_new_handler_on_malloc_failure &&
            CallNewHandler(size));
   return ptr;
@@ -217,13 +231,13 @@
       ((alignment & (alignment - 1)) != 0) || (alignment == 0)) {
     return EINVAL;
   }
-  void* ptr = ShimMemalign(alignment, size);
+  void* ptr = ShimMemalign(alignment, size, nullptr);
   *res = ptr;
   return ptr ? 0 : ENOMEM;
 }
 
-void* ShimValloc(size_t size) {
-  return ShimMemalign(GetCachedPageSize(), size);
+void* ShimValloc(size_t size, void* context) {
+  return ShimMemalign(GetCachedPageSize(), size, context);
 }
 
 void* ShimPvalloc(size_t size) {
@@ -233,35 +247,41 @@
   } else {
     size = (size + GetCachedPageSize() - 1) & ~(GetCachedPageSize() - 1);
   }
-  return ShimMemalign(GetCachedPageSize(), size);
+  return ShimMemalign(GetCachedPageSize(), size, nullptr);
 }
 
-void ShimFree(void* address) {
+void ShimFree(void* address, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
-  return chain_head->free_function(chain_head, address);
+  return chain_head->free_function(chain_head, address, context);
 }
 
-size_t ShimGetSizeEstimate(const void* address) {
+size_t ShimGetSizeEstimate(const void* address, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
-  return chain_head->get_size_estimate_function(chain_head,
-                                                const_cast<void*>(address));
+  return chain_head->get_size_estimate_function(
+      chain_head, const_cast<void*>(address), context);
 }
 
-unsigned ShimBatchMalloc(size_t size, void** results, unsigned num_requested) {
+unsigned ShimBatchMalloc(size_t size,
+                         void** results,
+                         unsigned num_requested,
+                         void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   return chain_head->batch_malloc_function(chain_head, size, results,
-                                           num_requested);
+                                           num_requested, context);
 }
 
-void ShimBatchFree(void** to_be_freed, unsigned num_to_be_freed) {
+void ShimBatchFree(void** to_be_freed,
+                   unsigned num_to_be_freed,
+                   void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
   return chain_head->batch_free_function(chain_head, to_be_freed,
-                                         num_to_be_freed);
+                                         num_to_be_freed, context);
 }
 
-void ShimFreeDefiniteSize(void* ptr, size_t size) {
+void ShimFreeDefiniteSize(void* ptr, size_t size, void* context) {
   const allocator::AllocatorDispatch* const chain_head = GetChainHead();
-  return chain_head->free_definite_size_function(chain_head, ptr, size);
+  return chain_head->free_definite_size_function(chain_head, ptr, size,
+                                                 context);
 }
 
 }  // extern "C"
diff --git a/base/allocator/allocator_shim.h b/base/allocator/allocator_shim.h
index f43ec299..65ac1eb7 100644
--- a/base/allocator/allocator_shim.h
+++ b/base/allocator/allocator_shim.h
@@ -46,33 +46,44 @@
 // wihout introducing unnecessary perf hits.
 
 struct AllocatorDispatch {
-  using AllocFn = void*(const AllocatorDispatch* self, size_t size);
+  using AllocFn = void*(const AllocatorDispatch* self,
+                        size_t size,
+                        void* context);
   using AllocZeroInitializedFn = void*(const AllocatorDispatch* self,
                                        size_t n,
-                                       size_t size);
+                                       size_t size,
+                                       void* context);
   using AllocAlignedFn = void*(const AllocatorDispatch* self,
                                size_t alignment,
-                               size_t size);
+                               size_t size,
+                               void* context);
   using ReallocFn = void*(const AllocatorDispatch* self,
                           void* address,
-                          size_t size);
-  using FreeFn = void(const AllocatorDispatch* self, void* address);
+                          size_t size,
+                          void* context);
+  using FreeFn = void(const AllocatorDispatch* self,
+                      void* address,
+                      void* context);
   // Returns the best available estimate for the actual amount of memory
   // consumed by the allocation |address|. If possible, this should include
   // heap overhead or at least a decent estimate of the full cost of the
   // allocation. If no good estimate is possible, returns zero.
   using GetSizeEstimateFn = size_t(const AllocatorDispatch* self,
-                                   void* address);
+                                   void* address,
+                                   void* context);
   using BatchMallocFn = unsigned(const AllocatorDispatch* self,
                                  size_t size,
                                  void** results,
-                                 unsigned num_requested);
+                                 unsigned num_requested,
+                                 void* context);
   using BatchFreeFn = void(const AllocatorDispatch* self,
                            void** to_be_freed,
-                           unsigned num_to_be_freed);
+                           unsigned num_to_be_freed,
+                           void* context);
   using FreeDefiniteSizeFn = void(const AllocatorDispatch* self,
                                   void* ptr,
-                                  size_t size);
+                                  size_t size,
+                                  void* context);
 
   AllocFn* const alloc_function;
   AllocZeroInitializedFn* const alloc_zero_initialized_function;
diff --git a/base/allocator/allocator_shim_default_dispatch_to_glibc.cc b/base/allocator/allocator_shim_default_dispatch_to_glibc.cc
index 7415ec6..8574da3 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_glibc.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_glibc.cc
@@ -22,27 +22,38 @@
 
 using base::allocator::AllocatorDispatch;
 
-void* GlibcMalloc(const AllocatorDispatch*, size_t size) {
+void* GlibcMalloc(const AllocatorDispatch*, size_t size, void* context) {
   return __libc_malloc(size);
 }
 
-void* GlibcCalloc(const AllocatorDispatch*, size_t n, size_t size) {
+void* GlibcCalloc(const AllocatorDispatch*,
+                  size_t n,
+                  size_t size,
+                  void* context) {
   return __libc_calloc(n, size);
 }
 
-void* GlibcRealloc(const AllocatorDispatch*, void* address, size_t size) {
+void* GlibcRealloc(const AllocatorDispatch*,
+                   void* address,
+                   size_t size,
+                   void* context) {
   return __libc_realloc(address, size);
 }
 
-void* GlibcMemalign(const AllocatorDispatch*, size_t alignment, size_t size) {
+void* GlibcMemalign(const AllocatorDispatch*,
+                    size_t alignment,
+                    size_t size,
+                    void* context) {
   return __libc_memalign(alignment, size);
 }
 
-void GlibcFree(const AllocatorDispatch*, void* address) {
+void GlibcFree(const AllocatorDispatch*, void* address, void* context) {
   __libc_free(address);
 }
 
-size_t GlibcGetSizeEstimate(const AllocatorDispatch*, void* address) {
+size_t GlibcGetSizeEstimate(const AllocatorDispatch*,
+                            void* address,
+                            void* context) {
   // TODO(siggi, primiano): malloc_usable_size may need redirection in the
   //     presence of interposing shims that divert allocations.
   return malloc_usable_size(address);
diff --git a/base/allocator/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc b/base/allocator/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
index 0fe7719..e33754a 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
@@ -32,23 +32,32 @@
 
 using base::allocator::AllocatorDispatch;
 
-void* RealMalloc(const AllocatorDispatch*, size_t size) {
+void* RealMalloc(const AllocatorDispatch*, size_t size, void* context) {
   return __real_malloc(size);
 }
 
-void* RealCalloc(const AllocatorDispatch*, size_t n, size_t size) {
+void* RealCalloc(const AllocatorDispatch*,
+                 size_t n,
+                 size_t size,
+                 void* context) {
   return __real_calloc(n, size);
 }
 
-void* RealRealloc(const AllocatorDispatch*, void* address, size_t size) {
+void* RealRealloc(const AllocatorDispatch*,
+                  void* address,
+                  size_t size,
+                  void* context) {
   return __real_realloc(address, size);
 }
 
-void* RealMemalign(const AllocatorDispatch*, size_t alignment, size_t size) {
+void* RealMemalign(const AllocatorDispatch*,
+                   size_t alignment,
+                   size_t size,
+                   void* context) {
   return __real_memalign(alignment, size);
 }
 
-void RealFree(const AllocatorDispatch*, void* address) {
+void RealFree(const AllocatorDispatch*, void* address, void* context) {
   __real_free(address);
 }
 
@@ -56,7 +65,9 @@
 size_t DummyMallocUsableSize(const void*) { return 0; }
 #endif
 
-size_t RealSizeEstimate(const AllocatorDispatch*, void* address) {
+size_t RealSizeEstimate(const AllocatorDispatch*,
+                        void* address,
+                        void* context) {
 #if defined(OS_ANDROID)
 #if __ANDROID_API__ < 17
   // malloc_usable_size() is available only starting from API 17.
diff --git a/base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.cc b/base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.cc
index bc13100..aabda19 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.cc
@@ -20,49 +20,68 @@
 // malloc zone.
 MallocZoneFunctions g_default_zone;
 
-void* MallocImpl(const AllocatorDispatch*, size_t size) {
-  return g_default_zone.malloc(malloc_default_zone(), size);
+void* MallocImpl(const AllocatorDispatch*, size_t size, void* context) {
+  return g_default_zone.malloc(
+      reinterpret_cast<struct _malloc_zone_t*>(context), size);
 }
 
-void* CallocImpl(const AllocatorDispatch*, size_t n, size_t size) {
-  return g_default_zone.calloc(malloc_default_zone(), n, size);
+void* CallocImpl(const AllocatorDispatch*,
+                 size_t n,
+                 size_t size,
+                 void* context) {
+  return g_default_zone.calloc(
+      reinterpret_cast<struct _malloc_zone_t*>(context), n, size);
 }
 
-void* MemalignImpl(const AllocatorDispatch*, size_t alignment, size_t size) {
-  return g_default_zone.memalign(malloc_default_zone(), alignment, size);
+void* MemalignImpl(const AllocatorDispatch*,
+                   size_t alignment,
+                   size_t size,
+                   void* context) {
+  return g_default_zone.memalign(
+      reinterpret_cast<struct _malloc_zone_t*>(context), alignment, size);
 }
 
-void* ReallocImpl(const AllocatorDispatch*, void* ptr, size_t size) {
-  return g_default_zone.realloc(malloc_default_zone(), ptr, size);
+void* ReallocImpl(const AllocatorDispatch*,
+                  void* ptr,
+                  size_t size,
+                  void* context) {
+  return g_default_zone.realloc(
+      reinterpret_cast<struct _malloc_zone_t*>(context), ptr, size);
 }
 
-void FreeImpl(const AllocatorDispatch*, void* ptr) {
-  g_default_zone.free(malloc_default_zone(), ptr);
+void FreeImpl(const AllocatorDispatch*, void* ptr, void* context) {
+  g_default_zone.free(reinterpret_cast<struct _malloc_zone_t*>(context), ptr);
 }
 
-size_t GetSizeEstimateImpl(const AllocatorDispatch*, void* ptr) {
-  return g_default_zone.size(malloc_default_zone(), ptr);
+size_t GetSizeEstimateImpl(const AllocatorDispatch*, void* ptr, void* context) {
+  return g_default_zone.size(reinterpret_cast<struct _malloc_zone_t*>(context),
+                             ptr);
 }
 
 unsigned BatchMallocImpl(const AllocatorDispatch* self,
                          size_t size,
                          void** results,
-                         unsigned num_requested) {
-  return g_default_zone.batch_malloc(malloc_default_zone(), size, results,
-                                     num_requested);
+                         unsigned num_requested,
+                         void* context) {
+  return g_default_zone.batch_malloc(
+      reinterpret_cast<struct _malloc_zone_t*>(context), size, results,
+      num_requested);
 }
 
 void BatchFreeImpl(const AllocatorDispatch* self,
                    void** to_be_freed,
-                   unsigned num_to_be_freed) {
-  g_default_zone.batch_free(malloc_default_zone(), to_be_freed,
-                            num_to_be_freed);
+                   unsigned num_to_be_freed,
+                   void* context) {
+  g_default_zone.batch_free(reinterpret_cast<struct _malloc_zone_t*>(context),
+                            to_be_freed, num_to_be_freed);
 }
 
 void FreeDefiniteSizeImpl(const AllocatorDispatch* self,
                           void* ptr,
-                          size_t size) {
-  g_default_zone.free_definite_size(malloc_default_zone(), ptr, size);
+                          size_t size,
+                          void* context) {
+  g_default_zone.free_definite_size(
+      reinterpret_cast<struct _malloc_zone_t*>(context), ptr, size);
 }
 
 }  // namespace
diff --git a/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc b/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc
index c90b4c8..878e8a7 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc
@@ -11,27 +11,35 @@
 
 using base::allocator::AllocatorDispatch;
 
-void* TCMalloc(const AllocatorDispatch*, size_t size) {
+void* TCMalloc(const AllocatorDispatch*, size_t size, void* context) {
   return tc_malloc(size);
 }
 
-void* TCCalloc(const AllocatorDispatch*, size_t n, size_t size) {
+void* TCCalloc(const AllocatorDispatch*, size_t n, size_t size, void* context) {
   return tc_calloc(n, size);
 }
 
-void* TCMemalign(const AllocatorDispatch*, size_t alignment, size_t size) {
+void* TCMemalign(const AllocatorDispatch*,
+                 size_t alignment,
+                 size_t size,
+                 void* context) {
   return tc_memalign(alignment, size);
 }
 
-void* TCRealloc(const AllocatorDispatch*, void* address, size_t size) {
+void* TCRealloc(const AllocatorDispatch*,
+                void* address,
+                size_t size,
+                void* context) {
   return tc_realloc(address, size);
 }
 
-void TCFree(const AllocatorDispatch*, void* address) {
+void TCFree(const AllocatorDispatch*, void* address, void* context) {
   tc_free(address);
 }
 
-size_t TCGetSizeEstimate(const AllocatorDispatch*, void* address) {
+size_t TCGetSizeEstimate(const AllocatorDispatch*,
+                         void* address,
+                         void* context) {
   return tc_malloc_size(address);
 }
 
diff --git a/base/allocator/allocator_shim_default_dispatch_to_winheap.cc b/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
index 2772e0f..f65e54d 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
@@ -11,19 +11,22 @@
 
 using base::allocator::AllocatorDispatch;
 
-void* DefaultWinHeapMallocImpl(const AllocatorDispatch*, size_t size) {
+void* DefaultWinHeapMallocImpl(const AllocatorDispatch*,
+                               size_t size,
+                               void* context) {
   return base::allocator::WinHeapMalloc(size);
 }
 
 void* DefaultWinHeapCallocImpl(const AllocatorDispatch* self,
                                size_t n,
-                               size_t elem_size) {
+                               size_t elem_size,
+                               void* context) {
   // Overflow check.
   const size_t size = n * elem_size;
   if (elem_size != 0 && size / elem_size != n)
     return nullptr;
 
-  void* result = DefaultWinHeapMallocImpl(self, size);
+  void* result = DefaultWinHeapMallocImpl(self, size, context);
   if (result) {
     memset(result, 0, size);
   }
@@ -32,23 +35,28 @@
 
 void* DefaultWinHeapMemalignImpl(const AllocatorDispatch* self,
                                  size_t alignment,
-                                 size_t size) {
+                                 size_t size,
+                                 void* context) {
   CHECK(false) << "The windows heap does not support memalign.";
   return nullptr;
 }
 
 void* DefaultWinHeapReallocImpl(const AllocatorDispatch* self,
                                 void* address,
-                                size_t size) {
+                                size_t size,
+                                void* context) {
   return base::allocator::WinHeapRealloc(address, size);
 }
 
-void DefaultWinHeapFreeImpl(const AllocatorDispatch*, void* address) {
+void DefaultWinHeapFreeImpl(const AllocatorDispatch*,
+                            void* address,
+                            void* context) {
   base::allocator::WinHeapFree(address);
 }
 
 size_t DefaultWinHeapGetSizeEstimateImpl(const AllocatorDispatch*,
-                                         void* address) {
+                                         void* address,
+                                         void* context) {
   return base::allocator::WinHeapGetSizeEstimate(address);
 }
 
diff --git a/base/allocator/allocator_shim_override_glibc_weak_symbols.h b/base/allocator/allocator_shim_override_glibc_weak_symbols.h
index 7949399..a0b46183 100644
--- a/base/allocator/allocator_shim_override_glibc_weak_symbols.h
+++ b/base/allocator/allocator_shim_override_glibc_weak_symbols.h
@@ -39,19 +39,19 @@
 namespace {
 
 void* GlibcMallocHook(size_t size, const void* caller) {
-  return ShimMalloc(size);
+  return ShimMalloc(size, nullptr);
 }
 
 void* GlibcReallocHook(void* ptr, size_t size, const void* caller) {
-  return ShimRealloc(ptr, size);
+  return ShimRealloc(ptr, size, nullptr);
 }
 
 void GlibcFreeHook(void* ptr, const void* caller) {
-  return ShimFree(ptr);
+  return ShimFree(ptr, nullptr);
 }
 
 void* GlibcMemalignHook(size_t align, size_t size, const void* caller) {
-  return ShimMemalign(align, size);
+  return ShimMemalign(align, size, nullptr);
 }
 
 }  // namespace
diff --git a/base/allocator/allocator_shim_override_mac_symbols.h b/base/allocator/allocator_shim_override_mac_symbols.h
index 5107d752..5ae9b2a 100644
--- a/base/allocator/allocator_shim_override_mac_symbols.h
+++ b/base/allocator/allocator_shim_override_mac_symbols.h
@@ -16,39 +16,41 @@
 void OverrideMacSymbols() {
   MallocZoneFunctions new_functions;
   new_functions.size = [](malloc_zone_t* zone, const void* ptr) -> size_t {
-    return ShimGetSizeEstimate(ptr);
+    return ShimGetSizeEstimate(ptr, zone);
   };
   new_functions.malloc = [](malloc_zone_t* zone, size_t size) -> void* {
-    return ShimMalloc(size);
+    return ShimMalloc(size, zone);
   };
   new_functions.calloc = [](malloc_zone_t* zone, size_t n,
                             size_t size) -> void* {
-    return ShimCalloc(n, size);
+    return ShimCalloc(n, size, zone);
   };
   new_functions.valloc = [](malloc_zone_t* zone, size_t size) -> void* {
-    return ShimValloc(size);
+    return ShimValloc(size, zone);
   };
-  new_functions.free = [](malloc_zone_t* zone, void* ptr) { ShimFree(ptr); };
+  new_functions.free = [](malloc_zone_t* zone, void* ptr) {
+    ShimFree(ptr, zone);
+  };
   new_functions.realloc = [](malloc_zone_t* zone, void* ptr,
                              size_t size) -> void* {
-    return ShimRealloc(ptr, size);
+    return ShimRealloc(ptr, size, zone);
   };
   new_functions.batch_malloc = [](struct _malloc_zone_t* zone, size_t size,
                                   void** results,
                                   unsigned num_requested) -> unsigned {
-    return ShimBatchMalloc(size, results, num_requested);
+    return ShimBatchMalloc(size, results, num_requested, zone);
   };
   new_functions.batch_free = [](struct _malloc_zone_t* zone, void** to_be_freed,
                                 unsigned num_to_be_freed) -> void {
-    ShimBatchFree(to_be_freed, num_to_be_freed);
+    ShimBatchFree(to_be_freed, num_to_be_freed, zone);
   };
   new_functions.memalign = [](malloc_zone_t* zone, size_t alignment,
                               size_t size) -> void* {
-    return ShimMemalign(alignment, size);
+    return ShimMemalign(alignment, size, zone);
   };
   new_functions.free_definite_size = [](malloc_zone_t* zone, void* ptr,
                                         size_t size) {
-    ShimFreeDefiniteSize(ptr, size);
+    ShimFreeDefiniteSize(ptr, size, zone);
   };
 
   base::allocator::ReplaceFunctionsForDefaultZone(&new_functions);
diff --git a/base/allocator/allocator_shim_override_ucrt_symbols_win.h b/base/allocator/allocator_shim_override_ucrt_symbols_win.h
index b8d0d91f..9fb7d067 100644
--- a/base/allocator/allocator_shim_override_ucrt_symbols_win.h
+++ b/base/allocator/allocator_shim_override_ucrt_symbols_win.h
@@ -48,19 +48,19 @@
 
 // These symbols override the CRT's implementation of the same functions.
 __declspec(restrict) void* malloc(size_t size) {
-  return ShimMalloc(size);
+  return ShimMalloc(size, nullptr);
 }
 
 void free(void* ptr) {
-  ShimFree(ptr);
+  ShimFree(ptr, nullptr);
 }
 
 __declspec(restrict) void* realloc(void* ptr, size_t size) {
-  return ShimRealloc(ptr, size);
+  return ShimRealloc(ptr, size, nullptr);
 }
 
 __declspec(restrict) void* calloc(size_t n, size_t size) {
-  return ShimCalloc(n, size);
+  return ShimCalloc(n, size, nullptr);
 }
 
 // The symbols
diff --git a/base/allocator/allocator_shim_unittest.cc b/base/allocator/allocator_shim_unittest.cc
index cff7dd7..ee90f63 100644
--- a/base/allocator/allocator_shim_unittest.cc
+++ b/base/allocator/allocator_shim_unittest.cc
@@ -59,36 +59,43 @@
     return reinterpret_cast<uintptr_t>(ptr) % kMaxSizeTracked;
   }
 
-  static void* MockAlloc(const AllocatorDispatch* self, size_t size) {
+  static void* MockAlloc(const AllocatorDispatch* self,
+                         size_t size,
+                         void* context) {
     if (instance_ && size < kMaxSizeTracked)
       ++(instance_->allocs_intercepted_by_size[size]);
-    return self->next->alloc_function(self->next, size);
+    return self->next->alloc_function(self->next, size, context);
   }
 
   static void* MockAllocZeroInit(const AllocatorDispatch* self,
                                  size_t n,
-                                 size_t size) {
+                                 size_t size,
+                                 void* context) {
     const size_t real_size = n * size;
     if (instance_ && real_size < kMaxSizeTracked)
       ++(instance_->zero_allocs_intercepted_by_size[real_size]);
-    return self->next->alloc_zero_initialized_function(self->next, n, size);
+    return self->next->alloc_zero_initialized_function(self->next, n, size,
+                                                       context);
   }
 
   static void* MockAllocAligned(const AllocatorDispatch* self,
                                 size_t alignment,
-                                size_t size) {
+                                size_t size,
+                                void* context) {
     if (instance_) {
       if (size < kMaxSizeTracked)
         ++(instance_->aligned_allocs_intercepted_by_size[size]);
       if (alignment < kMaxSizeTracked)
         ++(instance_->aligned_allocs_intercepted_by_alignment[alignment]);
     }
-    return self->next->alloc_aligned_function(self->next, alignment, size);
+    return self->next->alloc_aligned_function(self->next, alignment, size,
+                                              context);
   }
 
   static void* MockRealloc(const AllocatorDispatch* self,
                            void* address,
-                           size_t size) {
+                           size_t size,
+                           void* context) {
     if (instance_) {
       // Size 0xFEED a special sentinel for the NewHandlerConcurrency test.
       // Hitting it for the first time will cause a failure, causing the
@@ -106,52 +113,59 @@
         ++(instance_->reallocs_intercepted_by_size[size]);
       ++instance_->reallocs_intercepted_by_addr[Hash(address)];
     }
-    return self->next->realloc_function(self->next, address, size);
+    return self->next->realloc_function(self->next, address, size, context);
   }
 
-  static void MockFree(const AllocatorDispatch* self, void* address) {
+  static void MockFree(const AllocatorDispatch* self,
+                       void* address,
+                       void* context) {
     if (instance_) {
       ++instance_->frees_intercepted_by_addr[Hash(address)];
     }
-    self->next->free_function(self->next, address);
+    self->next->free_function(self->next, address, context);
   }
 
   static size_t MockGetSizeEstimate(const AllocatorDispatch* self,
-                                    void* address) {
-    return self->next->get_size_estimate_function(self->next, address);
+                                    void* address,
+                                    void* context) {
+    return self->next->get_size_estimate_function(self->next, address, context);
   }
 
   static unsigned MockBatchMalloc(const AllocatorDispatch* self,
                                   size_t size,
                                   void** results,
-                                  unsigned num_requested) {
+                                  unsigned num_requested,
+                                  void* context) {
     if (instance_) {
       instance_->batch_mallocs_intercepted_by_size[size] =
           instance_->batch_mallocs_intercepted_by_size[size] + num_requested;
     }
     return self->next->batch_malloc_function(self->next, size, results,
-                                             num_requested);
+                                             num_requested, context);
   }
 
   static void MockBatchFree(const AllocatorDispatch* self,
                             void** to_be_freed,
-                            unsigned num_to_be_freed) {
+                            unsigned num_to_be_freed,
+                            void* context) {
     if (instance_) {
       for (unsigned i = 0; i < num_to_be_freed; ++i) {
         ++instance_->batch_frees_intercepted_by_addr[Hash(to_be_freed[i])];
       }
     }
-    self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed);
+    self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed,
+                                    context);
   }
 
   static void MockFreeDefiniteSize(const AllocatorDispatch* self,
                                    void* ptr,
-                                   size_t size) {
+                                   size_t size,
+                                   void* context) {
     if (instance_) {
       ++instance_->frees_intercepted_by_addr[Hash(ptr)];
       ++instance_->free_definite_sizes_intercepted_by_size[size];
     }
-    self->next->free_definite_size_function(self->next, ptr, size);
+    self->next->free_definite_size_function(self->next, ptr, size, context);
   }
 
   static void NewHandler() {
diff --git a/base/android/java/src/org/chromium/base/PowerMonitor.java b/base/android/java/src/org/chromium/base/PowerMonitor.java
index bd06d9b..ae36a75d 100644
--- a/base/android/java/src/org/chromium/base/PowerMonitor.java
+++ b/base/android/java/src/org/chromium/base/PowerMonitor.java
@@ -9,8 +9,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.BatteryManager;
-import android.os.Handler;
-import android.os.Looper;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -20,19 +18,15 @@
  */
 @JNINamespace("base::android")
 public class PowerMonitor  {
-    private static class LazyHolder {
-        private static final PowerMonitor INSTANCE = new PowerMonitor();
-    }
     private static PowerMonitor sInstance;
 
     private boolean mIsBatteryPower;
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
 
     public static void createForTests() {
         // Applications will create this once the JNI side has been fully wired up both sides. For
         // tests, we just need native -> java, that is, we don't need to notify java -> native on
         // creation.
-        sInstance = LazyHolder.INSTANCE;
+        sInstance = new PowerMonitor();
     }
 
     /**
@@ -44,7 +38,7 @@
         if (sInstance != null) return;
 
         Context context = ContextUtils.getApplicationContext();
-        sInstance = LazyHolder.INSTANCE;
+        sInstance = new PowerMonitor();
         IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
         Intent batteryStatusIntent = context.registerReceiver(null, ifilter);
         if (batteryStatusIntent != null) onBatteryChargingChanged(batteryStatusIntent);
diff --git a/base/debug/thread_heap_usage_tracker.cc b/base/debug/thread_heap_usage_tracker.cc
index c8a0ba4..1536536 100644
--- a/base/debug/thread_heap_usage_tracker.cc
+++ b/base/debug/thread_heap_usage_tracker.cc
@@ -43,20 +43,25 @@
 // lower shim.
 ThreadHeapUsage* GetOrCreateThreadUsage();
 
-size_t GetAllocSizeEstimate(const AllocatorDispatch* next, void* ptr) {
+size_t GetAllocSizeEstimate(const AllocatorDispatch* next,
+                            void* ptr,
+                            void* context) {
   if (ptr == nullptr)
     return 0U;
 
-  return next->get_size_estimate_function(next, ptr);
+  return next->get_size_estimate_function(next, ptr, context);
 }
 
-void RecordAlloc(const AllocatorDispatch* next, void* ptr, size_t size) {
+void RecordAlloc(const AllocatorDispatch* next,
+                 void* ptr,
+                 size_t size,
+                 void* context) {
   ThreadHeapUsage* usage = GetOrCreateThreadUsage();
   if (usage == nullptr)
     return;
 
   usage->alloc_ops++;
-  size_t estimate = GetAllocSizeEstimate(next, ptr);
+  size_t estimate = GetAllocSizeEstimate(next, ptr, context);
   if (size && estimate) {
     // Only keep track of the net number of bytes allocated in the scope if the
     // size estimate function returns sane values, e.g. non-zero.
@@ -75,92 +80,107 @@
   }
 }
 
-void RecordFree(const AllocatorDispatch* next, void* ptr) {
+void RecordFree(const AllocatorDispatch* next, void* ptr, void* context) {
   ThreadHeapUsage* usage = GetOrCreateThreadUsage();
   if (usage == nullptr)
     return;
 
-  size_t estimate = GetAllocSizeEstimate(next, ptr);
+  size_t estimate = GetAllocSizeEstimate(next, ptr, context);
   usage->free_ops++;
   usage->free_bytes += estimate;
 }
 
-void* AllocFn(const AllocatorDispatch* self, size_t size) {
-  void* ret = self->next->alloc_function(self->next, size);
+void* AllocFn(const AllocatorDispatch* self, size_t size, void* context) {
+  void* ret = self->next->alloc_function(self->next, size, context);
   if (ret != nullptr)
-    RecordAlloc(self->next, ret, size);
+    RecordAlloc(self->next, ret, size, context);
 
   return ret;
 }
 
 void* AllocZeroInitializedFn(const AllocatorDispatch* self,
                              size_t n,
-                             size_t size) {
-  void* ret = self->next->alloc_zero_initialized_function(self->next, n, size);
+                             size_t size,
+                             void* context) {
+  void* ret =
+      self->next->alloc_zero_initialized_function(self->next, n, size, context);
   if (ret != nullptr)
-    RecordAlloc(self->next, ret, size);
+    RecordAlloc(self->next, ret, size, context);
 
   return ret;
 }
 
 void* AllocAlignedFn(const AllocatorDispatch* self,
                      size_t alignment,
-                     size_t size) {
-  void* ret = self->next->alloc_aligned_function(self->next, alignment, size);
+                     size_t size,
+                     void* context) {
+  void* ret =
+      self->next->alloc_aligned_function(self->next, alignment, size, context);
   if (ret != nullptr)
-    RecordAlloc(self->next, ret, size);
+    RecordAlloc(self->next, ret, size, context);
 
   return ret;
 }
 
-void* ReallocFn(const AllocatorDispatch* self, void* address, size_t size) {
+void* ReallocFn(const AllocatorDispatch* self,
+                void* address,
+                size_t size,
+                void* context) {
   if (address != nullptr)
-    RecordFree(self->next, address);
+    RecordFree(self->next, address, context);
 
-  void* ret = self->next->realloc_function(self->next, address, size);
+  void* ret = self->next->realloc_function(self->next, address, size, context);
   if (ret != nullptr && size != 0)
-    RecordAlloc(self->next, ret, size);
+    RecordAlloc(self->next, ret, size, context);
 
   return ret;
 }
 
-void FreeFn(const AllocatorDispatch* self, void* address) {
+void FreeFn(const AllocatorDispatch* self, void* address, void* context) {
   if (address != nullptr)
-    RecordFree(self->next, address);
-  self->next->free_function(self->next, address);
+    RecordFree(self->next, address, context);
+  self->next->free_function(self->next, address, context);
 }
 
-size_t GetSizeEstimateFn(const AllocatorDispatch* self, void* address) {
-  return self->next->get_size_estimate_function(self->next, address);
+size_t GetSizeEstimateFn(const AllocatorDispatch* self,
+                         void* address,
+                         void* context) {
+  return self->next->get_size_estimate_function(self->next, address, context);
 }
 
 unsigned BatchMallocFn(const AllocatorDispatch* self,
                        size_t size,
                        void** results,
-                       unsigned num_requested) {
+                       unsigned num_requested,
+                       void* context) {
   unsigned count = self->next->batch_malloc_function(self->next, size, results,
-                                                     num_requested);
+                                                     num_requested, context);
   for (unsigned i = 0; i < count; ++i) {
-    RecordAlloc(self->next, results[i], size);
+    RecordAlloc(self->next, results[i], size, context);
   }
   return count;
 }
 
 void BatchFreeFn(const AllocatorDispatch* self,
                  void** to_be_freed,
-                 unsigned num_to_be_freed) {
+                 unsigned num_to_be_freed,
+                 void* context) {
   for (unsigned i = 0; i < num_to_be_freed; ++i) {
     if (to_be_freed[i] != nullptr) {
-      RecordFree(self->next, to_be_freed[i]);
+      RecordFree(self->next, to_be_freed[i], context);
     }
   }
-  self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed);
+  self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed,
+                                  context);
 }
 
-void FreeDefiniteSizeFn(const AllocatorDispatch* self, void* ptr, size_t size) {
+void FreeDefiniteSizeFn(const AllocatorDispatch* self,
+                        void* ptr,
+                        size_t size,
+                        void* context) {
   if (ptr != nullptr)
-    RecordFree(self->next, ptr);
-  self->next->free_definite_size_function(self->next, ptr, size);
+    RecordFree(self->next, ptr, context);
+  self->next->free_definite_size_function(self->next, ptr, size, context);
 }
 
 // The allocator dispatch used to intercept heap operations.
diff --git a/base/debug/thread_heap_usage_tracker_unittest.cc b/base/debug/thread_heap_usage_tracker_unittest.cc
index 5c03c38..2012e497 100644
--- a/base/debug/thread_heap_usage_tracker_unittest.cc
+++ b/base/debug/thread_heap_usage_tracker_unittest.cc
@@ -68,31 +68,32 @@
   }
 
   void* MockMalloc(size_t size) {
-    return dispatch_under_test_->alloc_function(dispatch_under_test_, size);
+    return dispatch_under_test_->alloc_function(dispatch_under_test_, size,
+                                                nullptr);
   }
 
   void* MockCalloc(size_t n, size_t size) {
     return dispatch_under_test_->alloc_zero_initialized_function(
-        dispatch_under_test_, n, size);
+        dispatch_under_test_, n, size, nullptr);
   }
 
   void* MockAllocAligned(size_t alignment, size_t size) {
-    return dispatch_under_test_->alloc_aligned_function(dispatch_under_test_,
-                                                        alignment, size);
+    return dispatch_under_test_->alloc_aligned_function(
+        dispatch_under_test_, alignment, size, nullptr);
   }
 
   void* MockRealloc(void* address, size_t size) {
     return dispatch_under_test_->realloc_function(dispatch_under_test_, address,
-                                                  size);
+                                                  size, nullptr);
   }
 
   void MockFree(void* address) {
-    dispatch_under_test_->free_function(dispatch_under_test_, address);
+    dispatch_under_test_->free_function(dispatch_under_test_, address, nullptr);
   }
 
   size_t MockGetSizeEstimate(void* address) {
     return dispatch_under_test_->get_size_estimate_function(
-        dispatch_under_test_, address);
+        dispatch_under_test_, address, nullptr);
   }
 
  private:
@@ -126,7 +127,9 @@
     return ret;
   }
 
-  static void* OnAllocFn(const AllocatorDispatch* self, size_t size) {
+  static void* OnAllocFn(const AllocatorDispatch* self,
+                         size_t size,
+                         void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     void* ret = malloc(size);
@@ -136,7 +139,8 @@
 
   static void* OnAllocZeroInitializedFn(const AllocatorDispatch* self,
                                         size_t n,
-                                        size_t size) {
+                                        size_t size,
+                                        void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     void* ret = calloc(n, size);
@@ -146,7 +150,8 @@
 
   static void* OnAllocAlignedFn(const AllocatorDispatch* self,
                                 size_t alignment,
-                                size_t size) {
+                                size_t size,
+                                void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     // This is a cheat as it doesn't return aligned allocations. This has the
@@ -158,7 +163,8 @@
 
   static void* OnReallocFn(const AllocatorDispatch* self,
                            void* address,
-                           size_t size) {
+                           size_t size,
+                           void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     g_self->DeleteAlloc(address);
@@ -167,7 +173,9 @@
     return ret;
   }
 
-  static void OnFreeFn(const AllocatorDispatch* self, void* address) {
+  static void OnFreeFn(const AllocatorDispatch* self,
+                       void* address,
+                       void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     g_self->DeleteAlloc(address);
@@ -175,7 +183,8 @@
   }
 
   static size_t OnGetSizeEstimateFn(const AllocatorDispatch* self,
-                                    void* address) {
+                                    void* address,
+                                    void* context) {
     EXPECT_EQ(&g_mock_dispatch, self);
 
     return g_self->GetSizeEstimate(address);
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc
index 220b93e..52a432b8 100644
--- a/base/trace_event/malloc_dump_provider.cc
+++ b/base/trace_event/malloc_dump_provider.cc
@@ -35,17 +35,20 @@
 
 using allocator::AllocatorDispatch;
 
-void* HookAlloc(const AllocatorDispatch* self, size_t size) {
+void* HookAlloc(const AllocatorDispatch* self, size_t size, void* context) {
   const AllocatorDispatch* const next = self->next;
-  void* ptr = next->alloc_function(next, size);
+  void* ptr = next->alloc_function(next, size, context);
   if (ptr)
     MallocDumpProvider::GetInstance()->InsertAllocation(ptr, size);
   return ptr;
 }
 
-void* HookZeroInitAlloc(const AllocatorDispatch* self, size_t n, size_t size) {
+void* HookZeroInitAlloc(const AllocatorDispatch* self,
+                        size_t n,
+                        size_t size,
+                        void* context) {
   const AllocatorDispatch* const next = self->next;
-  void* ptr = next->alloc_zero_initialized_function(next, n, size);
+  void* ptr = next->alloc_zero_initialized_function(next, n, size, context);
   if (ptr)
     MallocDumpProvider::GetInstance()->InsertAllocation(ptr, n * size);
   return ptr;
@@ -53,42 +56,49 @@
 
 void* HookllocAligned(const AllocatorDispatch* self,
                       size_t alignment,
-                      size_t size) {
+                      size_t size,
+                      void* context) {
   const AllocatorDispatch* const next = self->next;
-  void* ptr = next->alloc_aligned_function(next, alignment, size);
+  void* ptr = next->alloc_aligned_function(next, alignment, size, context);
   if (ptr)
     MallocDumpProvider::GetInstance()->InsertAllocation(ptr, size);
   return ptr;
 }
 
-void* HookRealloc(const AllocatorDispatch* self, void* address, size_t size) {
+void* HookRealloc(const AllocatorDispatch* self,
+                  void* address,
+                  size_t size,
+                  void* context) {
   const AllocatorDispatch* const next = self->next;
-  void* ptr = next->realloc_function(next, address, size);
+  void* ptr = next->realloc_function(next, address, size, context);
   MallocDumpProvider::GetInstance()->RemoveAllocation(address);
   if (size > 0)  // realloc(size == 0) means free().
     MallocDumpProvider::GetInstance()->InsertAllocation(ptr, size);
   return ptr;
 }
 
-void HookFree(const AllocatorDispatch* self, void* address) {
+void HookFree(const AllocatorDispatch* self, void* address, void* context) {
   if (address)
     MallocDumpProvider::GetInstance()->RemoveAllocation(address);
   const AllocatorDispatch* const next = self->next;
-  next->free_function(next, address);
+  next->free_function(next, address, context);
 }
 
-size_t HookGetSizeEstimate(const AllocatorDispatch* self, void* address) {
+size_t HookGetSizeEstimate(const AllocatorDispatch* self,
+                           void* address,
+                           void* context) {
   const AllocatorDispatch* const next = self->next;
-  return next->get_size_estimate_function(next, address);
+  return next->get_size_estimate_function(next, address, context);
 }
 
 unsigned HookBatchMalloc(const AllocatorDispatch* self,
                          size_t size,
                          void** results,
-                         unsigned num_requested) {
+                         unsigned num_requested,
+                         void* context) {
   const AllocatorDispatch* const next = self->next;
   unsigned count =
-      next->batch_malloc_function(next, size, results, num_requested);
+      next->batch_malloc_function(next, size, results, num_requested, context);
   for (unsigned i = 0; i < count; ++i) {
     MallocDumpProvider::GetInstance()->InsertAllocation(results[i], size);
   }
@@ -97,21 +107,23 @@
 
 void HookBatchFree(const AllocatorDispatch* self,
                    void** to_be_freed,
-                   unsigned num_to_be_freed) {
+                   unsigned num_to_be_freed,
+                   void* context) {
   const AllocatorDispatch* const next = self->next;
   for (unsigned i = 0; i < num_to_be_freed; ++i) {
     MallocDumpProvider::GetInstance()->RemoveAllocation(to_be_freed[i]);
   }
-  next->batch_free_function(next, to_be_freed, num_to_be_freed);
+  next->batch_free_function(next, to_be_freed, num_to_be_freed, context);
 }
 
 void HookFreeDefiniteSize(const AllocatorDispatch* self,
                           void* ptr,
-                          size_t size) {
+                          size_t size,
+                          void* context) {
   if (ptr)
     MallocDumpProvider::GetInstance()->RemoveAllocation(ptr);
   const AllocatorDispatch* const next = self->next;
-  next->free_definite_size_function(next, ptr, size);
+  next->free_definite_size_function(next, ptr, size, context);
 }
 
 AllocatorDispatch g_allocator_hooks = {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java
index 73366c0..6092f26 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java
@@ -72,7 +72,7 @@
         if (TextUtils.isEmpty(filePath)) return null;
 
         Bitmap cachedBitmap = getBitmapCache().get(filePath);
-        if (cachedBitmap != null) return cachedBitmap;
+        if (cachedBitmap != null && !cachedBitmap.isRecycled()) return cachedBitmap;
 
         mRequestQueue.offer(request);
         processQueue();
@@ -101,7 +101,7 @@
         String currentFilePath = mCurrentRequest.getFilePath();
 
         Bitmap cachedBitmap = getBitmapCache().get(currentFilePath);
-        if (cachedBitmap == null) {
+        if (cachedBitmap == null || cachedBitmap.isRecycled()) {
             // Asynchronously process the file to make a thumbnail.
             nativeRetrieveThumbnail(mNativeThumbnailProvider, currentFilePath, mIconSizePx);
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
index 69c65280..11e61a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
@@ -486,6 +486,7 @@
         public void onThumbnailRetrieved(String filePath, Bitmap thumbnail) {
             if (TextUtils.equals(getFilePath(), filePath) && thumbnail != null
                     && thumbnail.getWidth() > 0 && thumbnail.getHeight() > 0) {
+                assert !thumbnail.isRecycled();
                 onResult(thumbnail);
             }
         }
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index a9c4f95a..8c28b08f 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -18,12 +18,15 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/page_load_metrics/page_load_metrics_messages.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/download_test_observer.h"
 #include "net/http/failing_http_transaction_factory.h"
@@ -33,6 +36,123 @@
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_getter.h"
 
+namespace {
+
+// Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received
+// matching a PageLoadTiming. See WaitForMatchingIPC for details.
+class TimingUpdatedObserver : public content::BrowserMessageFilter {
+ public:
+  // A bitvector to express which timing fields to match on.
+  enum ExpectedTimingFields {
+    FIRST_PAINT = 1 << 0,
+    FIRST_CONTENTFUL_PAINT = 1 << 1
+  };
+
+  explicit TimingUpdatedObserver(content::RenderWidgetHost* render_widget_host)
+      : content::BrowserMessageFilter(PageLoadMetricsMsgStart) {
+    render_widget_host->GetProcess()->AddFilter(this);
+
+    // Roundtrip to the IO thread, to ensure that the filter is properly
+    // installed.
+    content::BrowserThread::PostTaskAndReply(
+        content::BrowserThread::IO, FROM_HERE, base::Bind(&base::DoNothing),
+        base::Bind(&TimingUpdatedObserver::Quit, this));
+    run_loop_.reset(new base::RunLoop());
+    run_loop_->Run();
+    run_loop_.reset(nullptr);
+  }
+
+  // Add the given timing fields to the set of fields to match on.
+  void AddMatchingFields(ExpectedTimingFields fields) {
+    matching_fields_ |= fields;
+  }
+
+  // Instructs observer to also watch for |count|
+  // WebLoadingBehaviorDocumentWriteBlockReload events.
+  void MatchDocumentWriteBlockReload(int count) {
+    match_document_write_block_reload_ = count;
+  }
+
+  // Waits for a TimingUpdated IPC that matches the fields set by
+  // |AddMatchingFields|.  All matching fields must be set in a TimingUpdated
+  // IPC for it to end this wait.
+  void WaitForMatchingIPC() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    if (matched_timing_update_)
+      return;
+
+    run_loop_.reset(new base::RunLoop());
+    run_loop_->Run();
+    run_loop_.reset(nullptr);
+  }
+
+ private:
+  bool OnMessageReceived(const IPC::Message& message) override {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+    IPC_BEGIN_MESSAGE_MAP(TimingUpdatedObserver, message)
+      IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated)
+    IPC_END_MESSAGE_MAP()
+
+    return false;
+  }
+
+  bool OnTimingUpdated(const page_load_metrics::PageLoadTiming& timing,
+                       const page_load_metrics::PageLoadMetadata& metadata) {
+    if (match_document_write_block_reload_ > 0 &&
+        metadata.behavior_flags &
+            blink::WebLoadingBehaviorFlag::
+                WebLoadingBehaviorDocumentWriteBlockReload) {
+      --match_document_write_block_reload_;
+    }
+
+    if (match_document_write_block_reload_ > 0) {
+      return true;
+    }
+
+    if ((!(matching_fields_ & FIRST_PAINT) || timing.first_paint) &&
+        (!(matching_fields_ & FIRST_CONTENTFUL_PAINT) ||
+         timing.first_contentful_paint)) {
+      // Ensure that any other handlers of this message, for example the real
+      // PageLoadMetric observers, get a chance to handle this message before
+      // this waiter unblocks.
+      content::BrowserThread::PostTask(
+          content::BrowserThread::IO, FROM_HERE,
+          base::Bind(&TimingUpdatedObserver::BounceTimingUpdate, this, timing,
+                     metadata));
+    }
+    return true;
+  }
+
+  void BounceTimingUpdate(const page_load_metrics::PageLoadTiming& timing,
+                          const page_load_metrics::PageLoadMetadata& metadata) {
+    content::BrowserThread::PostTask(
+        content::BrowserThread::UI, FROM_HERE,
+        base::Bind(&TimingUpdatedObserver::SetTimingUpdatedAndQuit, this));
+  }
+
+  void Quit() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    if (run_loop_)
+      run_loop_->Quit();
+  }
+
+  void SetTimingUpdatedAndQuit() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    matched_timing_update_ = true;
+    Quit();
+  }
+
+  ~TimingUpdatedObserver() override {}
+
+  std::unique_ptr<base::RunLoop> run_loop_;
+  int matching_fields_;  // A bitvector composed from ExpectedTimingFields.
+  bool matched_timing_update_ = false;
+  int match_document_write_block_reload_ = 0;
+};
+
+}  // namespace
+
 class PageLoadMetricsBrowserTest : public InProcessBrowserTest {
  public:
   PageLoadMetricsBrowserTest() {}
@@ -47,6 +167,14 @@
     return histogram_tester_.GetTotalCountsForPrefix("PageLoad.").empty();
   }
 
+  scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() {
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver(
+        web_contents->GetRenderViewHost()->GetWidget()));
+    return observer;
+  }
+
   base::HistogramTester histogram_tester_;
 
  private:
@@ -198,10 +326,15 @@
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+
   ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL(
                      "/page_load_metrics/document_write_external_script.html"));
-  NavigateToUntrackedUrl();
+  fcp_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(
       internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1);
@@ -222,9 +355,15 @@
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL("/title1.html"));
-  NavigateToUntrackedUrl();
+  fcp_observer->WaitForMatchingIPC();
+
   histogram_tester_.ExpectTotalCount(
       internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0);
   histogram_tester_.ExpectTotalCount(
@@ -235,10 +374,15 @@
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+
   ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL(
                      "/page_load_metrics/document_write_script_block.html"));
-  NavigateToUntrackedUrl();
+  fcp_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(
       internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
@@ -248,6 +392,14 @@
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+  scoped_refptr<TimingUpdatedObserver> reload_observer =
+      CreateTimingUpdatedObserver();
+  reload_observer->MatchDocumentWriteBlockReload(2);
+
   ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL(
                      "/page_load_metrics/document_write_script_block.html"));
@@ -264,7 +416,8 @@
   histogram_tester_.ExpectTotalCount(
       internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
 
-  NavigateToUntrackedUrl();
+  fcp_observer->WaitForMatchingIPC();
+  reload_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(
       internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
@@ -316,6 +469,10 @@
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, BadXhtml) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> timing_observer =
+      CreateTimingUpdatedObserver();
+  timing_observer->AddMatchingFields(TimingUpdatedObserver::FIRST_PAINT);
+
   // When an XHTML page contains invalid XML, it causes a paint of the error
   // message without a layout. Page load metrics currently treats this as an
   // error. Eventually, we'll fix this by special casing the handling of
@@ -324,7 +481,8 @@
   ui_test_utils::NavigateToURL(
       browser(),
       embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml"));
-  NavigateToUntrackedUrl();
+
+  timing_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0);
   histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0);
@@ -515,20 +673,19 @@
       internal::kHistogramParseStartToFirstMeaningfulPaint, 0);
 }
 
-// Flaky on Linux (timing out or failing in an expectation) crbug.com/657022
-#if defined(OS_LINUX)
-#define MAYBE_NoStatePrefetchObserverCacheable \
-  DISABLED_NoStatePrefetchObserverCacheable
-#else
-#define MAYBE_NoStatePrefetchObserverCacheable NoStatePrefetchObserverCacheable
-#endif
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MAYBE_NoStatePrefetchObserverCacheable) {
+                       NoStatePrefetchObserverCacheable) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL("/title1.html"));
-  NavigateToUntrackedUrl();
+
+  fcp_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(
       "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0);
@@ -536,20 +693,19 @@
       "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1);
 }
 
-// Flaky on Linux (timing out or failing in an expectation) crbug.com/657022
-#if defined(OS_LINUX)
-#define MAYBE_NoStatePrefetchObserverNoStore \
-  DISABLED_NoStatePrefetchObserverNoStore
-#else
-#define MAYBE_NoStatePrefetchObserverNoStore NoStatePrefetchObserverNoStore
-#endif
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MAYBE_NoStatePrefetchObserverNoStore) {
+                       NoStatePrefetchObserverNoStore) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
+  scoped_refptr<TimingUpdatedObserver> fcp_observer =
+      CreateTimingUpdatedObserver();
+  fcp_observer->AddMatchingFields(
+      TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
+
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL("/nostore.html"));
-  NavigateToUntrackedUrl();
+
+  fcp_observer->WaitForMatchingIPC();
 
   histogram_tester_.ExpectTotalCount(
       "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1);
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 7aeea46c4..c21d544 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -199,10 +199,8 @@
 
   // Inform the most visited iframe of the new theme.
   var themeinfo = {cmd: 'updateTheme'};
-  if (!info.usingDefaultTheme) {
-    themeinfo.tileBorderColor = convertToRGBAColor(info.sectionBorderColorRgba);
-    themeinfo.tileHoverBorderColor = convertToRGBAColor(info.headerColorRgba);
-  }
+  themeinfo.tileBorderColor = convertToRGBAColor(info.sectionBorderColorRgba);
+  themeinfo.tileHoverBorderColor = convertToRGBAColor(info.headerColorRgba);
   themeinfo.isThemeDark = isThemeDark;
 
   var titleColor = NTP_DESIGN.titleColor;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
index ca9f3bd..623ca2d 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -1202,7 +1202,7 @@
 }
 
 // Check the launcher activation state for applications and browser.
-IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, ActivationStateCheck) {
+IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, DISABLED_ActivationStateCheck) {
   TabStripModel* tab_strip = browser()->tab_strip_model();
   // Get the browser item index
   int browser_index = GetIndexOfShelfItemType(ash::TYPE_BROWSER_SHORTCUT);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index 3010e8e..92dffc0d 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -250,7 +250,6 @@
  private:
   std::unique_ptr<gfx::SlideAnimation> show_animation_;
 
-
   DISALLOW_COPY_AND_ASSIGN(BookmarkButtonBase);
 };
 
@@ -289,7 +288,7 @@
 
   void SetText(const base::string16& text) override {
     BookmarkButtonBase::SetText(text);
-    tooltip_text_.empty();
+    tooltip_text_.clear();
   }
 
   const char* GetClassName() const override { return kViewClassName; }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
index 782b7d2b..56100c4 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
@@ -30,6 +30,8 @@
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/button/menu_button.h"
+#include "ui/views/test/native_widget_factory.h"
+#include "ui/views/widget/widget.h"
 
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
@@ -101,6 +103,7 @@
   // need to create the BookmarkBarView after the model has populated.
   void CreateBookmarkBarView() {
     bookmark_bar_view_.reset(new BookmarkBarView(browser(), nullptr));
+    bookmark_bar_view_->set_owned_by_client();
     test_helper_.reset(new BookmarkBarViewTestHelper(bookmark_bar_view_.get()));
   }
 
@@ -356,3 +359,34 @@
   EXPECT_TRUE(test_helper_->apps_page_shortcut()->visible());
 }
 #endif
+
+TEST_F(BookmarkBarViewTest, UpdateTooltipText) {
+  CreateBookmarkModelAndBookmarkBarView();
+  // Create a widget who creates and owns a views::ToolipManager.
+  views::Widget widget;
+  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.native_widget = views::test::CreatePlatformDesktopNativeWidgetImpl(
+      params, &widget, nullptr);
+  widget.Init(params);
+  widget.Show();
+  widget.GetRootView()->AddChildView(bookmark_bar_view_.get());
+
+  BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
+  bookmarks::test::AddNodesFromModelString(model, model->bookmark_bar_node(),
+                                           "a b");
+  SizeUntilButtonsVisible(1);
+  ASSERT_EQ(1, test_helper_->GetBookmarkButtonCount());
+
+  views::LabelButton* button = test_helper_->GetBookmarkButton(0);
+  ASSERT_TRUE(button);
+  gfx::Point p;
+  base::string16 text;
+  button->GetTooltipText(p, &text);
+  EXPECT_EQ(base::ASCIIToUTF16("a\na.com"), text);
+  button->SetText(base::ASCIIToUTF16("new title"));
+  button->GetTooltipText(p, &text);
+  EXPECT_EQ(base::ASCIIToUTF16("new title\na.com"), text);
+
+  widget.CloseNow();
+}
diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc
index 502cc10..889ec1b 100644
--- a/chrome/browser/ui/views/chrome_views_delegate.cc
+++ b/chrome/browser/ui/views/chrome_views_delegate.cc
@@ -12,6 +12,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -43,7 +44,6 @@
 #include <dwmapi.h>
 #include <shellapi.h>
 #include "base/profiler/scoped_tracker.h"
-#include "base/task_runner_util.h"
 #include "base/win/windows_version.h"
 #include "chrome/browser/win/app_icon.h"
 #include "ui/base/win/shell.h"
@@ -517,15 +517,14 @@
   // spins a modal loop which could cause callers to be reentered. To avoid
   // that we retrieve the taskbar state in a worker thread.
   if (monitor && !in_autohide_edges_callback_) {
-    base::PostTaskAndReplyWithResult(
-        content::BrowserThread::GetBlockingPool(),
-        FROM_HERE,
-        base::Bind(&GetAppbarAutohideEdgesOnWorkerThread,
-                   monitor),
+    // TODO(robliao): Annotate this task with .WithCOM() once supported.
+    // https://crbug.com/662122
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE, base::TaskTraits().MayBlock().WithPriority(
+                       base::TaskPriority::USER_BLOCKING),
+        base::Bind(&GetAppbarAutohideEdgesOnWorkerThread, monitor),
         base::Bind(&ChromeViewsDelegate::OnGotAppbarAutohideEdges,
-                   weak_factory_.GetWeakPtr(),
-                   callback,
-                   monitor,
+                   weak_factory_.GetWeakPtr(), callback, monitor,
                    appbar_autohide_edge_map_[monitor]));
   }
   return appbar_autohide_edge_map_[monitor];
diff --git a/components/image_fetcher/ios/BUILD.gn b/components/image_fetcher/ios/BUILD.gn
index c5c1705..88d514b 100644
--- a/components/image_fetcher/ios/BUILD.gn
+++ b/components/image_fetcher/ios/BUILD.gn
@@ -6,12 +6,14 @@
   sources = [
     "ios_image_data_fetcher_wrapper.h",
     "ios_image_data_fetcher_wrapper.mm",
+    "webp_decoder.h",
+    "webp_decoder.mm",
   ]
   deps = [
     "//base",
     "//components/image_fetcher",
-    "//ios/web/public/image_fetcher",
     "//net",
+    "//third_party/libwebp:libwebp_dec",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
@@ -20,11 +22,12 @@
   testonly = true
   sources = [
     "ios_image_data_fetcher_wrapper_unittest.mm",
+    "webp_decoder_unittest.mm",
   ]
   deps = [
     ":ios",
+    ":webp_transcode_unit_tests_bundle_data",
     "//base",
-    "//ios/web/public/image_fetcher",
     "//net",
     "//net:test_support",
     "//testing/gmock",
@@ -32,3 +35,20 @@
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
+
+bundle_data("webp_transcode_unit_tests_bundle_data") {
+  visibility = [ ":unit_tests" ]
+  testonly = true
+  sources = [
+    "//components/test/data/webp_transcode/test.jpg",
+    "//components/test/data/webp_transcode/test.webp",
+    "//components/test/data/webp_transcode/test_alpha.png",
+    "//components/test/data/webp_transcode/test_alpha.webp",
+    "//components/test/data/webp_transcode/test_small.tiff",
+    "//components/test/data/webp_transcode/test_small.webp",
+  ]
+  outputs = [
+    "{{bundle_resources_dir}}/{{source_root_relative_dir}}/" +
+        "{{source_file_part}}",
+  ]
+}
diff --git a/components/image_fetcher/ios/DEPS b/components/image_fetcher/ios/DEPS
index 0fc0ddd..d2f380fd 100644
--- a/components/image_fetcher/ios/DEPS
+++ b/components/image_fetcher/ios/DEPS
@@ -1,3 +1,6 @@
 include_rules = [
   "+ios/web/public",
+
+  # Only WebP decoding is allowed (no encoding).
+  "+third_party/libwebp/webp/decode.h",
 ]
diff --git a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
index 233731e..2d20ff0 100644
--- a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
+++ b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
@@ -8,7 +8,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
-#import "ios/web/public/image_fetcher/webp_decoder.h"
+#import "components/image_fetcher/ios/webp_decoder.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_status_code.h"
 #include "net/url_request/url_fetcher.h"
diff --git a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
index 61d21098..b54eaf9 100644
--- a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
+++ b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
@@ -15,7 +15,7 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#import "ios/web/public/image_fetcher/webp_decoder.h"
+#import "components/image_fetcher/ios/webp_decoder.h"
 #include "net/http/http_response_headers.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_fetcher_delegate.h"
diff --git a/ios/web/public/image_fetcher/webp_decoder.h b/components/image_fetcher/ios/webp_decoder.h
similarity index 94%
rename from ios/web/public/image_fetcher/webp_decoder.h
rename to components/image_fetcher/ios/webp_decoder.h
index f11c70a..214c7a3 100644
--- a/ios/web/public/image_fetcher/webp_decoder.h
+++ b/components/image_fetcher/ios/webp_decoder.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_IMAGE_FETCHER_WEBP_DECODER_H_
-#define IOS_WEB_PUBLIC_IMAGE_FETCHER_WEBP_DECODER_H_
+#ifndef COMPONENTS_IMAGE_FETCHER_IOS_WEBP_DECODER_H_
+#define COMPONENTS_IMAGE_FETCHER_IOS_WEBP_DECODER_H_
 
 #import <Foundation/Foundation.h>
 #include <stddef.h>
@@ -96,4 +96,4 @@
 
 }  // namespace webp_transcode
 
-#endif  // IOS_WEB_PUBLIC_IMAGE_FETCHER_WEBP_DECODER_H_
+#endif  // COMPONENTS_IMAGE_FETCHER_IOS_WEBP_DECODER_H_
diff --git a/ios/web/public/image_fetcher/webp_decoder.mm b/components/image_fetcher/ios/webp_decoder.mm
similarity index 98%
rename from ios/web/public/image_fetcher/webp_decoder.mm
rename to components/image_fetcher/ios/webp_decoder.mm
index d5e7d92..f411be8 100644
--- a/ios/web/public/image_fetcher/webp_decoder.mm
+++ b/components/image_fetcher/ios/webp_decoder.mm
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/image_fetcher/webp_decoder.h"
+#import "components/image_fetcher/ios/webp_decoder.h"
 
 #import <Foundation/Foundation.h>
-#include <stdint.h>
 #import <UIKit/UIKit.h>
 
+#include <stdint.h>
+
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 
diff --git a/ios/web/public/image_fetcher/webp_decoder_unittest.mm b/components/image_fetcher/ios/webp_decoder_unittest.mm
similarity index 97%
rename from ios/web/public/image_fetcher/webp_decoder_unittest.mm
rename to components/image_fetcher/ios/webp_decoder_unittest.mm
index 64d767c..0ae7b57 100644
--- a/ios/web/public/image_fetcher/webp_decoder_unittest.mm
+++ b/components/image_fetcher/ios/webp_decoder_unittest.mm
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/image_fetcher/webp_decoder.h"
+#import "components/image_fetcher/ios/webp_decoder.h"
 
 #import <CoreGraphics/CoreGraphics.h>
 #import <Foundation/Foundation.h>
+
 #include <stddef.h>
 #include <stdint.h>
 
@@ -59,8 +60,8 @@
   NSData* LoadImage(const base::FilePath& filename) {
     base::FilePath path;
     PathService::Get(base::DIR_SOURCE_ROOT, &path);
-    path =
-        path.AppendASCII("ios/web/test/data/webp_transcode").Append(filename);
+    path = path.AppendASCII("components/test/data/webp_transcode")
+               .Append(filename);
     return
         [NSData dataWithContentsOfFile:base::SysUTF8ToNSString(path.value())];
   }
diff --git a/ios/web/test/data/webp_transcode/OWNERS b/components/test/data/webp_transcode/OWNERS
similarity index 100%
rename from ios/web/test/data/webp_transcode/OWNERS
rename to components/test/data/webp_transcode/OWNERS
diff --git a/ios/web/test/data/webp_transcode/test.jpg b/components/test/data/webp_transcode/test.jpg
similarity index 100%
rename from ios/web/test/data/webp_transcode/test.jpg
rename to components/test/data/webp_transcode/test.jpg
Binary files differ
diff --git a/ios/web/test/data/webp_transcode/test.webp b/components/test/data/webp_transcode/test.webp
similarity index 100%
rename from ios/web/test/data/webp_transcode/test.webp
rename to components/test/data/webp_transcode/test.webp
Binary files differ
diff --git a/ios/web/test/data/webp_transcode/test_alpha.png b/components/test/data/webp_transcode/test_alpha.png
similarity index 100%
rename from ios/web/test/data/webp_transcode/test_alpha.png
rename to components/test/data/webp_transcode/test_alpha.png
Binary files differ
diff --git a/ios/web/test/data/webp_transcode/test_alpha.webp b/components/test/data/webp_transcode/test_alpha.webp
similarity index 100%
rename from ios/web/test/data/webp_transcode/test_alpha.webp
rename to components/test/data/webp_transcode/test_alpha.webp
Binary files differ
diff --git a/ios/web/test/data/webp_transcode/test_small.tiff b/components/test/data/webp_transcode/test_small.tiff
similarity index 100%
rename from ios/web/test/data/webp_transcode/test_small.tiff
rename to components/test/data/webp_transcode/test_small.tiff
Binary files differ
diff --git a/ios/web/test/data/webp_transcode/test_small.webp b/components/test/data/webp_transcode/test_small.webp
similarity index 100%
rename from ios/web/test/data/webp_transcode/test_small.webp
rename to components/test/data/webp_transcode/test_small.webp
Binary files differ
diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc
index 6a870eaa..7ed0fab 100644
--- a/content/child/web_url_loader_impl.cc
+++ b/content/child/web_url_loader_impl.cc
@@ -1154,10 +1154,6 @@
   response->setHTTPStatusCode(headers->response_code());
   response->setHTTPStatusText(WebString::fromLatin1(headers->GetStatusText()));
 
-  Time time_val;
-  if (headers->GetLastModifiedValue(&time_val))
-    response->setLastModifiedDate(time_val.ToDoubleT());
-
   // Build up the header map.
   size_t iter = 0;
   std::string name;
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index 43b6dbbf..551064c 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -29,6 +29,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
@@ -209,18 +210,16 @@
     request_timer_.reset(new base::ElapsedTimer());
     base::FilePath* read_file_path = new base::FilePath;
     base::Time* last_modified_time = new base::Time();
-    bool posted = BrowserThread::PostBlockingPoolTaskAndReply(
-        FROM_HERE,
-        base::Bind(&ReadResourceFilePathAndLastModifiedTime,
-                   resource_,
-                   directory_path_,
-                   base::Unretained(read_file_path),
+
+    // Inherit task priority from the calling context.
+    base::PostTaskWithTraitsAndReply(
+        FROM_HERE, base::TaskTraits().MayBlock(),
+        base::Bind(&ReadResourceFilePathAndLastModifiedTime, resource_,
+                   directory_path_, base::Unretained(read_file_path),
                    base::Unretained(last_modified_time)),
         base::Bind(&URLRequestExtensionJob::OnFilePathAndLastModifiedTimeRead,
-                   weak_factory_.GetWeakPtr(),
-                   base::Owned(read_file_path),
+                   weak_factory_.GetWeakPtr(), base::Owned(read_file_path),
                    base::Owned(last_modified_time)));
-    DCHECK(posted);
   }
 
   bool IsRedirectResponse(GURL* location, int* http_status_code) override {
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h
index e622227..b108fad8 100644
--- a/headless/lib/browser/headless_browser_impl.h
+++ b/headless/lib/browser/headless_browser_impl.h
@@ -21,6 +21,9 @@
 #include "headless/lib/browser/headless_window_tree_host.h"
 #endif
 
+// Note: unused but needed to make sure this header gets generated.
+#include "headless/public/version.h"
+
 namespace headless {
 
 class HeadlessBrowserContextImpl;
diff --git a/ios/chrome/app/startup/BUILD.gn b/ios/chrome/app/startup/BUILD.gn
index 71c1a19..27c868d 100644
--- a/ios/chrome/app/startup/BUILD.gn
+++ b/ios/chrome/app/startup/BUILD.gn
@@ -5,6 +5,7 @@
 import("//ios/public/provider/chrome/browser/build_config.gni")
 
 source_set("startup") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
     "background_upload_alert.h",
     "background_upload_alert.mm",
diff --git a/ios/chrome/app/startup/background_upload_alert.mm b/ios/chrome/app/startup/background_upload_alert.mm
index 6b4b399..3a3f7e7 100644
--- a/ios/chrome/app/startup/background_upload_alert.mm
+++ b/ios/chrome/app/startup/background_upload_alert.mm
@@ -6,6 +6,10 @@
 
 #include "ios/chrome/browser/experimental_flags.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation BackgroundUploadAlert
 
 + (void)setupBackgroundUploadAlert {
diff --git a/ios/chrome/app/startup/chrome_main_starter.mm b/ios/chrome/app/startup/chrome_main_starter.mm
index 6a074aa..ebdd8f5 100644
--- a/ios/chrome/app/startup/chrome_main_starter.mm
+++ b/ios/chrome/app/startup/chrome_main_starter.mm
@@ -7,6 +7,10 @@
 #include "base/memory/ptr_util.h"
 #include "ios/chrome/app/startup/ios_chrome_main.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation ChromeMainStarter
 
 + (std::unique_ptr<IOSChromeMain>)startChromeMain {
diff --git a/ios/chrome/app/startup/client_registration.mm b/ios/chrome/app/startup/client_registration.mm
index 9cdcb7f4..287498f 100644
--- a/ios/chrome/app/startup/client_registration.mm
+++ b/ios/chrome/app/startup/client_registration.mm
@@ -4,10 +4,13 @@
 
 #include "ios/chrome/app/startup/client_registration.h"
 
-#import "base/mac/scoped_nsobject.h"
 #import "ios/chrome/browser/web/chrome_web_client.h"
 #import "ios/web/public/web_client.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation ClientRegistration
 
 + (void)registerClients {
diff --git a/ios/chrome/app/startup/ios_chrome_main.mm b/ios/chrome/app/startup/ios_chrome_main.mm
index bbd9cbba..d3ff28a 100644
--- a/ios/chrome/app/startup/ios_chrome_main.mm
+++ b/ios/chrome/app/startup/ios_chrome_main.mm
@@ -13,6 +13,10 @@
 #include "base/time/time.h"
 #include "ios/web/public/app/web_main_runner.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 base::Time* g_start_time;
 }  // namespace
diff --git a/ios/chrome/app/startup/ios_chrome_main_delegate.mm b/ios/chrome/app/startup/ios_chrome_main_delegate.mm
index 2ee0e0b..2d2f023 100644
--- a/ios/chrome/app/startup/ios_chrome_main_delegate.mm
+++ b/ios/chrome/app/startup/ios_chrome_main_delegate.mm
@@ -8,6 +8,10 @@
 #include "ios/chrome/browser/chrome_paths.h"
 #include "third_party/skia/include/core/SkGraphics.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 IOSChromeMainDelegate::IOSChromeMainDelegate() {}
 
 IOSChromeMainDelegate::~IOSChromeMainDelegate() {}
diff --git a/ios/chrome/app/startup/network_stack_setup.mm b/ios/chrome/app/startup/network_stack_setup.mm
index 533edee..b3e426b 100644
--- a/ios/chrome/app/startup/network_stack_setup.mm
+++ b/ios/chrome/app/startup/network_stack_setup.mm
@@ -11,6 +11,10 @@
 #include "ios/web/net/request_tracker_factory_impl.h"
 #include "ios/web/net/web_http_protocol_handler_delegate.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation NetworkStackSetup
 
 + (void)setUpChromeNetworkStack:
diff --git a/ios/chrome/app/startup/provider_registration.mm b/ios/chrome/app/startup/provider_registration.mm
index 8a60ef15..cfa84a4 100644
--- a/ios/chrome/app/startup/provider_registration.mm
+++ b/ios/chrome/app/startup/provider_registration.mm
@@ -6,6 +6,10 @@
 
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation ProviderRegistration
 
 + (void)registerProviders {
diff --git a/ios/chrome/app/startup/register_experimental_settings.mm b/ios/chrome/app/startup/register_experimental_settings.mm
index be14221..5b0876c 100644
--- a/ios/chrome/app/startup/register_experimental_settings.mm
+++ b/ios/chrome/app/startup/register_experimental_settings.mm
@@ -6,9 +6,12 @@
 
 #include "base/logging.h"
 #include "base/mac/bundle_locations.h"
-#import "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 // Key in the UserDefaults for the Experimental Keys.
 NSString* kExperimentalKeysKey = @"ExperimentalKeys";
@@ -54,8 +57,7 @@
   NSArray* settingsContent =
       [[NSFileManager defaultManager] contentsOfDirectoryAtPath:settingsFilepath
                                                           error:NULL];
-  base::scoped_nsobject<NSMutableArray> currentExpKeys(
-      [[NSMutableArray alloc] init]);
+  NSMutableArray* currentExpKeys = [[NSMutableArray alloc] init];
 
   for (NSString* filename in settingsContent) {
     // Only plist files are preferences definition.
diff --git a/ios/chrome/app/startup/setup_debugging.mm b/ios/chrome/app/startup/setup_debugging.mm
index b54a123d..d918ccb8 100644
--- a/ios/chrome/app/startup/setup_debugging.mm
+++ b/ios/chrome/app/startup/setup_debugging.mm
@@ -7,6 +7,10 @@
 #include "base/logging.h"
 #include "components/crash/core/common/objc_zombie.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @implementation SetupDebugging
 
 + (void)setUpDebuggingOptions {
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 2b111e9..88bdcef 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -543,6 +543,9 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_DOWNLOADIMAGE" desc="The name of the Download Image command in the content area context menu">
         Download Image
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_DELETE" desc="The name of the Delete command in the Content Suggestions articles context menu">
+        Delete
+      </message>
       <message name="IDS_IOS_CONTENT_SETTINGS_TITLE" desc="Title for content settings dialog [Length: 29em] [iOS only]">
         Content Settings
       </message>
diff --git a/ios/chrome/browser/content_suggestions/BUILD.gn b/ios/chrome/browser/content_suggestions/BUILD.gn
index 6036ee6..d492361d 100644
--- a/ios/chrome/browser/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/BUILD.gn
@@ -20,8 +20,12 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/ntp_snippets",
+    "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/content_suggestions",
+    "//ios/web",
     "//ui/base",
+    "//ui/strings",
   ]
 }
 
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h
index 7a1bcf0..121b789e 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h
@@ -11,12 +11,16 @@
 class ChromeBrowserState;
 }
 
+@protocol UrlLoader;
+
 // Coordinator to manage the Suggestions UI via a
 // ContentSuggestionsViewController.
 @interface ContentSuggestionsCoordinator : ChromeCoordinator
 
 // BrowserState used to create the ContentSuggestionFactory.
 @property(nonatomic, assign) ios::ChromeBrowserState* browserState;
+// URLLoader used to open pages.
+@property(nonatomic, weak) id<UrlLoader> URLLoader;
 // Whether the Suggestions UI is displayed. If this is true, start is a no-op.
 @property(nonatomic, readonly) BOOL visible;
 
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
index 21272d81..e7ac5c6 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
@@ -5,27 +5,43 @@
 #import "ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h"
 
 #include "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
 #import "ios/chrome/browser/content_suggestions/content_suggestions_mediator.h"
 #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
+#import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h"
+#import "ios/chrome/browser/ui/url_loader.h"
 #include "ios/chrome/grit/ios_strings.h"
+#include "ios/web/public/referrer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/strings/grit/ui_strings.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
 @interface ContentSuggestionsCoordinator ()<ContentSuggestionsCommands> {
-  UINavigationController* _navigationController;
   ContentSuggestionsMediator* _contentSuggestionsMediator;
 }
 
+@property(nonatomic, strong) AlertCoordinator* alertCoordinator;
+@property(nonatomic, strong) UINavigationController* navigationController;
+@property(nonatomic, strong)
+    ContentSuggestionsViewController* suggestionsViewController;
+
+- (void)openNewTabWithURL:(const GURL&)URL incognito:(BOOL)incognito;
+
 @end
 
 @implementation ContentSuggestionsCoordinator
 
+@synthesize alertCoordinator = _alertCoordinator;
 @synthesize browserState = _browserState;
+@synthesize navigationController = _navigationController;
+@synthesize suggestionsViewController = _suggestionsViewController;
+@synthesize URLLoader = _URLLoader;
 @synthesize visible = _visible;
 
 - (void)start {
@@ -41,16 +57,15 @@
       initWithContentService:IOSChromeContentSuggestionsServiceFactory::
                                  GetForBrowserState(self.browserState)];
 
-  ContentSuggestionsViewController* suggestionsViewController =
-      [[ContentSuggestionsViewController alloc]
-          initWithStyle:CollectionViewControllerStyleDefault
-             dataSource:_contentSuggestionsMediator];
+  self.suggestionsViewController = [[ContentSuggestionsViewController alloc]
+      initWithStyle:CollectionViewControllerStyleDefault
+         dataSource:_contentSuggestionsMediator];
 
-  suggestionsViewController.suggestionCommandHandler = self;
+  self.suggestionsViewController.suggestionCommandHandler = self;
   _navigationController = [[UINavigationController alloc]
-      initWithRootViewController:suggestionsViewController];
+      initWithRootViewController:self.suggestionsViewController];
 
-  suggestionsViewController.navigationItem.leftBarButtonItem =
+  self.suggestionsViewController.navigationItem.leftBarButtonItem =
       [[UIBarButtonItem alloc]
           initWithTitle:l10n_util::GetNSString(IDS_IOS_SUGGESTIONS_DONE)
                   style:UIBarButtonItemStylePlain
@@ -63,10 +78,10 @@
 }
 
 - (void)stop {
-  [[_navigationController presentingViewController]
+  [[self.navigationController presentingViewController]
       dismissViewControllerAnimated:YES
                          completion:nil];
-  _navigationController = nil;
+  self.navigationController = nil;
   _visible = NO;
 }
 
@@ -84,7 +99,86 @@
 - (void)openFaviconAtIndex:(NSInteger)index {
 }
 
-- (void)openURL:(const GURL&)url {
+- (void)openURL:(const GURL&)URL {
+  // TODO(crbug.com/691979): Add metrics.
+
+  [self.URLLoader loadURL:URL
+                 referrer:web::Referrer()
+               transition:ui::PAGE_TRANSITION_AUTO_BOOKMARK
+        rendererInitiated:NO];
+
+  [self stop];
+}
+
+- (void)displayContextMenuForArticle:(ContentSuggestionsArticleItem*)articleItem
+                             atPoint:(CGPoint)touchLocation {
+  NSString* urlString = base::SysUTF8ToNSString(articleItem.articleURL.spec());
+  self.alertCoordinator = [[ActionSheetCoordinator alloc]
+      initWithBaseViewController:self.navigationController
+                           title:articleItem.title
+                         message:urlString
+                            rect:CGRectMake(touchLocation.x, touchLocation.y, 0,
+                                            0)
+                            view:self.suggestionsViewController.collectionView];
+
+  __weak ContentSuggestionsCoordinator* weakSelf = self;
+  GURL articleURL = articleItem.articleURL;
+
+  NSString* openInNewTabTitle =
+      l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB);
+  [self.alertCoordinator
+      addItemWithTitle:openInNewTabTitle
+                action:^{
+                  // TODO(crbug.com/691979): Add metrics.
+                  [weakSelf openNewTabWithURL:articleURL incognito:NO];
+                }
+                 style:UIAlertActionStyleDefault];
+
+  NSString* openInNewTabIncognitoTitle =
+      l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB);
+  [self.alertCoordinator
+      addItemWithTitle:openInNewTabIncognitoTitle
+                action:^{
+                  // TODO(crbug.com/691979): Add metrics.
+                  [weakSelf openNewTabWithURL:articleURL incognito:YES];
+                }
+                 style:UIAlertActionStyleDefault];
+
+  NSString* deleteTitle =
+      l10n_util::GetNSString(IDS_IOS_CONTENT_SUGGESTIONS_DELETE);
+  [self.alertCoordinator addItemWithTitle:deleteTitle
+                                   action:^{
+                                     // TODO(crbug.com/691979): Add metrics.
+                                     [weakSelf removeEntry];
+                                   }
+                                    style:UIAlertActionStyleDefault];
+
+  [self.alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_APP_CANCEL)
+                                   action:^{
+                                     // TODO(crbug.com/691979): Add metrics.
+                                   }
+                                    style:UIAlertActionStyleCancel];
+
+  [self.alertCoordinator start];
+}
+
+#pragma mark - Private
+
+- (void)openNewTabWithURL:(const GURL&)URL incognito:(BOOL)incognito {
+  // TODO(crbug.com/691979): Add metrics.
+
+  [self.URLLoader webPageOrderedOpen:URL
+                            referrer:web::Referrer()
+                          windowName:nil
+                         inIncognito:incognito
+                        inBackground:NO
+                            appendTo:kLastTab];
+
+  [self stop];
+}
+
+- (void)removeEntry {
+  // TODO(crbug.com/691979): Add metrics.
 }
 
 @end
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.cc b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.cc
index 2c6a3d1a..1b1765a 100644
--- a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.cc
+++ b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.cc
@@ -16,6 +16,7 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/image_fetcher/image_decoder.h"
 #include "components/image_fetcher/image_fetcher.h"
+#include "components/image_fetcher/image_fetcher_impl.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h"
@@ -40,7 +41,6 @@
 #include "ios/chrome/browser/history/history_service_factory.h"
 #include "ios/chrome/browser/signin/oauth2_token_service_factory.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
-#include "ios/chrome/browser/suggestions/image_fetcher_impl.h"
 #include "ios/chrome/browser/suggestions/ios_image_decoder_impl.h"
 #include "ios/chrome/common/channel_info.h"
 #include "ios/web/public/browser_state.h"
@@ -49,6 +49,7 @@
 
 using bookmarks::BookmarkModel;
 using history::HistoryService;
+using image_fetcher::ImageFetcherImpl;
 using ios::BookmarkModelFactory;
 using ntp_snippets::BookmarkSuggestionsProvider;
 using ntp_snippets::ContentSuggestionsService;
@@ -59,7 +60,6 @@
 using ntp_snippets::RemoteSuggestionsStatusService;
 using ntp_snippets::SchedulingRemoteSuggestionsProvider;
 using suggestions::CreateIOSImageDecoder;
-using suggestions::ImageFetcherImpl;
 
 namespace {
 
@@ -154,17 +154,20 @@
             ->GetSequencedTaskRunnerWithShutdownBehavior(
                 base::SequencedWorkerPool::GetSequenceToken(),
                 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
+
     auto suggestions_fetcher = base::MakeUnique<RemoteSuggestionsFetcher>(
         signin_manager, token_service, request_context, prefs, nullptr,
         base::Bind(&ParseJson), GetChannel() == version_info::Channel::STABLE
                                     ? google_apis::GetAPIKey()
                                     : google_apis::GetNonStableAPIKey(),
         service->user_classifier());
+
     auto provider = base::MakeUnique<RemoteSuggestionsProviderImpl>(
         service.get(), prefs, GetApplicationContext()->GetApplicationLocale(),
         service->category_ranker(), std::move(suggestions_fetcher),
-        base::MakeUnique<ImageFetcherImpl>(request_context.get(),
-                                           web::WebThread::GetBlockingPool()),
+        base::MakeUnique<ImageFetcherImpl>(
+            CreateIOSImageDecoder(web::WebThread::GetBlockingPool()),
+            request_context.get()),
         CreateIOSImageDecoder(task_runner),
         base::MakeUnique<RemoteSuggestionsDatabase>(database_dir, task_runner),
         base::MakeUnique<RemoteSuggestionsStatusService>(signin_manager,
diff --git a/ios/chrome/browser/suggestions/BUILD.gn b/ios/chrome/browser/suggestions/BUILD.gn
index c7034812..7cf651a 100644
--- a/ios/chrome/browser/suggestions/BUILD.gn
+++ b/ios/chrome/browser/suggestions/BUILD.gn
@@ -5,8 +5,6 @@
 source_set("suggestions") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "image_fetcher_impl.h",
-    "image_fetcher_impl.mm",
     "ios_image_decoder_impl.h",
     "ios_image_decoder_impl.mm",
     "suggestions_service_factory.h",
@@ -25,7 +23,6 @@
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
     "//ios/web",
-    "//ios/web/public/image_fetcher",
     "//net",
     "//skia",
     "//ui/gfx",
diff --git a/ios/chrome/browser/suggestions/image_fetcher_impl.h b/ios/chrome/browser/suggestions/image_fetcher_impl.h
deleted file mode 100644
index b31ba56..0000000
--- a/ios/chrome/browser/suggestions/image_fetcher_impl.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_SUGGESTIONS_IMAGE_FETCHER_IMPL_H_
-#define IOS_CHROME_BROWSER_SUGGESTIONS_IMAGE_FETCHER_IMPL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "components/image_fetcher/image_fetcher.h"
-
-class GURL;
-
-namespace base {
-class SequencedWorkerPool;
-}
-
-namespace gfx {
-class Image;
-}
-
-namespace image_fetcher {
-class ImageFetcherDelegate;
-class IOSImageDataFetcherWrapper;
-}
-
-namespace net {
-class URLRequestContextGetter;
-}
-
-namespace suggestions {
-
-// A class used to fetch server images asynchronously.
-class ImageFetcherImpl : public image_fetcher::ImageFetcher {
- public:
-  ImageFetcherImpl(net::URLRequestContextGetter* url_request_context,
-                   base::SequencedWorkerPool* blocking_pool);
-  ~ImageFetcherImpl() override;
-
-  void SetImageFetcherDelegate(
-      image_fetcher::ImageFetcherDelegate* delegate) override;
-
-  void SetDataUseServiceName(DataUseServiceName data_use_service_name) override;
-
-  void StartOrQueueNetworkRequest(
-      const std::string& id,
-      const GURL& image_url,
-      base::Callback<void(const std::string&, const gfx::Image&)> callback)
-      override;
-
- private:
-  std::unique_ptr<image_fetcher::IOSImageDataFetcherWrapper> image_fetcher_;
-
-  image_fetcher::ImageFetcherDelegate* delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(ImageFetcherImpl);
-};
-
-}  // namespace suggestions
-
-#endif  // IOS_CHROME_BROWSER_SUGGESTIONS_IMAGE_FETCHER_IMPL_H_
diff --git a/ios/chrome/browser/suggestions/image_fetcher_impl.mm b/ios/chrome/browser/suggestions/image_fetcher_impl.mm
deleted file mode 100644
index fa20dec..0000000
--- a/ios/chrome/browser/suggestions/image_fetcher_impl.mm
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/suggestions/image_fetcher_impl.h"
-
-#import <UIKit/UIKit.h>
-
-#include "base/memory/ptr_util.h"
-#include "base/threading/sequenced_worker_pool.h"
-#include "components/image_fetcher/image_fetcher_delegate.h"
-#include "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "skia/ext/skia_utils_ios.h"
-#include "ui/gfx/image/image.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace suggestions {
-
-ImageFetcherImpl::ImageFetcherImpl(
-    net::URLRequestContextGetter* url_request_context,
-    base::SequencedWorkerPool* blocking_pool)
-    : image_fetcher_(
-          base::MakeUnique<image_fetcher::IOSImageDataFetcherWrapper>(
-              url_request_context,
-              blocking_pool)) {}
-
-ImageFetcherImpl::~ImageFetcherImpl() {
-}
-
-void ImageFetcherImpl::SetImageFetcherDelegate(
-    image_fetcher::ImageFetcherDelegate* delegate) {
-  DCHECK(delegate);
-  delegate_ = delegate;
-}
-
-void ImageFetcherImpl::SetDataUseServiceName(
-    DataUseServiceName data_use_service_name) {
-  image_fetcher_->SetDataUseServiceName(data_use_service_name);
-}
-
-void ImageFetcherImpl::StartOrQueueNetworkRequest(
-    const std::string& id,
-    const GURL& image_url,
-    base::Callback<void(const std::string&, const gfx::Image&)> callback) {
-  if (image_url.is_empty()) {
-    gfx::Image empty_image;
-    callback.Run(id, empty_image);
-    if (delegate_) {
-      delegate_->OnImageFetched(id, empty_image);
-    }
-    return;
-  }
-  // Copy string reference so it's retained.
-  const std::string fetch_id(id);
-  // If image_fetcher_ is destroyed the request will be cancelled and this block
-  // will never be called. A reference to delegate_ can be kept.
-  image_fetcher::IOSImageDataFetcherCallback fetcher_callback =
-      ^(NSData* data, const image_fetcher::RequestMetadata& metadata) {
-        if (data) {
-          // Most likely always returns 1x images.
-          UIImage* ui_image = [UIImage imageWithData:data scale:1];
-          if (ui_image) {
-            gfx::Image gfx_image(ui_image, base::scoped_policy::ASSUME);
-            callback.Run(fetch_id, gfx_image);
-            if (delegate_) {
-              delegate_->OnImageFetched(fetch_id, gfx_image);
-            }
-            return;
-          }
-        }
-        gfx::Image empty_image;
-        callback.Run(fetch_id, empty_image);
-        if (delegate_) {
-          delegate_->OnImageFetched(fetch_id, empty_image);
-        }
-      };
-  image_fetcher_->FetchImageDataWebpDecoded(image_url, fetcher_callback);
-}
-
-}  // namespace suggestions
diff --git a/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm b/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
index 212c29d2..613ffe7 100644
--- a/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
+++ b/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
-#import "ios/web/public/image_fetcher/webp_decoder.h"
+#import "components/image_fetcher/ios/webp_decoder.h"
 #include "ios/web/public/web_thread.h"
 #include "ui/gfx/image/image.h"
 
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.mm b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
index daeca8b..3d8f70f 100644
--- a/ios/chrome/browser/suggestions/suggestions_service_factory.mm
+++ b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
@@ -13,6 +13,7 @@
 #include "base/threading/sequenced_worker_pool.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/image_fetcher/image_fetcher.h"
+#include "components/image_fetcher/image_fetcher_impl.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/leveldb_proto/proto_database_impl.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
@@ -24,7 +25,7 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/signin/oauth2_token_service_factory.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
-#include "ios/chrome/browser/suggestions/image_fetcher_impl.h"
+#include "ios/chrome/browser/suggestions/ios_image_decoder_impl.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
 #include "ios/web/public/browser_state.h"
 #include "ios/web/public/web_thread.h"
@@ -82,18 +83,23 @@
       IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state);
   base::FilePath database_dir(
       browser_state->GetStatePath().Append(kThumbnailDirectory));
+
   std::unique_ptr<SuggestionsStore> suggestions_store(
       new SuggestionsStore(browser_state->GetPrefs()));
   std::unique_ptr<BlacklistStore> blacklist_store(
       new BlacklistStore(browser_state->GetPrefs()));
   std::unique_ptr<leveldb_proto::ProtoDatabaseImpl<ImageData>> db(
       new leveldb_proto::ProtoDatabaseImpl<ImageData>(background_task_runner));
-  std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher(
-      new ImageFetcherImpl(browser_state->GetRequestContext(),
-                           sequenced_worker_pool));
+
+  std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher =
+      base::MakeUnique<image_fetcher::ImageFetcherImpl>(
+          CreateIOSImageDecoder(sequenced_worker_pool),
+          browser_state->GetRequestContext());
+
   std::unique_ptr<ImageManager> thumbnail_manager(new ImageManager(
       std::move(image_fetcher), std::move(db), database_dir,
       web::WebThread::GetTaskRunnerForThread(web::WebThread::DB)));
+
   return base::MakeUnique<SuggestionsServiceImpl>(
       signin_manager, token_service, sync_service,
       browser_state->GetRequestContext(), std::move(suggestions_store),
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn
index 61bfe2a1..04e1ef2 100644
--- a/ios/chrome/browser/tabs/BUILD.gn
+++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -121,7 +121,11 @@
     "tab_model_list.mm",
     "tab_model_observers.h",
     "tab_model_observers.mm",
+    "tab_model_observers_bridge.h",
+    "tab_model_observers_bridge.mm",
     "tab_model_order_controller.mm",
+    "tab_parenting_observer.h",
+    "tab_parenting_observer.mm",
   ]
   deps = [
     ":tabs",
diff --git a/ios/chrome/browser/tabs/tab_model.mm b/ios/chrome/browser/tabs/tab_model.mm
index c9799c0..65d1835 100644
--- a/ios/chrome/browser/tabs/tab_model.mm
+++ b/ios/chrome/browser/tabs/tab_model.mm
@@ -33,11 +33,14 @@
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/tabs/tab_model_list.h"
 #import "ios/chrome/browser/tabs/tab_model_observers.h"
+#import "ios/chrome/browser/tabs/tab_model_observers_bridge.h"
 #import "ios/chrome/browser/tabs/tab_model_order_controller.h"
 #import "ios/chrome/browser/tabs/tab_model_synced_window_delegate.h"
+#import "ios/chrome/browser/tabs/tab_parenting_observer.h"
 #import "ios/chrome/browser/xcallback_parameters.h"
 #import "ios/shared/chrome/browser/tabs/web_state_list.h"
 #import "ios/shared/chrome/browser/tabs/web_state_list_fast_enumeration_helper.h"
+#import "ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.h"
 #import "ios/shared/chrome/browser/tabs/web_state_list_observer.h"
 #import "ios/web/navigation/crw_session_certificate_policy_manager.h"
 #import "ios/web/navigation/crw_session_controller.h"
@@ -140,6 +143,10 @@
   // WebState owns the associated Tab.
   base::scoped_nsobject<NSMutableSet<Tab*>> _tabRetainer;
 
+  // WebStateListObserver bridges to react to modifications of the model (may
+  // send notification, translate and forward events, update metrics, ...).
+  std::vector<std::unique_ptr<WebStateListObserver>> _observerBridges;
+
   // Maintains policy for where new tabs go and the selection when a tab
   // is removed.
   base::scoped_nsobject<TabModelOrderController> _orderController;
@@ -226,6 +233,12 @@
   DCHECK(!_browserState);
 
   [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+  // Unregister all listeners before closing all the tabs.
+  for (const auto& observerBridge : _observerBridges)
+    _webStateList.RemoveObserver(observerBridge.get());
+  _observerBridges.clear();
+
   // Make sure the tabs do clean after themselves. It is important for
   // removeObserver: to be called first otherwise a lot of unecessary work will
   // happen on -closeAllTabs.
@@ -286,6 +299,14 @@
         initWithWebStateList:&_webStateList
                 proxyFactory:[[TabModelWebStateProxyFactory alloc] init]]);
 
+    _observerBridges.push_back(base::MakeUnique<TabParentingObserver>());
+    _observerBridges.push_back(base::MakeUnique<WebStateListObserverBridge>(
+        [[TabModelObserversBridge alloc] initWithTabModel:self
+                                        tabModelObservers:_observers.get()]));
+    _observerBridges.push_back(base::MakeUnique<WebStateListMetricsObserver>());
+    for (const auto& observerBridge : _observerBridges)
+      _webStateList.AddObserver(observerBridge.get());
+
     _browserState = browserState;
     DCHECK(_browserState);
 
@@ -536,15 +557,10 @@
   DCHECK(tab);
   DCHECK(![_tabRetainer containsObject:tab]);
   DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX));
-  [tab fetchFavicon];
 
   [_tabRetainer addObject:tab];
   _webStateList.InsertWebState(static_cast<int>(index), tab.webState);
-  TabParentingGlobalObserver::GetInstance()->OnTabParented(tab.webState);
-  [_observers tabModel:self didInsertTab:tab atIndex:index inForeground:NO];
-  [_observers tabModelDidChangeTabCount:self];
 
-  base::RecordAction(base::UserMetricsAction("MobileNewTabOpened"));
   // Persist the session due to a new tab being inserted. If this is a
   // background tab (will not become active), saving now will capture the
   // state properly. If it does eventually become active, another save will
@@ -555,14 +571,10 @@
 }
 
 - (void)moveTab:(Tab*)tab toIndex:(NSUInteger)toIndex {
-  if ([self tabAtIndex:toIndex] == tab)
-    return;
-
   DCHECK([_tabRetainer containsObject:tab]);
   DCHECK_LE(toIndex, static_cast<NSUInteger>(INT_MAX));
   int fromIndex = _webStateList.GetIndexOfWebState(tab.webState);
   _webStateList.MoveWebStateAt(fromIndex, static_cast<int>(toIndex));
-  [_observers tabModel:self didMoveTab:tab fromIndex:fromIndex toIndex:toIndex];
 }
 
 - (void)replaceTab:(Tab*)oldTab withTab:(Tab*)newTab {
@@ -574,27 +586,17 @@
   DCHECK_GE(index, 0);
 
   base::scoped_nsobject<Tab> tabSaver([oldTab retain]);
-  [newTab fetchFavicon];
   [_tabRetainer removeObject:oldTab];
   [_tabRetainer addObject:newTab];
   [newTab setParentTabModel:self];
 
   _webStateList.ReplaceWebStateAt(index, newTab.webState);
-  TabParentingGlobalObserver::GetInstance()->OnTabParented(newTab.webState);
-  [_observers tabModel:self
-         didReplaceTab:oldTab
-               withTab:newTab
-               atIndex:static_cast<NSUInteger>(index)];
 
   if (self.currentTab == oldTab)
     [self changeSelectedTabFrom:nil to:newTab persistState:NO];
 
   [oldTab setParentTabModel:nil];
   [oldTab close];
-
-  // Record a tab clobber, since swapping tabs bypasses the tab code that would
-  // normally log clobbers.
-  base::RecordAction(base::UserMetricsAction("MobileTabClobbered"));
 }
 
 - (void)closeTabAtIndex:(NSUInteger)index {
@@ -753,10 +755,6 @@
   [_tabRetainer removeObject:closedTab];
 
   _webStateList.DetachWebStateAt(closedTabIndex);
-  [_observers tabModel:self
-          didRemoveTab:closedTab
-               atIndex:static_cast<NSUInteger>(closedTabIndex)];
-  [_observers tabModelDidChangeTabCount:self];
 
   // Current tab has closed, update the selected tab and swap in its
   // contents. There is nothing to do if a non-selected tab is closed as
@@ -768,7 +766,6 @@
   } else {
     [self saveSessionImmediately:NO];
   }
-  base::RecordAction(base::UserMetricsAction("MobileTabClosed"));
   ++_closedTabCount;
 }
 
diff --git a/ios/chrome/browser/tabs/tab_model_observers_bridge.h b/ios/chrome/browser/tabs/tab_model_observers_bridge.h
new file mode 100644
index 0000000..d1f7242f
--- /dev/null
+++ b/ios/chrome/browser/tabs/tab_model_observers_bridge.h
@@ -0,0 +1,24 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_TABS_TAB_MODEL_OBSERVERS_BRIDGE_H_
+#define IOS_CHROME_BROWSER_TABS_TAB_MODEL_OBSERVERS_BRIDGE_H_
+
+#import "ios/shared/chrome/browser/tabs/web_state_list_observer_bridge.h"
+
+@class TabModel;
+@class TabModelObservers;
+
+// Bridge WebStateListObserver events to TabModelObservers.
+@interface TabModelObserversBridge : NSObject<WebStateListObserving>
+
+- (instancetype)initWithTabModel:(TabModel*)tabModel
+               tabModelObservers:(TabModelObservers*)tabModelObservers
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_TABS_TAB_MODEL_OBSERVERS_BRIDGE_H_
diff --git a/ios/chrome/browser/tabs/tab_model_observers_bridge.mm b/ios/chrome/browser/tabs/tab_model_observers_bridge.mm
new file mode 100644
index 0000000..76da2fc
--- /dev/null
+++ b/ios/chrome/browser/tabs/tab_model_observers_bridge.mm
@@ -0,0 +1,78 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/tabs/tab_model_observers_bridge.h"
+
+#include "base/logging.h"
+#import "ios/chrome/browser/tabs/legacy_tab_helper.h"
+#import "ios/chrome/browser/tabs/tab_model.h"
+#import "ios/chrome/browser/tabs/tab_model_observers.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation TabModelObserversBridge {
+  __weak TabModel* _tabModel;
+  __weak TabModelObservers* _tabModelObservers;
+}
+
+- (instancetype)initWithTabModel:(TabModel*)tabModel
+               tabModelObservers:(TabModelObservers*)tabModelObservers {
+  DCHECK(tabModel);
+  DCHECK(tabModelObservers);
+  if ((self = [super init])) {
+    _tabModel = tabModel;
+    _tabModelObservers = tabModelObservers;
+  }
+  return self;
+}
+
+#pragma mark WebStateListObserving
+
+- (void)webStateList:(WebStateList*)webStateList
+    didInsertWebState:(web::WebState*)webState
+              atIndex:(int)index {
+  DCHECK_GE(index, 0);
+  [_tabModelObservers tabModel:_tabModel
+                  didInsertTab:LegacyTabHelper::GetTabForWebState(webState)
+                       atIndex:static_cast<NSUInteger>(index)
+                  inForeground:NO];
+  [_tabModelObservers tabModelDidChangeTabCount:_tabModel];
+}
+
+- (void)webStateList:(WebStateList*)webStateList
+     didMoveWebState:(web::WebState*)webState
+           fromIndex:(int)fromIndex
+             toIndex:(int)toIndex {
+  DCHECK_GE(fromIndex, 0);
+  DCHECK_GE(toIndex, 0);
+  [_tabModelObservers tabModel:_tabModel
+                    didMoveTab:LegacyTabHelper::GetTabForWebState(webState)
+                     fromIndex:static_cast<NSUInteger>(fromIndex)
+                       toIndex:static_cast<NSUInteger>(toIndex)];
+}
+
+- (void)webStateList:(WebStateList*)webStateList
+    didReplaceWebState:(web::WebState*)oldWebState
+          withWebState:(web::WebState*)newWebState
+               atIndex:(int)index {
+  DCHECK_GE(index, 0);
+  [_tabModelObservers tabModel:_tabModel
+                 didReplaceTab:LegacyTabHelper::GetTabForWebState(oldWebState)
+                       withTab:LegacyTabHelper::GetTabForWebState(newWebState)
+                       atIndex:static_cast<NSUInteger>(index)];
+}
+
+- (void)webStateList:(WebStateList*)webStateList
+    didDetachWebState:(web::WebState*)webState
+              atIndex:(int)index {
+  DCHECK_GE(index, 0);
+  [_tabModelObservers tabModel:_tabModel
+                  didRemoveTab:LegacyTabHelper::GetTabForWebState(webState)
+                       atIndex:static_cast<NSUInteger>(index)];
+  [_tabModelObservers tabModelDidChangeTabCount:_tabModel];
+}
+
+@end
diff --git a/ios/chrome/browser/tabs/tab_parenting_observer.h b/ios/chrome/browser/tabs/tab_parenting_observer.h
new file mode 100644
index 0000000..acb47dc
--- /dev/null
+++ b/ios/chrome/browser/tabs/tab_parenting_observer.h
@@ -0,0 +1,36 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_TABS_TAB_PARENTING_OBSERVER_H_
+#define IOS_CHROME_BROWSER_TABS_TAB_PARENTING_OBSERVER_H_
+
+#include "base/macros.h"
+#import "ios/shared/chrome/browser/tabs/web_state_list_observer.h"
+
+class TabParentingObserver : public WebStateListObserver {
+ public:
+  TabParentingObserver();
+  ~TabParentingObserver() override;
+
+  // WebStateListObserver implementation.
+  void WebStateInsertedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index) override;
+  void WebStateMoved(WebStateList* web_state_list,
+                     web::WebState* web_state,
+                     int from_index,
+                     int to_index) override;
+  void WebStateReplacedAt(WebStateList* web_state_list,
+                          web::WebState* old_web_state,
+                          web::WebState* new_web_state,
+                          int index) override;
+  void WebStateDetachedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TabParentingObserver);
+};
+
+#endif  // IOS_CHROME_BROWSER_TABS_TAB_PARENTING_OBSERVER_H_
diff --git a/ios/chrome/browser/tabs/tab_parenting_observer.mm b/ios/chrome/browser/tabs/tab_parenting_observer.mm
new file mode 100644
index 0000000..4dbcef4
--- /dev/null
+++ b/ios/chrome/browser/tabs/tab_parenting_observer.mm
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/tabs/tab_parenting_observer.h"
+
+#include "ios/chrome/browser/tab_parenting_global_observer.h"
+#import "ios/chrome/browser/tabs/legacy_tab_helper.h"
+#import "ios/chrome/browser/tabs/tab.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+void OnWebStateParented(web::WebState* web_state) {
+  TabParentingGlobalObserver::GetInstance()->OnTabParented(web_state);
+  Tab* tab = LegacyTabHelper::GetTabForWebState(web_state);
+  [tab fetchFavicon];
+}
+}  // namespace
+
+TabParentingObserver::TabParentingObserver() = default;
+
+TabParentingObserver::~TabParentingObserver() = default;
+
+void TabParentingObserver::WebStateInsertedAt(WebStateList* web_state_list,
+                                              web::WebState* web_state,
+                                              int index) {
+  OnWebStateParented(web_state);
+}
+
+void TabParentingObserver::WebStateMoved(WebStateList* web_state_list,
+                                         web::WebState* web_state,
+                                         int from_index,
+                                         int to_index) {}
+
+void TabParentingObserver::WebStateReplacedAt(WebStateList* web_state_list,
+                                              web::WebState* old_web_state,
+                                              web::WebState* new_web_state,
+                                              int index) {
+  OnWebStateParented(new_web_state);
+}
+
+void TabParentingObserver::WebStateDetachedAt(WebStateList* web_state_list,
+                                              web::WebState* web_state,
+                                              int index) {}
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index f7fd1da..394aefd 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -4247,6 +4247,7 @@
   if (!_contentSuggestionsCoordinator) {
     _contentSuggestionsCoordinator.reset([[ContentSuggestionsCoordinator alloc]
         initWithBaseViewController:self]);
+    [_contentSuggestionsCoordinator setURLLoader:self];
   }
   [_contentSuggestionsCoordinator setBrowserState:_browserState];
   [_contentSuggestionsCoordinator start];
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h
index 0c1a4b9..87422a9 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h
@@ -22,6 +22,7 @@
 
 - (instancetype)initWithType:(NSInteger)type NS_UNAVAILABLE;
 
+@property(nonatomic, copy, readonly) NSString* title;
 @property(nonatomic, strong) UIImage* image;
 @property(nonatomic, readonly, assign) GURL articleURL;
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
index 1c73e5fa..7b956b32 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
@@ -17,7 +17,6 @@
 
 @interface ContentSuggestionsArticleItem ()
 
-@property(nonatomic, copy) NSString* title;
 @property(nonatomic, copy) NSString* subtitle;
 
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
index 29615fd..dfa156e1 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
@@ -7,20 +7,12 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestion.h"
 
+@class CollectionViewItem;
 @protocol ContentSuggestionsDataSource;
 @class ContentSuggestionsViewController;
 
-// Enum defining the ItemType of this ContentSuggestionsCollectionUpdater.
-typedef NS_ENUM(NSInteger, ItemType) {
-  ItemTypeText = kItemTypeEnumZero,
-  ItemTypeArticle,
-  ItemTypeExpand,
-  ItemTypeStack,
-  ItemTypeFavicon,
-};
-
 // Updater for a CollectionViewController populating it with some items and
 // handling the items addition.
 @interface ContentSuggestionsCollectionUpdater : NSObject
@@ -46,6 +38,9 @@
 // Returns whether the section should use the default, non-card style.
 - (BOOL)shouldUseCustomStyleForSection:(NSInteger)section;
 
+// Returns the ContentSuggestionType associated with this item.
+- (ContentSuggestionType)contentSuggestionTypeForItem:(CollectionViewItem*)item;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_UPDATER_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
index 14c8198..6e2c9a3 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -8,12 +8,14 @@
 #include "base/mac/foundation_util.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_controller.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestion.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_expandable_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_item.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_stack_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h"
 #include "url/gurl.h"
@@ -22,9 +24,71 @@
 #error "This file requires ARC support."
 #endif
 
+namespace {
+
+// Enum defining the ItemType of this ContentSuggestionsCollectionUpdater.
+typedef NS_ENUM(NSInteger, ItemType) {
+  ItemTypeText = kItemTypeEnumZero,
+  ItemTypeArticle,
+  ItemTypeExpand,
+  ItemTypeStack,
+  ItemTypeFavicon,
+};
+
+typedef NS_ENUM(NSInteger, SectionIdentifier) {
+  SectionIdentifierBookmarks = kSectionIdentifierEnumZero,
+  SectionIdentifierArticles,
+  SectionIdentifierDefault,
+};
+
+ItemType ItemTypeForContentSuggestionType(ContentSuggestionType type) {
+  switch (type) {
+    case ContentSuggestionTypeArticle:
+      return ItemTypeArticle;
+  }
+}
+
+ContentSuggestionType ContentSuggestionTypeForItemType(NSInteger type) {
+  if (type == ItemTypeArticle)
+    return ContentSuggestionTypeArticle;
+  // Add new type here
+
+  // Default type.
+  return ContentSuggestionTypeArticle;
+}
+
+// Returns the section identifier corresponding to the section |info|.
+SectionIdentifier SectionIdentifierForInfo(
+    ContentSuggestionsSectionInformation* info) {
+  switch (info.sectionID) {
+    case ContentSuggestionsSectionBookmarks:
+      return SectionIdentifierBookmarks;
+
+    case ContentSuggestionsSectionArticles:
+      return SectionIdentifierArticles;
+
+    case ContentSuggestionsSectionUnknown:
+      return SectionIdentifierDefault;
+  }
+}
+
+}  // namespace
+
 @interface ContentSuggestionsCollectionUpdater ()<ContentSuggestionsDataSink>
 
 @property(nonatomic, weak) id<ContentSuggestionsDataSource> dataSource;
+@property(nonatomic, strong)
+    NSMutableDictionary<NSNumber*, ContentSuggestionsSectionInformation*>*
+        sectionInfoBySectionIdentifier;
+
+// Reloads all the data from the data source, deleting all the current items.
+- (void)reloadData;
+// Adds a new section if needed and returns the section identifier.
+- (NSInteger)addSectionIfNeeded:
+    (ContentSuggestionsSectionInformation*)sectionInformation;
+// Resets the models, removing the current CollectionViewItem and the
+// SectionInfo.
+- (void)resetModels;
 
 @end
 
@@ -32,6 +96,7 @@
 
 @synthesize collectionViewController = _collectionViewController;
 @synthesize dataSource = _dataSource;
+@synthesize sectionInfoBySectionIdentifier = _sectionInfoBySectionIdentifier;
 
 - (instancetype)initWithDataSource:
     (id<ContentSuggestionsDataSource>)dataSource {
@@ -48,74 +113,14 @@
 - (void)setCollectionViewController:
     (ContentSuggestionsViewController*)collectionViewController {
   _collectionViewController = collectionViewController;
-  [collectionViewController loadModel];
-  CollectionViewModel* model = collectionViewController.collectionViewModel;
 
-  // TODO(crbug.com/686728): Load the data with the dataSource instead of hard
-  // coded value.
-
-  NSInteger sectionIdentifier = kSectionIdentifierEnumZero;
-
-  // Stack Item.
-  [model addSectionWithIdentifier:sectionIdentifier];
-  [model addItem:[[ContentSuggestionsStackItem alloc]
-                     initWithType:ItemTypeStack
-                            title:@"The title"
-                         subtitle:@"The subtitle"]
-      toSectionWithIdentifier:sectionIdentifier++];
-
-  // Favicon Item.
-  [model addSectionWithIdentifier:sectionIdentifier];
-  ContentSuggestionsFaviconItem* faviconItem =
-      [[ContentSuggestionsFaviconItem alloc] initWithType:ItemTypeFavicon];
-  for (NSInteger i = 0; i < 6; i++) {
-    [faviconItem addFavicon:[UIImage imageNamed:@"bookmark_gray_star_large"]
-                  withTitle:@"Super website! Incredible!"];
-  }
-  faviconItem.delegate = _collectionViewController;
-  [model addItem:faviconItem toSectionWithIdentifier:sectionIdentifier++];
-
-  for (NSInteger i = 0; i < 3; i++) {
-    [model addSectionWithIdentifier:sectionIdentifier];
-
-    // Standard Item.
-    [model addItem:[[ContentSuggestionsItem alloc] initWithType:ItemTypeText
-                                                          title:@"The title"
-                                                       subtitle:@"The subtitle"]
-        toSectionWithIdentifier:sectionIdentifier];
-
-    // Article Item.
-    [model addItem:[[ContentSuggestionsArticleItem alloc]
-                       initWithType:ItemTypeArticle
-                              title:@"Title of an Article"
-                           subtitle:@"This is the subtitle of an article, can "
-                                    @"spawn on multiple lines"
-                              image:[UIImage imageNamed:@"distillation_success"]
-                                url:GURL()]
-        toSectionWithIdentifier:sectionIdentifier];
-
-    // Expandable Item.
-    SuggestionsExpandableItem* expandableItem =
-        [[SuggestionsExpandableItem alloc]
-            initWithType:ItemTypeExpand
-                   title:@"Title of an Expandable Article"
-                subtitle:@"This Article can be expanded to display "
-                         @"additional information or interaction "
-                         @"options"
-                   image:[UIImage imageNamed:@"distillation_fail"]
-              detailText:@"Details shown only when the article is "
-                         @"expanded. It can be displayed on "
-                         @"multiple lines."];
-    expandableItem.delegate = _collectionViewController;
-    [model addItem:expandableItem toSectionWithIdentifier:sectionIdentifier];
-    sectionIdentifier++;
-  }
+  [self reloadData];
 }
 
 #pragma mark - ContentSuggestionsDataSink
 
 - (void)dataAvailable {
-  // TODO(crbug.com/686728): Get the new data from the DataSource.
+  [self reloadData];
 }
 
 #pragma mark - Public methods
@@ -123,40 +128,98 @@
 - (void)addTextItem:(NSString*)title
            subtitle:(NSString*)subtitle
           toSection:(NSInteger)inputSection {
-  DCHECK(_collectionViewController);
+  DCHECK(self.collectionViewController);
   ContentSuggestionsItem* item =
       [[ContentSuggestionsItem alloc] initWithType:ItemTypeText
                                              title:title
                                           subtitle:subtitle];
   NSInteger sectionIdentifier = kSectionIdentifierEnumZero + inputSection;
   NSInteger sectionIndex = inputSection;
-  CollectionViewModel* model = _collectionViewController.collectionViewModel;
+  CollectionViewModel* model =
+      self.collectionViewController.collectionViewModel;
   if ([model numberOfSections] <= inputSection) {
     sectionIndex = [model numberOfSections];
     sectionIdentifier = kSectionIdentifierEnumZero + sectionIndex;
-    [_collectionViewController.collectionView performBatchUpdates:^{
-      [_collectionViewController.collectionViewModel
+    [self.collectionViewController.collectionView performBatchUpdates:^{
+      [self.collectionViewController.collectionViewModel
           addSectionWithIdentifier:sectionIdentifier];
-      [_collectionViewController.collectionView
+      [self.collectionViewController.collectionView
           insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]];
     }
-                                                       completion:nil];
+                                                           completion:nil];
   }
   NSInteger numberOfItemsInSection =
       [model numberOfItemsInSection:sectionIndex];
-  [_collectionViewController.collectionViewModel addItem:item
-                                 toSectionWithIdentifier:sectionIdentifier];
-  [_collectionViewController.collectionView performBatchUpdates:^{
-    [_collectionViewController.collectionView
+  [self.collectionViewController.collectionViewModel addItem:item
+                                     toSectionWithIdentifier:sectionIdentifier];
+  [self.collectionViewController.collectionView performBatchUpdates:^{
+    [self.collectionViewController.collectionView
         insertItemsAtIndexPaths:@[ [NSIndexPath
                                     indexPathForRow:numberOfItemsInSection
                                           inSection:sectionIndex] ]];
   }
-                                                     completion:nil];
+                                                         completion:nil];
 }
 
 - (BOOL)shouldUseCustomStyleForSection:(NSInteger)section {
-  return section == 0 || section == 1;
+  NSNumber* identifier = @([self.collectionViewController.collectionViewModel
+      sectionIdentifierForSection:section]);
+  ContentSuggestionsSectionInformation* sectionInformation =
+      self.sectionInfoBySectionIdentifier[identifier];
+  return sectionInformation.layout == ContentSuggestionsSectionLayoutCustom;
+}
+
+- (ContentSuggestionType)contentSuggestionTypeForItem:
+    (CollectionViewItem*)item {
+  return ContentSuggestionTypeForItemType(item.type);
+}
+
+#pragma mark - Private methods
+
+- (void)reloadData {
+  [self resetModels];
+  CollectionViewModel* model =
+      self.collectionViewController.collectionViewModel;
+
+  NSArray<ContentSuggestion*>* suggestions = [self.dataSource allSuggestions];
+
+  for (ContentSuggestion* suggestion in suggestions) {
+    NSInteger sectionIdentifier = [self addSectionIfNeeded:suggestion.section];
+    ContentSuggestionsArticleItem* articleItem =
+        [[ContentSuggestionsArticleItem alloc]
+            initWithType:ItemTypeForContentSuggestionType(suggestion.type)
+                   title:suggestion.title
+                subtitle:suggestion.text
+                   image:suggestion.image
+                     url:suggestion.url];
+
+    [model addItem:articleItem toSectionWithIdentifier:sectionIdentifier];
+  }
+
+  if ([self.collectionViewController isViewLoaded]) {
+    [self.collectionViewController.collectionView reloadData];
+  }
+}
+
+- (NSInteger)addSectionIfNeeded:
+    (ContentSuggestionsSectionInformation*)sectionInformation {
+  NSInteger sectionIdentifier = SectionIdentifierForInfo(sectionInformation);
+
+  CollectionViewModel* model =
+      self.collectionViewController.collectionViewModel;
+  if (![model hasSectionForSectionIdentifier:sectionIdentifier]) {
+    [model addSectionWithIdentifier:sectionIdentifier];
+    self.sectionInfoBySectionIdentifier[@(sectionIdentifier)] =
+        sectionInformation;
+    [self.sectionInfoBySectionIdentifier setObject:sectionInformation
+                                            forKey:@(sectionIdentifier)];
+  }
+  return sectionIdentifier;
+}
+
+- (void)resetModels {
+  [self.collectionViewController loadModel];
+  self.sectionInfoBySectionIdentifier = [[NSMutableDictionary alloc] init];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
index 7737344..19eda28 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
@@ -5,6 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COMMANDS_H_
 #define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COMMANDS_H_
 
+@class ContentSuggestionsArticleItem;
 class GURL;
 
 // Commands protocol for the ContentSuggestionsViewController.
@@ -19,7 +20,10 @@
 // Opens the favicon associated with the cell with the |index|.
 - (void)openFaviconAtIndex:(NSInteger)index;
 // Opens the |URL|.
-- (void)openURL:(const GURL&)url;
+- (void)openURL:(const GURL&)URL;
+// Displays a context menu for opening the |articleItem|.
+- (void)displayContextMenuForArticle:(ContentSuggestionsArticleItem*)articleItem
+                             atPoint:(CGPoint)touchLocation;
 
 @end
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index 4ed54b76..e6ff832 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -61,6 +61,13 @@
 
   self.collectionView.delegate = self;
   self.styler.cellStyle = MDCCollectionViewCellStyleCard;
+
+  UILongPressGestureRecognizer* longPressRecognizer =
+      [[UILongPressGestureRecognizer alloc]
+          initWithTarget:self
+                  action:@selector(handleLongPress:)];
+  longPressRecognizer.numberOfTouchesRequired = 1;
+  [self.collectionView addGestureRecognizer:longPressRecognizer];
 }
 
 #pragma mark - UICollectionViewDelegate
@@ -71,15 +78,10 @@
 
   CollectionViewItem* item =
       [self.collectionViewModel itemAtIndexPath:indexPath];
-  switch (item.type) {
-    case ItemTypeStack:
-      [self.suggestionCommandHandler openReadingList];
-      break;
-    case ItemTypeArticle:
+  switch ([self.collectionUpdater contentSuggestionTypeForItem:item]) {
+    case ContentSuggestionTypeArticle:
       [self openArticle:item];
       break;
-    default:
-      break;
   }
 }
 
@@ -185,4 +187,35 @@
   [self.suggestionCommandHandler openURL:article.articleURL];
 }
 
+- (void)handleLongPress:(UILongPressGestureRecognizer*)gestureRecognizer {
+  if (self.editor.editing ||
+      gestureRecognizer.state != UIGestureRecognizerStateBegan) {
+    return;
+  }
+
+  CGPoint touchLocation =
+      [gestureRecognizer locationOfTouch:0 inView:self.collectionView];
+  NSIndexPath* touchedItemIndexPath =
+      [self.collectionView indexPathForItemAtPoint:touchLocation];
+  if (!touchedItemIndexPath ||
+      ![self.collectionViewModel hasItemAtIndexPath:touchedItemIndexPath]) {
+    // Make sure there is an item at this position.
+    return;
+  }
+  CollectionViewItem* touchedItem =
+      [self.collectionViewModel itemAtIndexPath:touchedItemIndexPath];
+
+  if ([self.collectionUpdater contentSuggestionTypeForItem:touchedItem] !=
+      ContentSuggestionTypeArticle) {
+    // Only trigger context menu on articles.
+    return;
+  }
+
+  ContentSuggestionsArticleItem* articleItem =
+      base::mac::ObjCCastStrict<ContentSuggestionsArticleItem>(touchedItem);
+
+  [self.suggestionCommandHandler displayContextMenuForArticle:articleItem
+                                                      atPoint:touchLocation];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index 82f5cdbf..7a0df02 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -90,7 +90,6 @@
     "//ios/third_party/material_components_ios",
     "//ios/third_party/material_roboto_font_loader_ios",
     "//ios/web",
-    "//ios/web/public/image_fetcher",
     "//net",
     "//skia",
     "//third_party/google_toolbox_for_mac",
diff --git a/ios/chrome/browser/ui/static_content/static_html_view_controller.h b/ios/chrome/browser/ui/static_content/static_html_view_controller.h
index e1f9b18..070e246e 100644
--- a/ios/chrome/browser/ui/static_content/static_html_view_controller.h
+++ b/ios/chrome/browser/ui/static_content/static_html_view_controller.h
@@ -64,6 +64,7 @@
 // Initialization method. |generator| will produce the html to display. Its
 // generation method will be called each time reload is called. |browserState|
 // is the user browser state to use for loading resources and must not be null.
+// |StaticHtmlViewController| retains |generator|.
 - (instancetype)initWithGenerator:(id<HtmlGenerator>)generator
                      browserState:(web::BrowserState*)browserState;
 
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn
index 679f332..7cd4b1a 100644
--- a/ios/chrome/browser/web/BUILD.gn
+++ b/ios/chrome/browser/web/BUILD.gn
@@ -157,6 +157,8 @@
     "chrome_web_client.mm",
     "error_page_content.h",
     "error_page_content.mm",
+    "error_page_generator.h",
+    "error_page_generator.mm",
     "external_app_launcher.h",
     "external_app_launcher.mm",
     "passkit_dialog_provider.h",
@@ -221,7 +223,7 @@
     "auto_reload_controller_unittest.mm",
     "blocked_popup_tab_helper_unittest.mm",
     "chrome_web_client_unittest.mm",
-    "error_page_content_unittest.mm",
+    "error_page_generator_unittest.mm",
     "external_app_launcher_unittest.mm",
     "find_in_page_js_unittest.mm",
     "js_findinpage_manager_unittest.mm",
diff --git a/ios/chrome/browser/web/DEPS b/ios/chrome/browser/web/DEPS
index 4cf5b27..4297833 100644
--- a/ios/chrome/browser/web/DEPS
+++ b/ios/chrome/browser/web/DEPS
@@ -8,7 +8,7 @@
     "+ios/web/web_state/blocked_popup_info.h",
   ],
   # TODO(crbug.com/622485): Remove this exception.
-  "^error_page_content_unittest\.mm$": [
+  "^error_page_generator_unittest\.mm$": [
     "+ios/web/web_state/error_translation_util.h",
   ],
   # TODO(crbug.com/623125): Remove this exception.
diff --git a/ios/chrome/browser/web/error_page_content.h b/ios/chrome/browser/web/error_page_content.h
index 1717de5..a7e52fed 100644
--- a/ios/chrome/browser/web/error_page_content.h
+++ b/ios/chrome/browser/web/error_page_content.h
@@ -7,18 +7,13 @@
 
 #import <UIKit/UIKit.h>
 
-#include "base/mac/scoped_nsobject.h"
 #import "ios/chrome/browser/ui/static_content/static_html_native_content.h"
-#import "ios/chrome/browser/ui/static_content/static_html_view_controller.h"
 
 namespace web {
 class BrowserState;
 }
 
-@interface ErrorPageContent : StaticHtmlNativeContent<HtmlGenerator> {
-  // Stores the HTML generated from the NSError in the initializer.
-  base::scoped_nsobject<NSString> html_;
-}
+@interface ErrorPageContent : StaticHtmlNativeContent
 
 // Initialization. |loader| and |url| are passed up to StaticHtmlNativeContent;
 // |loader| cannot be nil.
diff --git a/ios/chrome/browser/web/error_page_content.mm b/ios/chrome/browser/web/error_page_content.mm
index fbd846d..0fe4543 100644
--- a/ios/chrome/browser/web/error_page_content.mm
+++ b/ios/chrome/browser/web/error_page_content.mm
@@ -6,18 +6,10 @@
 
 #include <memory>
 
-#import "base/ios/ns_error_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/values.h"
-#include "components/error_page/common/error_page_params.h"
-#include "components/error_page/common/localized_error.h"
-#include "components/grit/components_resources.h"
-#include "ios/chrome/browser/application_context.h"
+#import "base/mac/scoped_nsobject.h"
+#import "ios/chrome/browser/web/error_page_generator.h"
 #include "ios/web/public/referrer.h"
-#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/page_transition_types.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/webui/jstemplate_builder.h"
 #include "url/gurl.h"
 
 @implementation ErrorPageContent
@@ -36,52 +28,19 @@
       rendererInitiated:YES];
 }
 
-- (void)generateHtml:(HtmlCallback)callback {
-  callback(html_.get());
-}
-
 - (id)initWithLoader:(id<UrlLoader>)loader
         browserState:(web::BrowserState*)browserState
                  url:(const GURL&)url
                error:(NSError*)error
               isPost:(BOOL)isPost
          isIncognito:(BOOL)isIncognito {
-  NSString* badURLString =
-      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey];
-  NSError* originalError = base::ios::GetFinalUnderlyingErrorFromError(error);
-  NSString* errorDomain = nil;
-  int errorCode = 0;
-
-  if (originalError) {
-    errorDomain = [originalError domain];
-    errorCode = [originalError code];
-  } else {
-    errorDomain = [error domain];
-    errorCode = [error code];
-  }
-  DCHECK(errorCode != 0);
-
-  base::DictionaryValue errorStrings;
-  error_page::LocalizedError::GetStrings(
-      errorCode, base::SysNSStringToUTF8(errorDomain),
-      GURL(base::SysNSStringToUTF16(badURLString)), isPost, false, false,
-      isIncognito, GetApplicationContext()->GetApplicationLocale(), nullptr,
-      &errorStrings);
-
-  ui::ScaleFactor scaleFactor =
-      ResourceBundle::GetSharedInstance().GetMaxScaleFactor();
-
-  const base::StringPiece templateHTML(
-      ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
-          IDR_NET_ERROR_HTML, scaleFactor));
-  if (templateHTML.empty())
-    NOTREACHED() << "unable to load template. ID: " << IDR_NET_ERROR_HTML;
-  std::string errorHTML = webui::GetTemplatesHtml(
-      templateHTML, &errorStrings, "t" /* IDR_NET_ERROR_HTML root id */);
-  html_.reset([base::SysUTF8ToNSString(errorHTML) retain]);
+  ErrorPageGenerator* generator =
+      [[[ErrorPageGenerator alloc] initWithError:error
+                                          isPost:isPost
+                                     isIncognito:isIncognito] autorelease];
 
   base::scoped_nsobject<StaticHtmlViewController> HTMLViewController(
-      [[StaticHtmlViewController alloc] initWithGenerator:self
+      [[StaticHtmlViewController alloc] initWithGenerator:generator
                                              browserState:browserState]);
   return [super initWithLoader:loader
       staticHTMLViewController:HTMLViewController
diff --git a/ios/chrome/browser/web/error_page_content_unittest.mm b/ios/chrome/browser/web/error_page_content_unittest.mm
deleted file mode 100644
index 3714882..0000000
--- a/ios/chrome/browser/web/error_page_content_unittest.mm
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/mac/scoped_nsobject.h"
-#include "base/strings/sys_string_conversions.h"
-#import "ios/chrome/browser/ui/url_loader.h"
-#import "ios/chrome/browser/web/error_page_content.h"
-#include "ios/web/public/test/web_test.h"
-#include "ios/web/web_state/error_translation_util.h"
-#import "net/base/mac/url_conversions.h"
-#include "net/base/net_errors.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gtest_mac.h"
-#import "third_party/ocmock/OCMock/OCMock.h"
-#import "third_party/ocmock/gtest_support.h"
-#include "url/gurl.h"
-
-// From static_html_view_controller.mm: callback for the HtmlGenerator protocol.
-typedef void (^HtmlCallback)(NSString*);
-
-// To test the error page content code, generate a URL and error data, and
-// examine the generated HTML to make sure the expected text has been
-// included. In detail:
-// 1. Create a GURL with the URL to submit to the error page creator.
-// 2. Use GenerateError to create an NSError object to pass in.
-// 3. Initialize errorPageContent_ with the URL and NSError objects.
-// 4. Pass the |TestHTMLForError| function to errorPageContent_'s generateHTML
-//    function, along with the string that's expected to appear in the
-//    generated HTML for this error.
-class ErrorPageContentTest : public web::WebTest {
- protected:
-  void SetUp() override {
-    web::WebTest::SetUp();
-    mockLoader_.reset(
-        [[OCMockObject niceMockForProtocol:@protocol(UrlLoader)] retain]);
-  }
-
-  // Test the HTML generated in the test against the error we were supposed to
-  // find.
-  static void TestHTMLForError(NSString* html, NSString* errorToFind) {
-    EXPECT_TRUE([html rangeOfString:errorToFind].length > 0);
-  }
-
-  // Generate an NSError object with the format expected by LocalizedError,
-  // given a URL, error domain, and error code.
-  NSError* GenerateError(const GURL& errorURL,
-                         NSString* errorDomain,
-                         NSInteger errorCode) {
-    NSDictionary* info = @{
-      NSURLErrorFailingURLStringErrorKey :
-          base::SysUTF8ToNSString(errorURL.spec())
-    };
-    return web::NetErrorFromError(
-        [NSError errorWithDomain:errorDomain code:errorCode userInfo:info]);
-  }
-
-  // ErrorPageContent object to be tested.
-  base::scoped_nsobject<ErrorPageContent> errorPageContent_;
-
-  // Mock for the URLLoader that would otherwise handle the HTML produced.
-  base::scoped_nsobject<OCMockObject> mockLoader_;
-};
-
-// Test with a timed out error.
-TEST_F(ErrorPageContentTest, TimedOut) {
-  GURL errorURL("http://www.google.com");
-  NSError* error =
-      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
-  errorPageContent_.reset([[ErrorPageContent alloc]
-      initWithLoader:((id<UrlLoader>)mockLoader_.get())
-        browserState:GetBrowserState()
-                 url:errorURL
-               error:error
-              isPost:NO
-         isIncognito:NO]);
-  [errorPageContent_.get() generateHtml:^(NSString* html) {
-    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
-  }];
-}
-
-// Test with a bad URL scheme (see b/7448754).
-TEST_F(ErrorPageContentTest, BadURLScheme) {
-  GURL errorURL(
-      "itms-appss://itunes.apple.com/gb/app/google-search/id284815942?mt=8");
-  NSError* error =
-      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
-  errorPageContent_.reset([[ErrorPageContent alloc]
-      initWithLoader:((id<UrlLoader>)mockLoader_.get())
-        browserState:GetBrowserState()
-                 url:errorURL
-               error:error
-              isPost:NO
-         isIncognito:NO]);
-  [errorPageContent_.get() generateHtml:^(NSString* html) {
-    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
-  }];
-}
-
-// Test with an empty GURL object.
-// TODO(ios): [merge 191784] b/8525110 fix the code or the test.
-TEST_F(ErrorPageContentTest, EmptyURLObject) {
-  GURL errorURL;
-  NSError* error =
-      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
-  errorPageContent_.reset([[ErrorPageContent alloc]
-      initWithLoader:((id<UrlLoader>)mockLoader_.get())
-        browserState:GetBrowserState()
-                 url:errorURL
-               error:error
-              isPost:NO
-         isIncognito:NO]);
-  [errorPageContent_.get() generateHtml:^(NSString* html) {
-    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
-  }];
-}
diff --git a/ios/chrome/browser/web/error_page_generator.h b/ios/chrome/browser/web/error_page_generator.h
new file mode 100644
index 0000000..b644e1e
--- /dev/null
+++ b/ios/chrome/browser/web/error_page_generator.h
@@ -0,0 +1,22 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_WEB_ERROR_PAGE_GENERATOR_H_
+#define IOS_CHROME_BROWSER_WEB_ERROR_PAGE_GENERATOR_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/chrome/browser/ui/static_content/static_html_view_controller.h"
+
+// This class is needed because StaticHtmlViewController retains the
+// HtmlGenerator.
+@interface ErrorPageGenerator : NSObject<HtmlGenerator>
+- (instancetype)initWithError:(NSError*)error
+                       isPost:(BOOL)isPost
+                  isIncognito:(BOOL)isIncognito NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+@end
+
+#endif  // IOS_CHROME_BROWSER_WEB_ERROR_PAGE_GENERATOR_H_
diff --git a/ios/chrome/browser/web/error_page_generator.mm b/ios/chrome/browser/web/error_page_generator.mm
new file mode 100644
index 0000000..239c3cb
--- /dev/null
+++ b/ios/chrome/browser/web/error_page_generator.mm
@@ -0,0 +1,74 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/web/error_page_generator.h"
+
+#import "base/ios/ns_error_util.h"
+#include "base/logging.h"
+#import "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/values.h"
+#include "components/error_page/common/error_page_params.h"
+#include "components/error_page/common/localized_error.h"
+#include "components/grit/components_resources.h"
+#include "ios/chrome/browser/application_context.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/base/resource/scale_factor.h"
+#include "ui/base/webui/jstemplate_builder.h"
+#include "url/gurl.h"
+
+@implementation ErrorPageGenerator {
+  // Stores the HTML generated from the NSError in the initializer.
+  base::scoped_nsobject<NSString> html_;
+}
+
+- (instancetype)initWithError:(NSError*)error
+                       isPost:(BOOL)isPost
+                  isIncognito:(BOOL)isIncognito {
+  self = [super init];
+  if (self) {
+    NSString* badURLSpec = error.userInfo[NSURLErrorFailingURLStringErrorKey];
+    NSError* originalError = base::ios::GetFinalUnderlyingErrorFromError(error);
+    NSString* errorDomain = nil;
+    int errorCode = 0;
+
+    if (originalError) {
+      errorDomain = [originalError domain];
+      errorCode = [originalError code];
+    } else {
+      errorDomain = [error domain];
+      errorCode = [error code];
+    }
+    DCHECK(errorCode != 0);
+
+    base::DictionaryValue errorStrings;
+    error_page::LocalizedError::GetStrings(
+        errorCode, base::SysNSStringToUTF8(errorDomain),
+        GURL(base::SysNSStringToUTF16(badURLSpec)), isPost, false, false,
+        isIncognito, GetApplicationContext()->GetApplicationLocale(), nullptr,
+        &errorStrings);
+
+    ui::ScaleFactor scaleFactor =
+        ResourceBundle::GetSharedInstance().GetMaxScaleFactor();
+
+    const base::StringPiece templateHTML(
+        ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
+            IDR_NET_ERROR_HTML, scaleFactor));
+    if (templateHTML.empty())
+      NOTREACHED() << "unable to load template. ID: " << IDR_NET_ERROR_HTML;
+    std::string errorHTML = webui::GetTemplatesHtml(
+        templateHTML, &errorStrings, "t" /* IDR_NET_ERROR_HTML root id */);
+    html_.reset([base::SysUTF8ToNSString(errorHTML) retain]);
+  }
+  return self;
+}
+
+#pragma mark - HtmlGenerator
+
+- (void)generateHtml:(HtmlCallback)callback {
+  callback(html_.get());
+}
+
+@end
diff --git a/ios/chrome/browser/web/error_page_generator_unittest.mm b/ios/chrome/browser/web/error_page_generator_unittest.mm
new file mode 100644
index 0000000..af1f933
--- /dev/null
+++ b/ios/chrome/browser/web/error_page_generator_unittest.mm
@@ -0,0 +1,97 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/web/error_page_generator.h"
+#include "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "ios/web/public/test/web_test.h"
+#include "ios/web/web_state/error_translation_util.h"
+#import "net/base/mac/url_conversions.h"
+#include "net/base/net_errors.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#import "third_party/ocmock/gtest_support.h"
+#include "url/gurl.h"
+
+// From static_html_view_controller.mm: callback for the HtmlGenerator protocol.
+typedef void (^HtmlCallback)(NSString*);
+
+// To test the error page generator code, generate  error data, and examine the
+// generated HTML to make sure the expected text has been included. In detail:
+// 1. Use GenerateError to create an NSError object to pass in.
+// 2. Initialize errorPageGenerator_ with NSError objects.
+// 3. Pass the |TestHTMLForError| function to errorPageContent_'s generateHTML
+//    function, along with the string that's expected to appear in the
+//    generated HTML for this error.
+class ErrorPageGeneratorTest : public web::WebTest {
+ protected:
+  void SetUp() override { web::WebTest::SetUp(); }
+
+  // Test the HTML generated in the test against the error we were supposed to
+  // find.
+  static void TestHTMLForError(NSString* html, NSString* errorToFind) {
+    EXPECT_TRUE([html rangeOfString:errorToFind].length > 0);
+  }
+
+  // Generate an NSError object with the format expected by LocalizedError,
+  // given a URL, error domain, and error code.
+  NSError* GenerateError(const GURL& errorURL,
+                         NSString* errorDomain,
+                         NSInteger errorCode) {
+    NSDictionary* info = @{
+      NSURLErrorFailingURLStringErrorKey :
+          base::SysUTF8ToNSString(errorURL.spec())
+    };
+    return web::NetErrorFromError(
+        [NSError errorWithDomain:errorDomain code:errorCode userInfo:info]);
+  }
+
+  // ErrorPageContent object to be tested.
+  base::scoped_nsobject<ErrorPageGenerator> errorPageGenerator_;
+
+  // Mock for the URLLoader that would otherwise handle the HTML produced.
+  base::scoped_nsobject<OCMockObject> mockLoader_;
+};
+
+// Test with a timed out error.
+TEST_F(ErrorPageGeneratorTest, TimedOut) {
+  GURL errorURL("http://www.google.com");
+  NSError* error =
+      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
+  errorPageGenerator_.reset([[ErrorPageGenerator alloc] initWithError:error
+                                                               isPost:NO
+                                                          isIncognito:NO]);
+  [errorPageGenerator_.get() generateHtml:^(NSString* html) {
+    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
+  }];
+}
+
+// Test with a bad URL scheme (see b/7448754).
+TEST_F(ErrorPageGeneratorTest, BadURLScheme) {
+  GURL errorURL(
+      "itms-appss://itunes.apple.com/gb/app/google-search/id284815942?mt=8");
+  NSError* error =
+      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
+  errorPageGenerator_.reset([[ErrorPageGenerator alloc] initWithError:error
+                                                               isPost:NO
+                                                          isIncognito:NO]);
+  [errorPageGenerator_.get() generateHtml:^(NSString* html) {
+    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
+  }];
+}
+
+// Test with an empty GURL object.
+// TODO(ios): [merge 191784] b/8525110 fix the code or the test.
+TEST_F(ErrorPageGeneratorTest, EmptyURLObject) {
+  GURL errorURL;
+  NSError* error =
+      GenerateError(errorURL, NSURLErrorDomain, kCFURLErrorTimedOut);
+  errorPageGenerator_.reset([[ErrorPageGenerator alloc] initWithError:error
+                                                               isPost:NO
+                                                          isIncognito:NO]);
+  [errorPageGenerator_.get() generateHtml:^(NSString* html) {
+    TestHTMLForError(html, @"ERR_CONNECTION_TIMED_OUT");
+  }];
+}
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 98c38df5..cadef7b 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -188,7 +188,6 @@
     "//ios/chrome/common:unit_tests",
     "//ios/chrome/test/base:unit_tests",
     "//ios/shared/chrome/browser/tabs:unit_tests",
-    "//ios/web/public/image_fetcher:unit_tests",
   ]
 
   assert_no_deps = ios_assert_no_deps
diff --git a/ios/shared/chrome/browser/tabs/BUILD.gn b/ios/shared/chrome/browser/tabs/BUILD.gn
index be4f83a..a416aa6b 100644
--- a/ios/shared/chrome/browser/tabs/BUILD.gn
+++ b/ios/shared/chrome/browser/tabs/BUILD.gn
@@ -8,6 +8,8 @@
     "web_state_list.mm",
     "web_state_list_fast_enumeration_helper.h",
     "web_state_list_fast_enumeration_helper.mm",
+    "web_state_list_metrics_observer.h",
+    "web_state_list_metrics_observer.mm",
     "web_state_list_observer.h",
     "web_state_list_observer_bridge.h",
     "web_state_list_observer_bridge.mm",
diff --git a/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.h b/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.h
new file mode 100644
index 0000000..ebaa366
--- /dev/null
+++ b/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.h
@@ -0,0 +1,36 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_SHARED_CHROME_BROWSER_TABS_WEB_STATE_LIST_METRICS_OBSERVER_H_
+#define IOS_SHARED_CHROME_BROWSER_TABS_WEB_STATE_LIST_METRICS_OBSERVER_H_
+
+#include "base/macros.h"
+#import "ios/shared/chrome/browser/tabs/web_state_list_observer.h"
+
+class WebStateListMetricsObserver : public WebStateListObserver {
+ public:
+  WebStateListMetricsObserver();
+  ~WebStateListMetricsObserver() override;
+
+  // WebStateListObserver implementation.
+  void WebStateInsertedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index) override;
+  void WebStateMoved(WebStateList* web_state_list,
+                     web::WebState* web_state,
+                     int from_index,
+                     int to_index) override;
+  void WebStateReplacedAt(WebStateList* web_state_list,
+                          web::WebState* old_web_state,
+                          web::WebState* new_web_state,
+                          int index) override;
+  void WebStateDetachedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WebStateListMetricsObserver);
+};
+
+#endif  // IOS_SHARED_CHROME_BROWSER_TABS_WEB_STATE_LIST_METRICS_OBSERVER_H_
diff --git a/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.mm b/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.mm
new file mode 100644
index 0000000..fd223b4
--- /dev/null
+++ b/ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.mm
@@ -0,0 +1,45 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/shared/chrome/browser/tabs/web_state_list_metrics_observer.h"
+
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+WebStateListMetricsObserver::WebStateListMetricsObserver() = default;
+
+WebStateListMetricsObserver::~WebStateListMetricsObserver() = default;
+
+void WebStateListMetricsObserver::WebStateInsertedAt(
+    WebStateList* web_state_list,
+    web::WebState* web_state,
+    int index) {
+  base::RecordAction(base::UserMetricsAction("MobileNewTabOpened"));
+}
+
+void WebStateListMetricsObserver::WebStateMoved(WebStateList* web_state_list,
+                                                web::WebState* web_state,
+                                                int from_index,
+                                                int to_index) {}
+
+void WebStateListMetricsObserver::WebStateReplacedAt(
+    WebStateList* web_state_list,
+    web::WebState* old_web_state,
+    web::WebState* new_web_state,
+    int index) {
+  // Record a tab clobber, since swapping tabs bypasses the Tab code that would
+  // normally log clobbers.
+  base::RecordAction(base::UserMetricsAction("MobileTabClobbered"));
+}
+
+void WebStateListMetricsObserver::WebStateDetachedAt(
+    WebStateList* web_state_list,
+    web::WebState* web_state,
+    int index) {
+  base::RecordAction(base::UserMetricsAction("MobileTabClosed"));
+}
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 5a84a02..8b6883c0 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -263,7 +263,6 @@
     "//components/url_formatter",
     "//ios/net",
     "//ios/third_party/blink:html_tokenizer",
-    "//ios/web/public/image_fetcher",
     "//mojo/public/cpp/system",
     "//mojo/public/js",
     "//net",
@@ -380,7 +379,6 @@
     "//ios/testing:ios_test_support",
     "//ios/testing:ocmock_support",
     "//ios/third_party/gcdwebserver",
-    "//ios/web/public/image_fetcher",
     "//ios/web/test:mojo_bindings",
     "//net:test_support",
     "//testing/gmock",
@@ -511,7 +509,6 @@
     "//components/url_formatter",
     "//ios/net",
     "//ios/testing:ocmock_support",
-    "//ios/web/public/image_fetcher:unit_tests",
     "//ios/web/test:mojo_bindings",
     "//net:test_support",
     "//services/service_manager/public/cpp",
diff --git a/ios/web/public/image_fetcher/BUILD.gn b/ios/web/public/image_fetcher/BUILD.gn
deleted file mode 100644
index 3a1cf83..0000000
--- a/ios/web/public/image_fetcher/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("image_fetcher") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [
-    "webp_decoder.h",
-    "webp_decoder.mm",
-  ]
-  deps = [
-    "//base",
-    "//third_party/libwebp:libwebp_dec",
-  ]
-}
-
-source_set("unit_tests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  sources = [
-    "webp_decoder_unittest.mm",
-  ]
-  deps = [
-    ":image_fetcher",
-    ":webp_transcode_unit_tests_bundle_data",
-    "//base",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-  libs = [ "CoreGraphics.framework" ]
-}
-
-bundle_data("webp_transcode_unit_tests_bundle_data") {
-  visibility = [ ":unit_tests" ]
-  testonly = true
-  sources = [
-    "//ios/web/test/data/webp_transcode/test.jpg",
-    "//ios/web/test/data/webp_transcode/test.webp",
-    "//ios/web/test/data/webp_transcode/test_alpha.png",
-    "//ios/web/test/data/webp_transcode/test_alpha.webp",
-    "//ios/web/test/data/webp_transcode/test_small.tiff",
-    "//ios/web/test/data/webp_transcode/test_small.webp",
-  ]
-  outputs = [
-    "{{bundle_resources_dir}}/{{source_root_relative_dir}}/" +
-        "{{source_file_part}}",
-  ]
-}
diff --git a/ios/web/public/image_fetcher/DEPS b/ios/web/public/image_fetcher/DEPS
deleted file mode 100644
index 47dd27c6..0000000
--- a/ios/web/public/image_fetcher/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  # Only WebP decoding is allowed (no encoding).
-  "+third_party/libwebp/webp/decode.h",
-]
diff --git a/ios/web/public/image_fetcher/OWNERS b/ios/web/public/image_fetcher/OWNERS
deleted file mode 100644
index fa3d0c2..0000000
--- a/ios/web/public/image_fetcher/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-droger@chromium.org
-sdefresne@chromium.org
diff --git a/media/gpu/vaapi_wrapper.cc b/media/gpu/vaapi_wrapper.cc
index 4f36b67..15d1f18 100644
--- a/media/gpu/vaapi_wrapper.cc
+++ b/media/gpu/vaapi_wrapper.cc
@@ -1062,7 +1062,7 @@
   pipeline_param->output_region = &output_region;
   pipeline_param->output_background_color = 0xff000000;
   pipeline_param->output_color_standard = VAProcColorStandardNone;
-  pipeline_param->filter_flags = VA_FILTER_SCALING_HQ;
+  pipeline_param->filter_flags = VA_FILTER_SCALING_DEFAULT;
 
   VA_SUCCESS_OR_RETURN(vaUnmapBuffer(va_display_, va_vpp_buffer_id_),
                        "Couldn't unmap vpp buffer", false);
diff --git a/media/test/data/test-25fps.h264.md5 b/media/test/data/test-25fps.h264.md5
index e80600d..ca7bee3 100644
--- a/media/test/data/test-25fps.h264.md5
+++ b/media/test/data/test-25fps.h264.md5
@@ -16,6 +16,8 @@
 b55cda7d10c37104d8c49d27c2699e40
 # ARM - MediaTek
 ab9205ea7da8e00fefe1094d43542fb2
+# Intel - VA_FILTER_SCALING_DEFAULT
+27ddce017b884f8bbfa159ad180a71d2
 
 # TODO(llandwerlin): Remove the following hashes when the libva-intel-driver
 # is updated.
diff --git a/media/test/data/test-25fps.vp8.md5 b/media/test/data/test-25fps.vp8.md5
index 9b5d7917..4ad1331 100644
--- a/media/test/data/test-25fps.vp8.md5
+++ b/media/test/data/test-25fps.vp8.md5
@@ -6,6 +6,8 @@
 6232c99cc54aeccb43aff7a7f9daa6ab
 # Intel - BDW
 bea8039e6921d930bb1c86185f62b1b0
+# Intel - VA_FILTER_SCALING_DEFAULT
+32a3c4257dac03df92a5c7593ee7e31f
 
 # TODO(llandwerlin): Remove the following hash when the libva-intel-driver
 # is updated.
diff --git a/media/test/data/test-25fps.vp9.md5 b/media/test/data/test-25fps.vp9.md5
index baacaed..5050b02 100644
--- a/media/test/data/test-25fps.vp9.md5
+++ b/media/test/data/test-25fps.vp9.md5
@@ -11,3 +11,5 @@
 f85e57dadd517b171109580a6ebd9b34
 #Intel - SKL
 67dd7a5db69123d325485a6ebecbd6c0
+# Intel - VA_FILTER_SCALING_DEFAULT
+8a3b6a803530a9eb3dc3ddfd0b02dc38
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/backdrop-filter-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/backdrop-filter-interpolation-expected.txt
deleted file mode 100644
index 1d49e70..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/backdrop-filter-interpolation-expected.txt
+++ /dev/null
@@ -1,427 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(5deg)] 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0) is [hue-rotate(10deg)] 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.3) is [hue-rotate(13deg)] 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.6) is [hue-rotate(16deg)] 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1.5) is [hue-rotate(25deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(35deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(27deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(24deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(15deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (-0.5) is [hue-rotate(-90deg) blur(4px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0) is [hue-rotate(0deg) blur(6px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.25) is [hue-rotate(45deg) blur(7px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.5) is [hue-rotate(90deg) blur(8px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1) is [hue-rotate(180deg) blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1.5) is [hue-rotate(270deg) blur(12px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (-0.5) is [hue-rotate(75deg) blur(15.1181px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0) is [hue-rotate(80deg) blur(22.6772px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.25) is [hue-rotate(82.5deg) blur(26.4567px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.5) is [hue-rotate(85deg) blur(30.2362px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1) is [hue-rotate(90deg) blur(37.7953px)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1.5) is [hue-rotate(95deg) blur(45.3543px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (-0.3) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.3) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.5) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.6) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1.5) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (-0.5) is [opacity(1) hue-rotate(-90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.25) is [opacity(0.875) hue-rotate(45deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.5) is [opacity(0.75) hue-rotate(90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1) is [opacity(0.5) hue-rotate(180deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1.5) is [opacity(0.25) hue-rotate(270deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (-0.5) is [blur(4px) hue-rotate(-90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0) is [blur(6px)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.25) is [blur(7px) hue-rotate(45deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.5) is [blur(8px) hue-rotate(90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1) is [blur(10px) hue-rotate(180deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1.5) is [blur(12px) hue-rotate(270deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (-0.5) is [hue-rotate(-90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.25) is [hue-rotate(45deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1.5) is [hue-rotate(270deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (-0.5) is [hue-rotate(270deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.25) is [hue-rotate(135deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1.5) is [hue-rotate(-90deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [blur(10px)] at (-1) is [blur(0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [blur(10px)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [blur(10px)] at (0.5) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [blur(10px)] at (1.5) is [blur(15px)] 
-PASS CSS Transitions: property <backdrop-filter> from [brightness(0)] to [none] at (-1) is [brightness(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [brightness(0)] to [none] at (0) is [brightness(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [brightness(0)] to [none] at (0.5) is [brightness(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [brightness(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [brightness(0)] to [none] at (1.5) is [brightness(1.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [contrast(0)] to [none] at (-1) is [contrast(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [contrast(0)] to [none] at (0) is [contrast(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [contrast(0)] to [none] at (0.5) is [contrast(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [contrast(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [contrast(0)] to [none] at (1.5) is [contrast(1.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgba(0, 0, 0, 0) -20px -10px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0) is [none] 
-FAIL CSS Transitions: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgba(0, 127, 0, 0.5) 10px 5px 0px)] assert_equals: expected "drop - shadow ( rgba ( 0 , 128 , 0 , 0.5 ) 10px 5px 0px ) " but got "drop - shadow ( rgba ( 0 , 127 , 0 , 0.5 ) 10px 5px 0px ) "
-PASS CSS Transitions: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 192, 0) 30px 15px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgb(255, 255, 255) -20px -10px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0) is [drop-shadow(rgb(255, 255, 255) 0px 0px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgb(128, 192, 128) 10px 5px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 65, 0) 30px 15px 0px)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [grayscale(1)] at (-1) is [grayscale(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [grayscale(1)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [grayscale(1)] at (0.5) is [grayscale(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [grayscale(1)] at (1) is [grayscale(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [grayscale(1)] at (1.5) is [grayscale(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (-1) is [hue-rotate(-360deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0.5) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1) is [hue-rotate(360deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1.5) is [hue-rotate(540deg)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [invert(1)] at (-1) is [invert(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [invert(1)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [invert(1)] at (0.5) is [invert(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [invert(1)] at (1) is [invert(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [invert(1)] at (1.5) is [invert(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [opacity(0)] to [none] at (-1) is [opacity(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [opacity(0)] to [none] at (0) is [opacity(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [opacity(0)] to [none] at (0.5) is [opacity(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [opacity(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [opacity(0)] to [none] at (1.5) is [opacity(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [saturate(0)] to [none] at (-1) is [saturate(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [saturate(0)] to [none] at (0) is [saturate(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [saturate(0)] to [none] at (0.5) is [saturate(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [saturate(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [saturate(0)] to [none] at (1.5) is [saturate(1.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [sepia(1)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [none] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (-0.3) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.3) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.5) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.6) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1.5) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (-0.3) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.3) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.5) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.6) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1.5) is [blur(5px)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [sepia(1)] at (0) is [none] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Transitions: property <backdrop-filter> from [initial] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(5deg)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0) is [hue-rotate(10deg)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.3) is [hue-rotate(13deg)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.6) is [hue-rotate(16deg)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1.5) is [hue-rotate(25deg)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(35deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(27deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(24deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(15deg)] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (-0.5) is [hue-rotate(-90deg) blur(4px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0) is [hue-rotate(0deg) blur(6px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.25) is [hue-rotate(45deg) blur(7px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.5) is [hue-rotate(90deg) blur(8px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1) is [hue-rotate(180deg) blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1.5) is [hue-rotate(270deg) blur(12px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (-0.5) is [hue-rotate(75deg) blur(15.1181px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0) is [hue-rotate(80deg) blur(22.6772px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.25) is [hue-rotate(82.5deg) blur(26.4567px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.5) is [hue-rotate(85deg) blur(30.2362px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1) is [hue-rotate(90deg) blur(37.7953px)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1.5) is [hue-rotate(95deg) blur(45.3543px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (-0.3) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.3) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.5) is [blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.6) is [blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1.5) is [blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (-0.5) is [opacity(1) hue-rotate(-90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.25) is [opacity(0.875) hue-rotate(45deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.5) is [opacity(0.75) hue-rotate(90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1) is [opacity(0.5) hue-rotate(180deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1.5) is [opacity(0.25) hue-rotate(270deg)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (-0.5) is [blur(4px) hue-rotate(-90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0) is [blur(6px)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.25) is [blur(7px) hue-rotate(45deg)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.5) is [blur(8px) hue-rotate(90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1) is [blur(10px) hue-rotate(180deg)] 
-PASS CSS Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1.5) is [blur(12px) hue-rotate(270deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (-0.5) is [hue-rotate(-90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.25) is [hue-rotate(45deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1.5) is [hue-rotate(270deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (-0.5) is [hue-rotate(270deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.25) is [hue-rotate(135deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1.5) is [hue-rotate(-90deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [blur(10px)] at (-1) is [blur(0px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [blur(10px)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [blur(10px)] at (0.5) is [blur(5px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [blur(10px)] at (1.5) is [blur(15px)] 
-PASS CSS Animations: property <backdrop-filter> from [brightness(0)] to [none] at (-1) is [brightness(0)] 
-PASS CSS Animations: property <backdrop-filter> from [brightness(0)] to [none] at (0) is [brightness(0)] 
-PASS CSS Animations: property <backdrop-filter> from [brightness(0)] to [none] at (0.5) is [brightness(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [brightness(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [brightness(0)] to [none] at (1.5) is [brightness(1.5)] 
-PASS CSS Animations: property <backdrop-filter> from [contrast(0)] to [none] at (-1) is [contrast(0)] 
-PASS CSS Animations: property <backdrop-filter> from [contrast(0)] to [none] at (0) is [contrast(0)] 
-PASS CSS Animations: property <backdrop-filter> from [contrast(0)] to [none] at (0.5) is [contrast(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [contrast(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [contrast(0)] to [none] at (1.5) is [contrast(1.5)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgba(0, 0, 0, 0) -20px -10px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgba(0, 128, 0, 0.5) 10px 5px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 192, 0) 30px 15px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgb(255, 255, 255) -20px -10px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0) is [drop-shadow(rgb(255, 255, 255) 0px 0px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgb(128, 192, 128) 10px 5px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 65, 0) 30px 15px 0px)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (-1) is [grayscale(0)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (0.5) is [grayscale(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (1) is [grayscale(1)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (1.5) is [grayscale(1)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (-1) is [hue-rotate(-360deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0.5) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1) is [hue-rotate(360deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1.5) is [hue-rotate(540deg)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [invert(1)] at (-1) is [invert(0)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [invert(1)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [invert(1)] at (0.5) is [invert(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [invert(1)] at (1) is [invert(1)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [invert(1)] at (1.5) is [invert(1)] 
-PASS CSS Animations: property <backdrop-filter> from [opacity(0)] to [none] at (-1) is [opacity(0)] 
-PASS CSS Animations: property <backdrop-filter> from [opacity(0)] to [none] at (0) is [opacity(0)] 
-PASS CSS Animations: property <backdrop-filter> from [opacity(0)] to [none] at (0.5) is [opacity(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [opacity(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [opacity(0)] to [none] at (1.5) is [opacity(1)] 
-PASS CSS Animations: property <backdrop-filter> from [saturate(0)] to [none] at (-1) is [saturate(0)] 
-PASS CSS Animations: property <backdrop-filter> from [saturate(0)] to [none] at (0) is [saturate(0)] 
-PASS CSS Animations: property <backdrop-filter> from [saturate(0)] to [none] at (0.5) is [saturate(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [saturate(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [saturate(0)] to [none] at (1.5) is [saturate(1.5)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [sepia(1)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Animations: property <backdrop-filter> from [none] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (-0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.5) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.6) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1.5) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (-0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.5) is [blur(5px)] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.6) is [blur(5px)] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1) is [blur(5px)] 
-PASS CSS Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1.5) is [blur(5px)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (0) is [none] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(5deg)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0) is [hue-rotate(10deg)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.3) is [hue-rotate(13deg)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (0.6) is [hue-rotate(16deg)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS Web Animations: property <backdrop-filter> from neutral to [hue-rotate(20deg)] at (1.5) is [hue-rotate(25deg)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(35deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0) is [hue-rotate(30deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(27deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(24deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS Web Animations: property <backdrop-filter> from [inherit] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(15deg)] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS Web Animations: property <backdrop-filter> from [unset] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (-0.5) is [hue-rotate(-90deg) blur(4px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0) is [hue-rotate(0deg) blur(6px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.25) is [hue-rotate(45deg) blur(7px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.5) is [hue-rotate(90deg) blur(8px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1) is [hue-rotate(180deg) blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1.5) is [hue-rotate(270deg) blur(12px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (-0.5) is [hue-rotate(75deg) blur(15.1181px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0) is [hue-rotate(80deg) blur(22.6772px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.25) is [hue-rotate(82.5deg) blur(26.4567px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.5) is [hue-rotate(85deg) blur(30.2362px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1) is [hue-rotate(90deg) blur(37.7953px)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1.5) is [hue-rotate(95deg) blur(45.3543px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (-0.3) is [grayscale(0) blur(0px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0) is [grayscale(0) blur(0px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.3) is [grayscale(0) blur(0px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.5) is [blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.6) is [blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1) is [blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1.5) is [blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (-0.5) is [opacity(1) hue-rotate(-90deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.25) is [opacity(0.875) hue-rotate(45deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.5) is [opacity(0.75) hue-rotate(90deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1) is [opacity(0.5) hue-rotate(180deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1.5) is [opacity(0.25) hue-rotate(270deg)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (-0.5) is [blur(4px) hue-rotate(-90deg)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0) is [blur(6px)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.25) is [blur(7px) hue-rotate(45deg)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.5) is [blur(8px) hue-rotate(90deg)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1) is [blur(10px) hue-rotate(180deg)] 
-PASS Web Animations: property <backdrop-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1.5) is [blur(12px) hue-rotate(270deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (-0.5) is [hue-rotate(-90deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.25) is [hue-rotate(45deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (0.5) is [hue-rotate(90deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1) is [hue-rotate(180deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(180deg)] at (1.5) is [hue-rotate(270deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (-0.5) is [hue-rotate(270deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0) is [hue-rotate(180deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.25) is [hue-rotate(135deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (0.5) is [hue-rotate(90deg)] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [hue-rotate(180deg)] to [none] at (1.5) is [hue-rotate(-90deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [blur(10px)] at (-1) is [blur(0px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [blur(10px)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [blur(10px)] at (0.5) is [blur(5px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [blur(10px)] at (1) is [blur(10px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [blur(10px)] at (1.5) is [blur(15px)] 
-PASS Web Animations: property <backdrop-filter> from [brightness(0)] to [none] at (-1) is [brightness(0)] 
-PASS Web Animations: property <backdrop-filter> from [brightness(0)] to [none] at (0) is [brightness(0)] 
-PASS Web Animations: property <backdrop-filter> from [brightness(0)] to [none] at (0.5) is [brightness(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [brightness(0)] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [brightness(0)] to [none] at (1.5) is [brightness(1.5)] 
-PASS Web Animations: property <backdrop-filter> from [contrast(0)] to [none] at (-1) is [contrast(0)] 
-PASS Web Animations: property <backdrop-filter> from [contrast(0)] to [none] at (0) is [contrast(0)] 
-PASS Web Animations: property <backdrop-filter> from [contrast(0)] to [none] at (0.5) is [contrast(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [contrast(0)] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [contrast(0)] to [none] at (1.5) is [contrast(1.5)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgba(0, 0, 0, 0) -20px -10px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgba(0, 128, 0, 0.5) 10px 5px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 192, 0) 30px 15px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgb(255, 255, 255) -20px -10px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0) is [drop-shadow(rgb(255, 255, 255) 0px 0px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgb(128, 192, 128) 10px 5px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 65, 0) 30px 15px 0px)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (-1) is [grayscale(0)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (0.5) is [grayscale(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (1) is [grayscale(1)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [grayscale(1)] at (1.5) is [grayscale(1)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (-1) is [hue-rotate(-360deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (0.5) is [hue-rotate(180deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1) is [hue-rotate(360deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [hue-rotate(360deg)] at (1.5) is [hue-rotate(540deg)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [invert(1)] at (-1) is [invert(0)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [invert(1)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [invert(1)] at (0.5) is [invert(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [invert(1)] at (1) is [invert(1)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [invert(1)] at (1.5) is [invert(1)] 
-PASS Web Animations: property <backdrop-filter> from [opacity(0)] to [none] at (-1) is [opacity(0)] 
-PASS Web Animations: property <backdrop-filter> from [opacity(0)] to [none] at (0) is [opacity(0)] 
-PASS Web Animations: property <backdrop-filter> from [opacity(0)] to [none] at (0.5) is [opacity(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [opacity(0)] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [opacity(0)] to [none] at (1.5) is [opacity(1)] 
-PASS Web Animations: property <backdrop-filter> from [saturate(0)] to [none] at (-1) is [saturate(0)] 
-PASS Web Animations: property <backdrop-filter> from [saturate(0)] to [none] at (0) is [saturate(0)] 
-PASS Web Animations: property <backdrop-filter> from [saturate(0)] to [none] at (0.5) is [saturate(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [saturate(0)] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [saturate(0)] to [none] at (1.5) is [saturate(1.5)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [sepia(1)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [none] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [sepia(1)] at (1) is [sepia(1)] 
-PASS Web Animations: property <backdrop-filter> from [none] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (-0.3) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.3) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.5) is [none] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (0.6) is [none] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1) is [none] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [none] at (1.5) is [none] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (-0.3) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.3) is [url("#svgfilter")] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.5) is [blur(5px)] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (0.6) is [blur(5px)] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1) is [blur(5px)] 
-PASS Web Animations: property <backdrop-filter> from [url("#svgfilter")] to [blur(5px)] at (1.5) is [blur(5px)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (0) is [none] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (1) is [sepia(1)] 
-PASS Web Animations: property <backdrop-filter> from [initial] to [sepia(1)] at (1.5) is [sepia(1)] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/border-image-source-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/border-image-source-interpolation-expected.txt
deleted file mode 100644
index d049e82..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/border-image-source-interpolation-expected.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.6) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../blue-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0) is [url(file:///.../blue-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.3)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.5)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.6)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-FAIL CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 100.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 100.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Transitions: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-FAIL CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-PASS CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Transitions: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0) is [none] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.6) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../blue-100.png)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0) is [url(file:///.../blue-100.png)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.3)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.5)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.6)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(-45deg, red, yellow)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(-45deg, red, yellow)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from neutral to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (-0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0) is [none] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.5) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (0.6) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [initial] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../blue-100.png)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0) is [url(file:///.../blue-100.png)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [inherit] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [none] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.3)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.5)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.6)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [url(file:///.../green-100.png)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS Web Animations: property <border-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(-45deg, red, yellow)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(-45deg, red, yellow)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS Web Animations: property <border-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/box-shadow-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/box-shadow-interpolation-expected.txt
deleted file mode 100644
index 4dc5acf..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/box-shadow-interpolation-expected.txt
+++ /dev/null
@@ -1,187 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 7px 33px 7px 33px] 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 10px 30px 10px 30px] 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 13px 27px 13px 27px] 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 16px 24px 16px 24px] 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 25px 15px 25px 15px] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Transitions: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 33px 7px 33px 7px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 30px 10px 30px 10px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 27px 13px 27px 13px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 24px 16px 24px 16px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Transitions: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 15px 25px 15px 25px] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Transitions: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 0px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 0px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px inset] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.3) is [rgb(0, 38, 0) 6px 4px 11px 3px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.6) is [rgb(0, 77, 0) -3px -2px 17px 0px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1) is [rgb(0, 128, 0) -15px -10px 25px -4px] 
-PASS CSS Transitions: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1.5) is [rgb(0, 192, 0) -30px -20px 35px -9px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px 10px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (-0.3) is [rgba(255, 255, 0, 0.65) 13px 26px 0px 0px, rgb(0, 166, 0) 6.5px 39px 0px 0px inset] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0) is [rgba(255, 255, 0, 0.5) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 30px 0px 0px inset] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.3) is [rgba(255, 255, 0, 0.353) 7px 14px 0px 0px, rgba(0, 128, 0, 0.7) 3.5px 21px 0px 0px inset] 
-FAIL CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.6) is [rgba(255, 255, 0, 0.2) 4px 8px 0px 0px, rgba(0, 127, 0, 0.4) 2px 12px 0px 0px inset] assert_equals: expected "rgba ( 255 , 255 , 0 , 0.2 ) 4px 8px 0px 0px , rgba ( 0 , 128 , 0 , 0.4 ) 2px 12px 0px 0px inset " but got "rgba ( 255 , 255 , 0 , 0.2 ) 4px 8px 0px 0px , rgba ( 0 , 127 , 0 , 0.4 ) 2px 12px 0px 0px inset "
-PASS CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1) is [none] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1.5) is [rgba(0, 0, 0, 0) -5px -10px 0px 0px, rgba(0, 0, 0, 0) -2.5px -15px 0px 0px inset] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (-0.3) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.3) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.6) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Transitions: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 7px 33px 7px 33px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 10px 30px 10px 30px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 13px 27px 13px 27px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 16px 24px 16px 24px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 25px 15px 25px 15px] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 33px 7px 33px 7px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 30px 10px 30px 10px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 27px 13px 27px 13px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 24px 16px 24px 16px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 15px 25px 15px 25px] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS CSS Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 4.44089e-16px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 4.44089e-16px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px inset] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.3) is [rgb(0, 38, 0) 6px 4px 11px 3px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.6) is [rgb(0, 77, 0) -3px -2px 17px 4.44089e-16px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1) is [rgb(0, 128, 0) -15px -10px 25px -4px] 
-PASS CSS Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1.5) is [rgb(0, 192, 0) -30px -20px 35px -9px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px 10px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (-0.3) is [rgba(255, 255, 0, 0.65) 13px 26px 0px 0px, rgb(0, 166, 0) 6.5px 39px 0px 0px inset] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0) is [rgba(255, 255, 0, 0.5) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 30px 0px 0px inset] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.3) is [rgba(255, 255, 0, 0.353) 7px 14px 0px 0px, rgba(0, 128, 0, 0.7) 3.5px 21px 0px 0px inset] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.6) is [rgba(255, 255, 0, 0.2) 4px 8px 0px 0px, rgba(0, 128, 0, 0.4) 2px 12px 0px 0px inset] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1) is [none] 
-PASS CSS Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1.5) is [rgba(0, 0, 0, 0) -5px -10px 0px 0px, rgba(0, 0, 0, 0) -2.5px -15px 0px 0px inset] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (-0.3) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.3) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.6) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS CSS Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 7px 33px 7px 33px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 10px 30px 10px 30px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 13px 27px 13px 27px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 16px 24px 16px 24px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS Web Animations: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 25px 15px 25px 15px] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS Web Animations: property <box-shadow> from [initial] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (-0.3) is [rgb(0, 0, 0) 33px 7px 33px 7px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0) is [rgb(0, 0, 0) 30px 10px 30px 10px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.3) is [rgb(0, 0, 0) 27px 13px 27px 13px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (0.6) is [rgb(0, 0, 0) 24px 16px 24px 16px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS Web Animations: property <box-shadow> from [inherit] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 15px 25px 15px 25px] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px -6px] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0) is [none] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.3) is [rgba(0, 0, 0, 0.3) 6px 6px 6px 6px] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (0.6) is [rgba(0, 0, 0, 0.6) 12px 12px 12px 12px] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1) is [rgb(0, 0, 0) 20px 20px 20px 20px] 
-PASS Web Animations: property <box-shadow> from [unset] to [20px 20px 20px 20px black] at (1.5) is [rgb(0, 0, 0) 30px 30px 30px 30px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 4.44089e-16px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px 3px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px 4.44089e-16px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1) is [rgb(255, 165, 0) -15px -10px 25px -4px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black inset] to [-15px -10px 25px -4px orange inset] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px -9px inset] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px 9px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0) is [rgb(0, 0, 0) 15px 10px 5px 6px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.3) is [rgb(0, 38, 0) 6px 4px 11px 3px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (0.6) is [rgb(0, 77, 0) -3px -2px 17px 4.44089e-16px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1) is [rgb(0, 128, 0) -15px -10px 25px -4px] 
-PASS Web Animations: property <box-shadow> from [15px 10px 5px 6px black] to [-15px -10px 25px -4px] at (1.5) is [rgb(0, 192, 0) -30px -20px 35px -9px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 10px 10px 10px black] to [10px 10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px 10px] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (-0.3) is [rgba(255, 255, 0, 0.65) 13px 26px 0px 0px, rgb(0, 166, 0) 6.5px 39px 0px 0px inset] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0) is [rgba(255, 255, 0, 0.5) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 30px 0px 0px inset] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.3) is [rgba(255, 255, 0, 0.353) 7px 14px 0px 0px, rgba(0, 128, 0, 0.7) 3.5px 21px 0px 0px inset] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.6) is [rgba(255, 255, 0, 0.2) 4px 8px 0px 0px, rgba(0, 128, 0, 0.4) 2px 12px 0px 0px inset] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1) is [none] 
-PASS Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1.5) is [rgba(0, 0, 0, 0) -5px -10px 0px 0px, rgba(0, 0, 0, 0) -2.5px -15px 0px 0px inset] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (-0.3) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.3) is [rgb(255, 255, 0) 10px 20px 0px 0px, rgb(0, 128, 0) 5px 10px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.6) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-PASS Web Animations: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (1.5) is [rgb(0, 128, 0) 5px 10px 0px 0px inset, rgb(0, 0, 255) 15px 20px 0px 0px] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/filter-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/filter-interpolation-expected.txt
deleted file mode 100644
index 44bd7f128..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/filter-interpolation-expected.txt
+++ /dev/null
@@ -1,286 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(5deg)] 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0) is [hue-rotate(10deg)] 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0.3) is [hue-rotate(13deg)] 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0.6) is [hue-rotate(16deg)] 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (1.5) is [hue-rotate(25deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(35deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(27deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(24deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(15deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (-0.5) is [hue-rotate(-90deg) blur(4px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0) is [hue-rotate(0deg) blur(6px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.25) is [hue-rotate(45deg) blur(7px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.5) is [hue-rotate(90deg) blur(8px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1) is [hue-rotate(180deg) blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1.5) is [hue-rotate(270deg) blur(12px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (-0.5) is [hue-rotate(75deg) blur(15.1181px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0) is [hue-rotate(80deg) blur(22.6772px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.25) is [hue-rotate(82.5deg) blur(26.4567px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.5) is [hue-rotate(85deg) blur(30.2362px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1) is [hue-rotate(90deg) blur(37.7953px)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1.5) is [hue-rotate(95deg) blur(45.3543px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (-0.3) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.3) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.5) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.6) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1.5) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (-0.5) is [opacity(1) hue-rotate(-90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.25) is [opacity(0.875) hue-rotate(45deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.5) is [opacity(0.75) hue-rotate(90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1) is [opacity(0.5) hue-rotate(180deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1.5) is [opacity(0.25) hue-rotate(270deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (-0.5) is [blur(4px) hue-rotate(-90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0) is [blur(6px)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.25) is [blur(7px) hue-rotate(45deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.5) is [blur(8px) hue-rotate(90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1) is [blur(10px) hue-rotate(180deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1.5) is [blur(12px) hue-rotate(270deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (-0.5) is [hue-rotate(-90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0.25) is [hue-rotate(45deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (1) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (1.5) is [hue-rotate(270deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (-0.5) is [hue-rotate(270deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0.25) is [hue-rotate(135deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (1.5) is [hue-rotate(-90deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [blur(10px)] at (-1) is [blur(0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [blur(10px)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [blur(10px)] at (0.5) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [blur(10px)] at (1.5) is [blur(15px)] 
-PASS CSS Transitions: property <-webkit-filter> from [brightness(0)] to [none] at (-1) is [brightness(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [brightness(0)] to [none] at (0) is [brightness(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [brightness(0)] to [none] at (0.5) is [brightness(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [brightness(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [brightness(0)] to [none] at (1.5) is [brightness(1.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [contrast(0)] to [none] at (-1) is [contrast(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [contrast(0)] to [none] at (0) is [contrast(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [contrast(0)] to [none] at (0.5) is [contrast(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [contrast(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [contrast(0)] to [none] at (1.5) is [contrast(1.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgba(0, 0, 0, 0) -20px -10px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (0) is [none] 
-FAIL CSS Transitions: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgba(0, 127, 0, 0.5) 10px 5px 0px)] assert_equals: expected "drop - shadow ( rgba ( 0 , 128 , 0 , 0.5 ) 10px 5px 0px ) " but got "drop - shadow ( rgba ( 0 , 127 , 0 , 0.5 ) 10px 5px 0px ) "
-PASS CSS Transitions: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 192, 0) 30px 15px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgb(255, 255, 255) -20px -10px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0) is [drop-shadow(rgb(255, 255, 255) 0px 0px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgb(128, 192, 128) 10px 5px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 65, 0) 30px 15px 0px)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [grayscale(1)] at (-1) is [grayscale(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [grayscale(1)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [grayscale(1)] at (0.5) is [grayscale(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [grayscale(1)] at (1) is [grayscale(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [grayscale(1)] at (1.5) is [grayscale(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (-1) is [hue-rotate(-360deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (0.5) is [hue-rotate(180deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (1) is [hue-rotate(360deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (1.5) is [hue-rotate(540deg)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [invert(1)] at (-1) is [invert(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [invert(1)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [invert(1)] at (0.5) is [invert(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [invert(1)] at (1) is [invert(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [invert(1)] at (1.5) is [invert(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [opacity(0)] to [none] at (-1) is [opacity(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [opacity(0)] to [none] at (0) is [opacity(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [opacity(0)] to [none] at (0.5) is [opacity(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [opacity(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [opacity(0)] to [none] at (1.5) is [opacity(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [saturate(0)] to [none] at (-1) is [saturate(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [saturate(0)] to [none] at (0) is [saturate(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [saturate(0)] to [none] at (0.5) is [saturate(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [saturate(0)] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [saturate(0)] to [none] at (1.5) is [saturate(1.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [sepia(1)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [none] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (-0.3) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.3) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.5) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.6) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (1) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [none] at (1.5) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (-0.3) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.3) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.5) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.6) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (1) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (1.5) is [blur(5px)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [sepia(1)] at (0) is [none] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Transitions: property <-webkit-filter> from [initial] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(5deg)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0) is [hue-rotate(10deg)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0.3) is [hue-rotate(13deg)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (0.6) is [hue-rotate(16deg)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <-webkit-filter> from neutral to [hue-rotate(20deg)] at (1.5) is [hue-rotate(25deg)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(35deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(27deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(24deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <-webkit-filter> from [inherit] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(15deg)] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (-0.5) is [hue-rotate(-10deg)] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0.3) is [hue-rotate(6deg)] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (0.6) is [hue-rotate(12deg)] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (1) is [hue-rotate(20deg)] 
-PASS CSS Animations: property <-webkit-filter> from [unset] to [hue-rotate(20deg)] at (1.5) is [hue-rotate(30deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (-0.5) is [hue-rotate(-90deg) blur(4px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0) is [hue-rotate(0deg) blur(6px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.25) is [hue-rotate(45deg) blur(7px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (0.5) is [hue-rotate(90deg) blur(8px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1) is [hue-rotate(180deg) blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(0deg) blur(6px)] to [hue-rotate(180deg) blur(10px)] at (1.5) is [hue-rotate(270deg) blur(12px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (-0.5) is [hue-rotate(75deg) blur(15.1181px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0) is [hue-rotate(80deg) blur(22.6772px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.25) is [hue-rotate(82.5deg) blur(26.4567px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (0.5) is [hue-rotate(85deg) blur(30.2362px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1) is [hue-rotate(90deg) blur(37.7953px)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(80deg) blur(6mm)] to [hue-rotate(100grad) blur(1cm)] at (1.5) is [hue-rotate(95deg) blur(45.3543px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (-0.3) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.3) is [grayscale(0) blur(0px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.5) is [blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (0.6) is [blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [grayscale(0) blur(0px)] to [blur(10px)] at (1.5) is [blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (-0.5) is [opacity(1) hue-rotate(-90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.25) is [opacity(0.875) hue-rotate(45deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (0.5) is [opacity(0.75) hue-rotate(90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1) is [opacity(0.5) hue-rotate(180deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [opacity(0.5) hue-rotate(180deg)] at (1.5) is [opacity(0.25) hue-rotate(270deg)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (-0.5) is [blur(4px) hue-rotate(-90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0) is [blur(6px)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.25) is [blur(7px) hue-rotate(45deg)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (0.5) is [blur(8px) hue-rotate(90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1) is [blur(10px) hue-rotate(180deg)] 
-PASS CSS Animations: property <-webkit-filter> from [blur(6px)] to [blur(10px) hue-rotate(180deg)] at (1.5) is [blur(12px) hue-rotate(270deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (-0.5) is [hue-rotate(-90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0.25) is [hue-rotate(45deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (1) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(180deg)] at (1.5) is [hue-rotate(270deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (-0.5) is [hue-rotate(270deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0.25) is [hue-rotate(135deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (0.5) is [hue-rotate(90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [hue-rotate(180deg)] to [none] at (1.5) is [hue-rotate(-90deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [blur(10px)] at (-1) is [blur(0px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [blur(10px)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [blur(10px)] at (0.5) is [blur(5px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [blur(10px)] at (1) is [blur(10px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [blur(10px)] at (1.5) is [blur(15px)] 
-PASS CSS Animations: property <-webkit-filter> from [brightness(0)] to [none] at (-1) is [brightness(0)] 
-PASS CSS Animations: property <-webkit-filter> from [brightness(0)] to [none] at (0) is [brightness(0)] 
-PASS CSS Animations: property <-webkit-filter> from [brightness(0)] to [none] at (0.5) is [brightness(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [brightness(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [brightness(0)] to [none] at (1.5) is [brightness(1.5)] 
-PASS CSS Animations: property <-webkit-filter> from [contrast(0)] to [none] at (-1) is [contrast(0)] 
-PASS CSS Animations: property <-webkit-filter> from [contrast(0)] to [none] at (0) is [contrast(0)] 
-PASS CSS Animations: property <-webkit-filter> from [contrast(0)] to [none] at (0.5) is [contrast(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [contrast(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [contrast(0)] to [none] at (1.5) is [contrast(1.5)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgba(0, 0, 0, 0) -20px -10px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgba(0, 128, 0, 0.5) 10px 5px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 192, 0) 30px 15px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (-1) is [drop-shadow(rgb(255, 255, 255) -20px -10px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0) is [drop-shadow(rgb(255, 255, 255) 0px 0px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (0.5) is [drop-shadow(rgb(128, 192, 128) 10px 5px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1) is [drop-shadow(rgb(0, 128, 0) 20px 10px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [drop-shadow(0px 0px 0px currentcolor)] to [drop-shadow(20px 10px green)] at (1.5) is [drop-shadow(rgb(0, 65, 0) 30px 15px 0px)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [grayscale(1)] at (-1) is [grayscale(0)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [grayscale(1)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [grayscale(1)] at (0.5) is [grayscale(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [grayscale(1)] at (1) is [grayscale(1)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [grayscale(1)] at (1.5) is [grayscale(1)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (-1) is [hue-rotate(-360deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (0.5) is [hue-rotate(180deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (1) is [hue-rotate(360deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [hue-rotate(360deg)] at (1.5) is [hue-rotate(540deg)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [invert(1)] at (-1) is [invert(0)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [invert(1)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [invert(1)] at (0.5) is [invert(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [invert(1)] at (1) is [invert(1)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [invert(1)] at (1.5) is [invert(1)] 
-PASS CSS Animations: property <-webkit-filter> from [opacity(0)] to [none] at (-1) is [opacity(0)] 
-PASS CSS Animations: property <-webkit-filter> from [opacity(0)] to [none] at (0) is [opacity(0)] 
-PASS CSS Animations: property <-webkit-filter> from [opacity(0)] to [none] at (0.5) is [opacity(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [opacity(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [opacity(0)] to [none] at (1.5) is [opacity(1)] 
-PASS CSS Animations: property <-webkit-filter> from [saturate(0)] to [none] at (-1) is [saturate(0)] 
-PASS CSS Animations: property <-webkit-filter> from [saturate(0)] to [none] at (0) is [saturate(0)] 
-PASS CSS Animations: property <-webkit-filter> from [saturate(0)] to [none] at (0.5) is [saturate(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [saturate(0)] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [saturate(0)] to [none] at (1.5) is [saturate(1.5)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [sepia(1)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Animations: property <-webkit-filter> from [none] to [sepia(1)] at (1.5) is [sepia(1)] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (-0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.5) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (0.6) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (1) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [none] at (1.5) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (-0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.3) is [url("#svgfilter")] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.5) is [blur(5px)] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (0.6) is [blur(5px)] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (1) is [blur(5px)] 
-PASS CSS Animations: property <-webkit-filter> from [url("#svgfilter")] to [blur(5px)] at (1.5) is [blur(5px)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [sepia(1)] at (-1) is [sepia(0)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [sepia(1)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [sepia(1)] at (0.5) is [sepia(0.5)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [sepia(1)] at (1) is [sepia(1)] 
-PASS CSS Animations: property <-webkit-filter> from [initial] to [sepia(1)] at (1.5) is [sepia(1)] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/list-style-image-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/list-style-image-interpolation-expected.txt
index c694c80..daa2a8f 100644
--- a/third_party/WebKit/LayoutTests/animations/interpolation/list-style-image-interpolation-expected.txt
+++ b/third_party/WebKit/LayoutTests/animations/interpolation/list-style-image-interpolation-expected.txt
@@ -49,18 +49,18 @@
 PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [url(../resources/stripes-20.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-20.png), url(file:///.../stripes-20.png), 0.6)] 
 PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [url(../resources/stripes-20.png)] at (1) is [url(file:///.../stripes-20.png)] 
 PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [url(../resources/stripes-20.png)] at (1.5) is [url(file:///.../stripes-20.png)] 
-FAIL CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 20.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 20.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 20.png ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 20.png ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 20.png ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
+PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [url(file:///.../green-20.png)] 
+PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [url(file:///.../green-20.png)] 
+PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-20.png), linear-gradient(45deg, blue, orange), 0.3)] 
+PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-20.png), linear-gradient(45deg, blue, orange), 0.5)] 
+PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-20.png), linear-gradient(45deg, blue, orange), 0.6)] 
 PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
 PASS CSS Transitions: property <list-style-image> from [url(../resources/green-20.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-FAIL CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
+PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(-45deg, red, yellow)] 
+PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(-45deg, red, yellow)] 
+PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.3)] 
+PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.5)] 
+PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.6)] 
 PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
 PASS CSS Transitions: property <list-style-image> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
 PASS CSS Animations: property <list-style-image> from neutral to [url(../resources/stripes-20.png)] at (-0.3) is [url(file:///.../green-20.png)] 
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt
deleted file mode 100644
index a8a01b3..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt
+++ /dev/null
@@ -1,574 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (-0.3) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.3) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.5) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.6) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1) is [none] 
-PASS CSS Transitions: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1.5) is [none] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] 
-PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] 
-PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 -2.98023e-7 10 1 0 20 30')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 -2.98023e-7 10 1 0 20 30')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] 
-PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] 
-FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 160 20 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 - 180 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 160 20 Z ' ) "
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 220 140 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 - 60 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 220 140 Z ' ) "
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')] 
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] 
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')] 
-FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z ' ) "
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z ' ) "
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('m -30 -20 l 20 30 Z l 82 88 Z m 102 104 l 90 60 Z t 54 136')] assert_equals: expected "path ( ' M - 30 - 20 L - 10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220 ' ) " but got "path ( ' m - 30 - 20 l 20 30 Z l 82 88 Z m 102 104 l 90 60 Z t 54 136 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('m 30 40 l 20 30 Z l 34 46 Z m 54 68 l 90 60 Z t 78 112')] assert_equals: expected "path ( ' M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220 ' ) " but got "path ( ' m 30 40 l 20 30 Z l 34 46 Z m 54 68 l 90 60 Z t 78 112 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('m -30 -20 c 44 58 34 68 84 78 c 82 88 132 98 112 118')] assert_equals: expected "path ( ' M - 30 - 20 C 14 38 4 48 54 58 C 136 146 186 156 166 176 ' ) " but got "path ( ' m - 30 - 20 c 44 58 34 68 84 78 c 82 88 132 98 112 118 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('m 30 40 c 38 46 28 56 78 66 c 94 106 144 116 124 136')] assert_equals: expected "path ( ' M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242 ' ) " but got "path ( ' m 30 40 c 38 46 28 56 78 66 c 94 106 144 116 124 136 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('m -30 -20 q 34 68 44 58 q 116 90 106 100')] assert_equals: expected "path ( ' M - 30 - 20 Q 4 48 14 38 Q 130 128 120 138 ' ) " but got "path ( ' m - 30 - 20 q 34 68 44 58 q 116 90 106 100 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('m 30 40 q 28 56 38 46 q 92 60 82 70')] assert_equals: expected "path ( ' M 30 40 Q 58 96 68 86 Q 160 146 150 156 ' ) " but got "path ( ' m 30 40 q 28 56 38 46 q 92 60 82 70 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('m -30 -20 s 34 68 44 58 s 116 90 106 100')] assert_equals: expected "path ( ' M - 30 - 20 S 4 48 14 38 S 130 128 120 138 ' ) " but got "path ( ' m - 30 - 20 s 34 68 44 58 s 116 90 106 100 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('m 30 40 s 28 56 38 46 s 92 60 82 70')] assert_equals: expected "path ( ' M 30 40 S 58 96 68 86 S 160 146 150 156 ' ) " but got "path ( ' m 30 40 s 28 56 38 46 s 92 60 82 70 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('m -30 -20 h 34 v 48 h 22 v 36 l 90 104')] assert_equals: expected "path ( ' M - 30 - 20 H 4 V 28 H 26 V 64 L 116 168 ' ) " but got "path ( ' m - 30 - 20 h 34 v 48 h 22 v 36 l 90 104 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('m 30 40 h 28 v 36 h 64 v 72 l 60 68')] assert_equals: expected "path ( ' M 30 40 H 58 V 76 H 122 V 148 L 182 216 ' ) " but got "path ( ' m 30 40 h 28 v 36 h 64 v 72 l 60 68 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('m 6 16 a -10 -2.98023e-7 10 1 0 28 42 a 90 100 10 1 1 196 70')] assert_equals: expected "path ( ' M 6 16 A - 10 0 10 1 0 34 58 A 90 100 10 1 1 230 128 ' ) " but got "path ( ' m 6 16 a - 10 0 10 1 0 28 42 a 90 100 10 1 1 196 70 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] 
-FAIL CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('m 12 22 a 20 30 40 1 0 46 54 a 120 130 40 1 1 112 40')] assert_equals: expected "path ( ' M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116 ' ) " but got "path ( ' m 12 22 a 20 30 40 1 0 46 54 a 120 130 40 1 1 112 40 ' ) "
-PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] 
-PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 1 h 2')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 1 h 2')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 1 h 2')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (-0.3) is [path('M 1 2 L 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0) is [path('M 1 2 L 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.3) is [path('M 1 2 L 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.5) is [none] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.6) is [none] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1) is [none] 
-PASS CSS Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1.5) is [none] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 10 0 h 1')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 10 0 h 1')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 10 0 h 1')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] 
-PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4 Z')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] 
-PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] 
-PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] 
-PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] 
-PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] 
-PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] 
-PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] 
-PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] 
-PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] 
-PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 0 10 1 0 20 30')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] 
-PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 0 10 1 0 20 30')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] 
-PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] 
-PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] 
-PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] 
-PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] 
-PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -180 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 -60 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('M -30 -20 L -10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] 
-PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('M -30 -20 C 14 38 4 48 54 58 C 136 146 186 156 166 176')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] 
-PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('M -30 -20 Q 4 48 14 38 Q 130 128 120 138')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('M 30 40 Q 58 96 68 86 Q 160 146 150 156')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] 
-PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('M -30 -20 S 4 48 14 38 S 130 128 120 138')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('M 30 40 S 58 96 68 86 S 160 146 150 156')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] 
-PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('M -30 -20 H 4 V 28 H 26 V 64 L 116 168')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('M 30 40 H 58 V 76 H 122 V 148 L 182 216')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] 
-PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('M 6 16 A -10 0 10 1 0 34 58 A 90 100 10 1 1 230 128')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] 
-PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 1 h 2')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 1 h 2')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 1 h 2')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (-0.3) is [path('M 1 2 L 3 4 Z')] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0) is [path('M 1 2 L 3 4 Z')] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.3) is [path('M 1 2 L 3 4 Z')] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.5) is [none] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (0.6) is [none] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1) is [none] 
-PASS Web Animations: property <d> from [path('M 1 2 L 3 4 Z')] to [none] at (1.5) is [none] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 10 0 h 1')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 10 0 h 1')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 10 0 h 1')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] 
-PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4 Z')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4 Z')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4 Z')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] 
-PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] 
-PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] 
-PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] 
-PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] 
-PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] 
-PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] 
-PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] 
-PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] 
-PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 0 10 1 0 20 30')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] 
-PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 0 10 1 0 20 30')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] 
-PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] 
-PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] 
-PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] 
-PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] 
-PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -180 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 -60 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('M -30 -20 L -10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] 
-PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('M -30 -20 C 14 38 4 48 54 58 C 136 146 186 156 166 176')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] 
-PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('M -30 -20 Q 4 48 14 38 Q 130 128 120 138')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('M 30 40 Q 58 96 68 86 Q 160 146 150 156')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] 
-PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('M -30 -20 S 4 48 14 38 S 130 128 120 138')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('M 30 40 S 58 96 68 86 S 160 146 150 156')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] 
-PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('M -30 -20 H 4 V 28 H 26 V 64 L 116 168')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('M 30 40 H 58 V 76 H 122 V 148 L 182 216')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] 
-PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('M 6 16 A -10 0 10 1 0 34 58 A 90 100 10 1 1 230 128')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] 
-PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/svg-stroke-dasharray-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/svg-stroke-dasharray-interpolation-expected.txt
deleted file mode 100644
index 7024471f..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/svg-stroke-dasharray-interpolation-expected.txt
+++ /dev/null
@@ -1,469 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (-0.6) is [4px, 36px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (-0.4) is [6px, 34px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (-0.2) is [8px, 32px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (0) is [10px, 30px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (0.2) is [12px, 28px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (0.4) is [14px, 26px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (0.6) is [16px, 24px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (0.8) is [18px, 22px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (1) is [20px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from neutral to [20 20] at (1.2) is [22px, 18px] 
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (-0.3) is [0px, 0px] assert_equals: expected "20px , 20px " but got "0px , 0px "
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (0) is [none] assert_equals: expected "20px , 20px " but got "none "
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (0.3) is [6px, 6px] assert_equals: expected "20px , 20px " but got "6px , 6px "
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (0.5) is [10px, 10px] assert_equals: expected "20px , 20px " but got "10px , 10px "
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (0.6) is [12px, 12px] assert_equals: expected "20px , 20px " but got "12px , 12px "
-PASS CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (1) is [20px, 20px] 
-FAIL CSS Transitions: property <stroke-dasharray> from [initial] to [20 20] at (1.5) is [30px, 30px] assert_equals: expected "20px , 20px " but got "30px , 30px "
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (-0.6) is [36px, 4px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (-0.4) is [34px, 6px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (-0.2) is [32px, 8px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (0) is [30px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (0.2) is [28px, 12px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (0.4) is [26px, 14px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (0.6) is [24px, 16px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (0.8) is [22px, 18px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (1) is [20px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [inherit] to [20 20] at (1.2) is [18px, 22px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (-0.6) is [36px, 4px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (-0.4) is [34px, 6px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (-0.2) is [32px, 8px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (0) is [30px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (0.2) is [28px, 12px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (0.4) is [26px, 14px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (0.6) is [24px, 16px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (0.8) is [22px, 18px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (1) is [20px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [unset] to [20 20] at (1.2) is [18px, 22px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (-0.6) is [0px, 4px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (-0.4) is [1px, 6px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (-0.2) is [3px, 8px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (0) is [5px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (0.2) is [7px, 12px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (0.4) is [9px, 14px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (0.6) is [11px, 16px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (0.8) is [13px, 18px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (1) is [15px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20] at (1.2) is [17px, 22px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (-0.2) is [0px, 0px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (0) is [0px, 0px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (0.2) is [1px, 2px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (0.4) is [2px, 4px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (0.6) is [3px, 6px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (0.8) is [4px, 8px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (1) is [5px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0 0] to [5 10] at (1.2) is [6px, 12px] 
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (-0.3) is [0px, 0px] assert_equals: expected "5px , 10px " but got "0px , 0px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (0) is [none] assert_equals: expected "5px , 10px " but got "none "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (0.3) is [1.5px, 3px] assert_equals: expected "5px , 10px " but got "1.5px , 3px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (0.5) is [2.5px, 5px] assert_equals: expected "5px , 10px " but got "2.5px , 5px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (0.6) is [3px, 6px] assert_equals: expected "5px , 10px " but got "3px , 6px "
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (1) is [5px, 10px] 
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5 10] at (1.5) is [7.5px, 15px] assert_equals: expected "5px , 10px " but got "7.5px , 15px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (-0.3) is [0px, 0px] assert_equals: expected "80px , 160px " but got "0px , 0px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (0) is [none] assert_equals: expected "80px , 160px " but got "none "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (0.3) is [24px, 48px] assert_equals: expected "80px , 160px " but got "24px , 48px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (0.5) is [40px, 80px] assert_equals: expected "80px , 160px " but got "40px , 80px "
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (0.6) is [48px, 96px] assert_equals: expected "80px , 160px " but got "48px , 96px "
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (1) is [80px, 160px] 
-FAIL CSS Transitions: property <stroke-dasharray> from [none] to [5em 10em] at (1.5) is [120px, 240px] assert_equals: expected "80px , 160px " but got "120px , 240px "
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (-0.3) is [6.5px, 13px] assert_equals: expected "none " but got "6.5px , 13px "
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (0) is [5px, 10px] assert_equals: expected "none " but got "5px , 10px "
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (0.3) is [3.5px, 7px] assert_equals: expected "none " but got "3.5px , 7px "
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (0.5) is [2.5px, 5px] assert_equals: expected "none " but got "2.5px , 5px "
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (0.6) is [2px, 4px] assert_equals: expected "none " but got "2px , 4px "
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (1) is [none] 
-FAIL CSS Transitions: property <stroke-dasharray> from [5 10] to [none] at (1.5) is [0px, 0px] assert_equals: expected "none " but got "0px , 0px "
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (-0.3) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (0) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (0.3) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (0.5) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (0.6) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (1) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [none] to [none] at (1.5) is [none] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (-0.2) is [3px, 8px, 1px, 9px, 2px, 7px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (0) is [5px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.2) is [7px, 12px, 9px, 11px, 8px, 13px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.4) is [9px, 14px, 13px, 12px, 11px, 16px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.6) is [11px, 16px, 17px, 13px, 14px, 19px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.8) is [13px, 18px, 21px, 14px, 17px, 22px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (1) is [15px, 20px, 25px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10] to [15 20 25] at (1.2) is [17px, 22px, 29px, 16px, 23px, 28px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (-0.2) is [1px, 6px, 11px, 16px, 0px, 2px, 13px, 18px, 0px, 4px, 9px, 14px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0) is [5px, 10px, 15px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.2) is [9px, 14px, 19px, 24px, 13px, 18px, 17px, 22px, 11px, 16px, 21px, 26px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.4) is [13px, 18px, 23px, 28px, 21px, 26px, 19px, 24px, 17px, 22px, 27px, 32px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.6) is [17px, 22px, 27px, 32px, 29px, 34px, 21px, 26px, 23px, 28px, 33px, 38px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.8) is [21px, 26px, 31px, 36px, 37px, 42px, 23px, 28px, 29px, 34px, 39px, 44px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1) is [25px, 30px, 35px, 40px, 45px, 50px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1.2) is [29px, 34px, 39px, 44px, 53px, 58px, 27px, 32px, 41px, 46px, 51px, 56px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (-0.2) is [2px, 7px, 12px, 0px, 8px, 13px, 0px, 5px, 14px, 1px, 6px, 11px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0) is [5px, 10px, 15px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.2) is [8px, 13px, 18px, 11px, 12px, 17px, 10px, 15px, 16px, 9px, 14px, 19px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.4) is [11px, 16px, 21px, 17px, 14px, 19px, 15px, 20px, 17px, 13px, 18px, 23px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.6) is [14px, 19px, 24px, 23px, 16px, 21px, 20px, 25px, 18px, 17px, 22px, 27px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.8) is [17px, 22px, 27px, 29px, 18px, 23px, 25px, 30px, 19px, 21px, 26px, 31px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1) is [20px, 25px, 30px, 35px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1.2) is [23px, 28px, 33px, 41px, 22px, 27px, 35px, 40px, 21px, 29px, 34px, 39px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (-0.2) is [2px, 7px, 12px, 0px, 4px, 14px, 1px, 6px, 11px, 0px, 8px, 13px, 0px, 5px, 10px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0) is [5px, 10px, 15px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.2) is [8px, 13px, 18px, 11px, 16px, 16px, 9px, 14px, 19px, 12px, 12px, 17px, 10px, 15px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.4) is [11px, 16px, 21px, 17px, 22px, 17px, 13px, 18px, 23px, 19px, 14px, 19px, 15px, 20px, 25px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.6) is [14px, 19px, 24px, 23px, 28px, 18px, 17px, 22px, 27px, 26px, 16px, 21px, 20px, 25px, 30px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.8) is [17px, 22px, 27px, 29px, 34px, 19px, 21px, 26px, 31px, 33px, 18px, 23px, 25px, 30px, 35px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1) is [20px, 25px, 30px, 35px, 40px] 
-PASS CSS Transitions: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1.2) is [23px, 28px, 33px, 41px, 46px, 21px, 29px, 34px, 39px, 47px, 22px, 27px, 35px, 40px, 45px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (-0.2) is [0px, 24px, 24px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0) is [0px, 20px, 30px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.2) is [8px, 16px, 36px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.4) is [16px, 12px, 42px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.6) is [24px, 8px, 48px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.8) is [32px, 4px, 54px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1) is [40px, 0px, 60px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1.2) is [48px, 0px, 66px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (-0.2) is [0px, 24px, 0px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0) is [0px, 20px, 30px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.2) is [128px, 16px, 216px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.4) is [256px, 12px, 402px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.6) is [384px, 8px, 588px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.8) is [512px, 4px, 774px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1) is [640px, 0px, 960px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1.2) is [768px, 0px, 1146px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (-0.2) is [0px, 24px, 0px, 16px, 0px, 0px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0) is [0px, 20px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.2) is [8px, 16px, 192px, 24px, 0px, 208px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.4) is [16px, 12px, 384px, 28px, 0px, 396px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.6) is [24px, 8px, 576px, 32px, 0px, 584px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.8) is [32px, 4px, 768px, 36px, 0px, 772px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1) is [40px, 0px, 960px] 
-PASS CSS Transitions: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1.2) is [48px, 0px, 1152px, 44px, 0px, 1148px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (-0.2) is [128px, 28px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0) is [160px, 30px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.2) is [192px, 32px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.4) is [224px, 34px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.6) is [256px, 36px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.8) is [288px, 38px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1) is [320px, 40px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1.2) is [352px, 42px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (-0.2) is [0px, 0px, 0px, 0px, 640px, 32px, 0px, 0px, 256px, 8px, 0px, 0px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0) is [160px, 20px, 480px, 40px, 800px, 60px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.2) is [448px, 56px, 1344px, 112px, 960px, 88px, 1088px, 96px, 704px, 72px, 1600px, 128px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.4) is [736px, 92px, 2208px, 184px, 1120px, 116px, 2016px, 172px, 928px, 104px, 2400px, 196px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.6) is [1024px, 128px, 3072px, 256px, 1280px, 144px, 2944px, 248px, 1152px, 136px, 3200px, 264px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.8) is [1312px, 164px, 3936px, 328px, 1440px, 172px, 3872px, 324px, 1376px, 168px, 4000px, 332px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1) is [1600px, 200px, 4800px, 400px] 
-PASS CSS Transitions: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1.2) is [1888px, 236px, 5664px, 472px, 1760px, 228px, 5728px, 476px, 1824px, 232px, 5600px, 468px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.6) is [4px, 36px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.4) is [6px, 34px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.2) is [8px, 32px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (0) is [10px, 30px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (0.2) is [12px, 28px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (0.4) is [14px, 26px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (0.6) is [16px, 24px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (0.8) is [18px, 22px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (1) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from neutral to [20 20] at (1.2) is [22px, 18px] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (-0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (0) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.5) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.6) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (1) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [initial] to [20 20] at (1.5) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.6) is [36px, 4px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.4) is [34px, 6px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.2) is [32px, 8px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0) is [30px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.2) is [28px, 12px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.4) is [26px, 14px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.6) is [24px, 16px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.8) is [22px, 18px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (1) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [inherit] to [20 20] at (1.2) is [18px, 22px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.6) is [36px, 4px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.4) is [34px, 6px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.2) is [32px, 8px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (0) is [30px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.2) is [28px, 12px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.4) is [26px, 14px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.6) is [24px, 16px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.8) is [22px, 18px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (1) is [20px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [unset] to [20 20] at (1.2) is [18px, 22px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.6) is [0px, 4px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.4) is [1px, 6px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.2) is [3px, 8px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.2) is [7px, 12px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.4) is [9px, 14px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.6) is [11px, 16px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.8) is [13px, 18px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (1) is [15px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20] at (1.2) is [17px, 22px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (-0.2) is [0px, 0px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0) is [0px, 0px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.2) is [1px, 2px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.4) is [2px, 4px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.6) is [3px, 6px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.8) is [4px, 8px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (1) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [0 0] to [5 10] at (1.2) is [6px, 12px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (-0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (0) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (0.5) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (0.6) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (1) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5 10] at (1.5) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (-0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.5) is [80px, 160px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.6) is [80px, 160px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (1) is [80px, 160px] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [5em 10em] at (1.5) is [80px, 160px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (-0.3) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (0) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (0.3) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (0.5) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (0.6) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (1) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [none] at (1.5) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (-0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (0) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (0.3) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (0.5) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (0.6) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (1) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [none] to [none] at (1.5) is [none] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (-0.2) is [3px, 8px, 1px, 9px, 2px, 7px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0) is [5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.2) is [7px, 12px, 9px, 11px, 8px, 13px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.4) is [9px, 14px, 13px, 12px, 11px, 16px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.6) is [11px, 16px, 17px, 13px, 14px, 19px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.8) is [13px, 18px, 21px, 14px, 17px, 22px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (1) is [15px, 20px, 25px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (1.2) is [17px, 22px, 29px, 16px, 23px, 28px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (-0.2) is [1px, 6px, 11px, 16px, 0px, 2px, 13px, 18px, 0px, 4px, 9px, 14px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0) is [5px, 10px, 15px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.2) is [9px, 14px, 19px, 24px, 13px, 18px, 17px, 22px, 11px, 16px, 21px, 26px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.4) is [13px, 18px, 23px, 28px, 21px, 26px, 19px, 24px, 17px, 22px, 27px, 32px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.6) is [17px, 22px, 27px, 32px, 29px, 34px, 21px, 26px, 23px, 28px, 33px, 38px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.8) is [21px, 26px, 31px, 36px, 37px, 42px, 23px, 28px, 29px, 34px, 39px, 44px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1) is [25px, 30px, 35px, 40px, 45px, 50px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1.2) is [29px, 34px, 39px, 44px, 53px, 58px, 27px, 32px, 41px, 46px, 51px, 56px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (-0.2) is [2px, 7px, 12px, 0px, 8px, 13px, 0px, 5px, 14px, 1px, 6px, 11px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0) is [5px, 10px, 15px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.2) is [8px, 13px, 18px, 11px, 12px, 17px, 10px, 15px, 16px, 9px, 14px, 19px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.4) is [11px, 16px, 21px, 17px, 14px, 19px, 15px, 20px, 17px, 13px, 18px, 23px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.6) is [14px, 19px, 24px, 23px, 16px, 21px, 20px, 25px, 18px, 17px, 22px, 27px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.8) is [17px, 22px, 27px, 29px, 18px, 23px, 25px, 30px, 19px, 21px, 26px, 31px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1) is [20px, 25px, 30px, 35px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1.2) is [23px, 28px, 33px, 41px, 22px, 27px, 35px, 40px, 21px, 29px, 34px, 39px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (-0.2) is [2px, 7px, 12px, 0px, 4px, 14px, 1px, 6px, 11px, 0px, 8px, 13px, 0px, 5px, 10px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0) is [5px, 10px, 15px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.2) is [8px, 13px, 18px, 11px, 16px, 16px, 9px, 14px, 19px, 12px, 12px, 17px, 10px, 15px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.4) is [11px, 16px, 21px, 17px, 22px, 17px, 13px, 18px, 23px, 19px, 14px, 19px, 15px, 20px, 25px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.6) is [14px, 19px, 24px, 23px, 28px, 18px, 17px, 22px, 27px, 26px, 16px, 21px, 20px, 25px, 30px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.8) is [17px, 22px, 27px, 29px, 34px, 19px, 21px, 26px, 31px, 33px, 18px, 23px, 25px, 30px, 35px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1) is [20px, 25px, 30px, 35px, 40px] 
-PASS CSS Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1.2) is [23px, 28px, 33px, 41px, 46px, 21px, 29px, 34px, 39px, 47px, 22px, 27px, 35px, 40px, 45px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (-0.2) is [0px, 24px, 24px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0) is [0px, 20px, 30px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.2) is [8px, 16px, 36px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.4) is [16px, 12px, 42px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.6) is [24px, 8px, 48px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.8) is [32px, 4px, 54px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1) is [40px, 0px, 60px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1.2) is [48px, 0px, 66px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (-0.2) is [0px, 24px, 0px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0) is [0px, 20px, 30px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.2) is [128px, 16px, 216px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.4) is [256px, 12px, 402px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.6) is [384px, 8px, 588px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.8) is [512px, 4px, 774px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1) is [640px, 0px, 960px] 
-PASS CSS Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1.2) is [768px, 0px, 1146px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (-0.2) is [0px, 24px, 0px, 16px, 0px, 0px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0) is [0px, 20px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.2) is [8px, 16px, 192px, 24px, 0px, 208px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.4) is [16px, 12px, 384px, 28px, 0px, 396px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.6) is [24px, 8px, 576px, 32px, 0px, 584px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.8) is [32px, 4px, 768px, 36px, 0px, 772px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1) is [40px, 0px, 960px] 
-PASS CSS Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1.2) is [48px, 0px, 1152px, 44px, 0px, 1148px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (-0.2) is [128px, 28px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0) is [160px, 30px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.2) is [192px, 32px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.4) is [224px, 34px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.6) is [256px, 36px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.8) is [288px, 38px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1) is [320px, 40px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1.2) is [352px, 42px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (-0.2) is [0px, 0px, 0px, 0px, 640px, 32px, 0px, 0px, 256px, 8px, 0px, 0px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0) is [160px, 20px, 480px, 40px, 800px, 60px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.2) is [448px, 56px, 1344px, 112px, 960px, 88px, 1088px, 96px, 704px, 72px, 1600px, 128px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.4) is [736px, 92px, 2208px, 184px, 1120px, 116px, 2016px, 172px, 928px, 104px, 2400px, 196px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.6) is [1024px, 128px, 3072px, 256px, 1280px, 144px, 2944px, 248px, 1152px, 136px, 3200px, 264px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.8) is [1312px, 164px, 3936px, 328px, 1440px, 172px, 3872px, 324px, 1376px, 168px, 4000px, 332px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1) is [1600px, 200px, 4800px, 400px] 
-PASS CSS Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1.2) is [1888px, 236px, 5664px, 472px, 1760px, 228px, 5728px, 476px, 1824px, 232px, 5600px, 468px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.6) is [4px, 36px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.4) is [6px, 34px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (-0.2) is [8px, 32px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (0) is [10px, 30px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (0.2) is [12px, 28px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (0.4) is [14px, 26px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (0.6) is [16px, 24px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (0.8) is [18px, 22px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (1) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from neutral to [20 20] at (1.2) is [22px, 18px] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (-0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (0) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.5) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (0.6) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (1) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [initial] to [20 20] at (1.5) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.6) is [36px, 4px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.4) is [34px, 6px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (-0.2) is [32px, 8px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0) is [30px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.2) is [28px, 12px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.4) is [26px, 14px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.6) is [24px, 16px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (0.8) is [22px, 18px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (1) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [inherit] to [20 20] at (1.2) is [18px, 22px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.6) is [36px, 4px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.4) is [34px, 6px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (-0.2) is [32px, 8px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (0) is [30px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.2) is [28px, 12px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.4) is [26px, 14px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.6) is [24px, 16px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (0.8) is [22px, 18px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (1) is [20px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [unset] to [20 20] at (1.2) is [18px, 22px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.6) is [0px, 4px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.4) is [1px, 6px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (-0.2) is [3px, 8px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.2) is [7px, 12px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.4) is [9px, 14px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.6) is [11px, 16px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (0.8) is [13px, 18px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (1) is [15px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20] at (1.2) is [17px, 22px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (-0.2) is [0px, 0px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0) is [0px, 0px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.2) is [1px, 2px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.4) is [2px, 4px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.6) is [3px, 6px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (0.8) is [4px, 8px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (1) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [0 0] to [5 10] at (1.2) is [6px, 12px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (-0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (0) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (0.5) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (0.6) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (1) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5 10] at (1.5) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (-0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.5) is [80px, 160px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (0.6) is [80px, 160px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (1) is [80px, 160px] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [5em 10em] at (1.5) is [80px, 160px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (-0.3) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (0) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (0.3) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (0.5) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (0.6) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (1) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [none] at (1.5) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (-0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (0) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (0.3) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (0.5) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (0.6) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (1) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [none] to [none] at (1.5) is [none] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (-0.2) is [3px, 8px, 1px, 9px, 2px, 7px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0) is [5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.2) is [7px, 12px, 9px, 11px, 8px, 13px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.4) is [9px, 14px, 13px, 12px, 11px, 16px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.6) is [11px, 16px, 17px, 13px, 14px, 19px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (0.8) is [13px, 18px, 21px, 14px, 17px, 22px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (1) is [15px, 20px, 25px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10] to [15 20 25] at (1.2) is [17px, 22px, 29px, 16px, 23px, 28px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (-0.2) is [1px, 6px, 11px, 16px, 0px, 2px, 13px, 18px, 0px, 4px, 9px, 14px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0) is [5px, 10px, 15px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.2) is [9px, 14px, 19px, 24px, 13px, 18px, 17px, 22px, 11px, 16px, 21px, 26px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.4) is [13px, 18px, 23px, 28px, 21px, 26px, 19px, 24px, 17px, 22px, 27px, 32px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.6) is [17px, 22px, 27px, 32px, 29px, 34px, 21px, 26px, 23px, 28px, 33px, 38px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (0.8) is [21px, 26px, 31px, 36px, 37px, 42px, 23px, 28px, 29px, 34px, 39px, 44px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1) is [25px, 30px, 35px, 40px, 45px, 50px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15 20] to [25 30 35 40 45 50] at (1.2) is [29px, 34px, 39px, 44px, 53px, 58px, 27px, 32px, 41px, 46px, 51px, 56px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (-0.2) is [2px, 7px, 12px, 0px, 8px, 13px, 0px, 5px, 14px, 1px, 6px, 11px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0) is [5px, 10px, 15px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.2) is [8px, 13px, 18px, 11px, 12px, 17px, 10px, 15px, 16px, 9px, 14px, 19px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.4) is [11px, 16px, 21px, 17px, 14px, 19px, 15px, 20px, 17px, 13px, 18px, 23px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.6) is [14px, 19px, 24px, 23px, 16px, 21px, 20px, 25px, 18px, 17px, 22px, 27px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (0.8) is [17px, 22px, 27px, 29px, 18px, 23px, 25px, 30px, 19px, 21px, 26px, 31px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1) is [20px, 25px, 30px, 35px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35] at (1.2) is [23px, 28px, 33px, 41px, 22px, 27px, 35px, 40px, 21px, 29px, 34px, 39px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (-0.2) is [2px, 7px, 12px, 0px, 4px, 14px, 1px, 6px, 11px, 0px, 8px, 13px, 0px, 5px, 10px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0) is [5px, 10px, 15px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.2) is [8px, 13px, 18px, 11px, 16px, 16px, 9px, 14px, 19px, 12px, 12px, 17px, 10px, 15px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.4) is [11px, 16px, 21px, 17px, 22px, 17px, 13px, 18px, 23px, 19px, 14px, 19px, 15px, 20px, 25px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.6) is [14px, 19px, 24px, 23px, 28px, 18px, 17px, 22px, 27px, 26px, 16px, 21px, 20px, 25px, 30px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (0.8) is [17px, 22px, 27px, 29px, 34px, 19px, 21px, 26px, 31px, 33px, 18px, 23px, 25px, 30px, 35px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1) is [20px, 25px, 30px, 35px, 40px] 
-PASS Web Animations: property <stroke-dasharray> from [5 10 15] to [20 25 30 35 40] at (1.2) is [23px, 28px, 33px, 41px, 46px, 21px, 29px, 34px, 39px, 47px, 22px, 27px, 35px, 40px, 45px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (-0.2) is [0px, 24px, 24px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0) is [0px, 20px, 30px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.2) is [8px, 16px, 36px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.4) is [16px, 12px, 42px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.6) is [24px, 8px, 48px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (0.8) is [32px, 4px, 54px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1) is [40px, 0px, 60px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40px 0em 60px] at (1.2) is [48px, 0px, 66px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (-0.2) is [0px, 24px, 0px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0) is [0px, 20px, 30px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.2) is [128px, 16px, 216px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.4) is [256px, 12px, 402px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.6) is [384px, 8px, 588px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (0.8) is [512px, 4px, 774px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1) is [640px, 0px, 960px] 
-PASS Web Animations: property <stroke-dasharray> from [0em 20px 30px] to [40em 0em 60em] at (1.2) is [768px, 0px, 1146px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (-0.2) is [0px, 24px, 0px, 16px, 0px, 0px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0) is [0px, 20px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.2) is [8px, 16px, 192px, 24px, 0px, 208px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.4) is [16px, 12px, 384px, 28px, 0px, 396px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.6) is [24px, 8px, 576px, 32px, 0px, 584px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (0.8) is [32px, 4px, 768px, 36px, 0px, 772px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1) is [40px, 0px, 960px] 
-PASS Web Animations: property <stroke-dasharray> from [0px 20px] to [40px 0px 60em] at (1.2) is [48px, 0px, 1152px, 44px, 0px, 1148px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (-0.2) is [128px, 28px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0) is [160px, 30px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.2) is [192px, 32px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.4) is [224px, 34px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.6) is [256px, 36px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (0.8) is [288px, 38px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1) is [320px, 40px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 30px] to [20em 40px] at (1.2) is [352px, 42px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (-0.2) is [0px, 0px, 0px, 0px, 640px, 32px, 0px, 0px, 256px, 8px, 0px, 0px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0) is [160px, 20px, 480px, 40px, 800px, 60px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.2) is [448px, 56px, 1344px, 112px, 960px, 88px, 1088px, 96px, 704px, 72px, 1600px, 128px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.4) is [736px, 92px, 2208px, 184px, 1120px, 116px, 2016px, 172px, 928px, 104px, 2400px, 196px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.6) is [1024px, 128px, 3072px, 256px, 1280px, 144px, 2944px, 248px, 1152px, 136px, 3200px, 264px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (0.8) is [1312px, 164px, 3936px, 328px, 1440px, 172px, 3872px, 324px, 1376px, 168px, 4000px, 332px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1) is [1600px, 200px, 4800px, 400px] 
-PASS Web Animations: property <stroke-dasharray> from [10em 20px 30em 40px 50em 60px] to [100em 200px 300em 400px] at (1.2) is [1888px, 236px, 5664px, 472px, 1760px, 228px, 5728px, 476px, 1824px, 232px, 5600px, 468px] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/text-indent-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/text-indent-interpolation-expected.txt
deleted file mode 100644
index 55038f1..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/text-indent-interpolation-expected.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (-0.3) is [1px] 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (0) is [10px] 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (0.3) is [19px] 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (0.6) is [28px] 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (1) is [40px] 
-PASS CSS Transitions: property <text-indent> from neutral to [40px] at (1.5) is [55px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (-0.3) is [-6px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (0) is [0px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (0.3) is [6px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (0.6) is [12px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (1) is [20px] 
-PASS CSS Transitions: property <text-indent> from [initial] to [20px] at (1.5) is [30px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (-0.3) is [85px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (0) is [70px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (0.3) is [55px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (0.6) is [40px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (1) is [20px] 
-PASS CSS Transitions: property <text-indent> from [inherit] to [20px] at (1.5) is [-5px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (-0.3) is [85px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (0) is [70px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (0.3) is [55px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (0.6) is [40px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (1) is [20px] 
-PASS CSS Transitions: property <text-indent> from [unset] to [20px] at (1.5) is [-5px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (-0.3) is [-15px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (0) is [0px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (0.3) is [15px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (0.6) is [30px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (1) is [50px] 
-PASS CSS Transitions: property <text-indent> from [0px] to [50px] at (1.5) is [75px] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (-0.3) is [-15px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (0) is [0px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (0.3) is [15px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (0.6) is [30px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (1) is [50px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging] to [50px hanging] at (1.5) is [75px hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (-0.3) is [-15px each-line hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0) is [0px each-line hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.3) is [15px each-line hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.6) is [30px each-line hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-PASS CSS Transitions: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1.5) is [75px each-line hanging] 
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (-0.3) is [-15px hanging] assert_equals: expected "50px hanging " but got "- 15px hanging "
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (0) is [0px hanging] assert_equals: expected "50px hanging " but got "0px hanging "
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (0.3) is [15px hanging] assert_equals: expected "50px hanging " but got "15px hanging "
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (0.5) is [25px hanging] assert_equals: expected "50px hanging " but got "25px hanging "
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (0.6) is [30px hanging] assert_equals: expected "50px hanging " but got "30px hanging "
-PASS CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (1) is [50px hanging] 
-FAIL CSS Transitions: property <text-indent> from [0px each-line] to [50px hanging] at (1.5) is [75px hanging] assert_equals: expected "50px hanging " but got "75px hanging "
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (-0.3) is [-15px each-line hanging] assert_equals: expected "50px each - line hanging " but got "- 15px each - line hanging "
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (0) is [0px each-line hanging] assert_equals: expected "50px each - line hanging " but got "0px each - line hanging "
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (0.3) is [15px each-line hanging] assert_equals: expected "50px each - line hanging " but got "15px each - line hanging "
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (0.5) is [25px each-line hanging] assert_equals: expected "50px each - line hanging " but got "25px each - line hanging "
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (0.6) is [30px each-line hanging] assert_equals: expected "50px each - line hanging " but got "30px each - line hanging "
-PASS CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-FAIL CSS Transitions: property <text-indent> from [0px] to [50px each-line hanging] at (1.5) is [75px each-line hanging] assert_equals: expected "50px each - line hanging " but got "75px each - line hanging "
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (-0.3) is [1px] 
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (0) is [10px] 
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (0.3) is [19px] 
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (0.6) is [28px] 
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (1) is [40px] 
-PASS CSS Animations: property <text-indent> from neutral to [40px] at (1.5) is [55px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (-0.3) is [-6px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (0) is [0px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (0.3) is [6px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (0.6) is [12px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (1) is [20px] 
-PASS CSS Animations: property <text-indent> from [initial] to [20px] at (1.5) is [30px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (-0.3) is [85px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (0) is [70px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (0.3) is [55px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (0.6) is [40px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (1) is [20px] 
-PASS CSS Animations: property <text-indent> from [inherit] to [20px] at (1.5) is [-5px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (-0.3) is [85px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (0) is [70px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (0.3) is [55px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (0.6) is [40px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (1) is [20px] 
-PASS CSS Animations: property <text-indent> from [unset] to [20px] at (1.5) is [-5px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (-0.3) is [-15px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (0) is [0px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (0.3) is [15px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (0.6) is [30px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (1) is [50px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px] at (1.5) is [75px] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (-0.3) is [-15px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0) is [0px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0.3) is [15px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0.6) is [30px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (1) is [50px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging] to [50px hanging] at (1.5) is [75px hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (-0.3) is [-15px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0) is [0px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.3) is [15px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.6) is [30px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1.5) is [75px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (-0.3) is [0px each-line] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0) is [0px each-line] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.3) is [0px each-line] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.5) is [50px hanging] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.6) is [50px hanging] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (1) is [50px hanging] 
-PASS CSS Animations: property <text-indent> from [0px each-line] to [50px hanging] at (1.5) is [50px hanging] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (-0.3) is [0px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0) is [0px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.3) is [0px] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.5) is [50px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.6) is [50px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-PASS CSS Animations: property <text-indent> from [0px] to [50px each-line hanging] at (1.5) is [50px each-line hanging] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (-0.3) is [1px] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (0) is [10px] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (0.3) is [19px] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (0.6) is [28px] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (1) is [40px] 
-PASS Web Animations: property <text-indent> from neutral to [40px] at (1.5) is [55px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (-0.3) is [-6px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (0) is [0px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (0.3) is [6px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (0.6) is [12px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (1) is [20px] 
-PASS Web Animations: property <text-indent> from [initial] to [20px] at (1.5) is [30px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (-0.3) is [85px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (0) is [70px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (0.3) is [55px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (0.6) is [40px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (1) is [20px] 
-PASS Web Animations: property <text-indent> from [inherit] to [20px] at (1.5) is [-5px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (-0.3) is [85px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (0) is [70px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (0.3) is [55px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (0.6) is [40px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (1) is [20px] 
-PASS Web Animations: property <text-indent> from [unset] to [20px] at (1.5) is [-5px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (-0.3) is [-15px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (0) is [0px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (0.3) is [15px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (0.6) is [30px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (1) is [50px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px] at (1.5) is [75px] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (-0.3) is [-15px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0) is [0px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0.3) is [15px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (0.6) is [30px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (1) is [50px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging] to [50px hanging] at (1.5) is [75px hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (-0.3) is [-15px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0) is [0px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.3) is [15px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (0.6) is [30px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px hanging each-line] to [50px each-line hanging] at (1.5) is [75px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (-0.3) is [0px each-line] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0) is [0px each-line] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.3) is [0px each-line] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.5) is [50px hanging] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (0.6) is [50px hanging] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (1) is [50px hanging] 
-PASS Web Animations: property <text-indent> from [0px each-line] to [50px hanging] at (1.5) is [50px hanging] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (-0.3) is [0px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0) is [0px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.3) is [0px] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.5) is [50px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (0.6) is [50px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (1) is [50px each-line hanging] 
-PASS Web Animations: property <text-indent> from [0px] to [50px each-line hanging] at (1.5) is [50px each-line hanging] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/text-shadow-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/text-shadow-interpolation-expected.txt
deleted file mode 100644
index c1ed75f3..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/text-shadow-interpolation-expected.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 7px 33px 7px] 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 10px 30px 10px] 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 13px 27px 13px] 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 16px 24px 16px] 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Transitions: property <text-shadow> from neutral to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 25px 15px 25px] 
-PASS CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px] 
-PASS CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (0) is [none] 
-FAIL CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.3) is [rgba(0, 125, 0, 0.3) 6px 6px 6px] assert_equals: expected "rgba ( 0 , 128 , 0 , 0.3 ) 6px 6px 6px " but got "rgba ( 0 , 125 , 0 , 0.3 ) 6px 6px 6px "
-PASS CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.6) is [rgba(0, 128, 0, 0.6) 12px 12px 12px] 
-PASS CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Transitions: property <text-shadow> from [initial] to [20px 20px 20px green] at (1.5) is [rgb(0, 192, 0) 30px 30px 30px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Transitions: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Transitions: property <text-shadow> from [unset] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px] 
-PASS CSS Transitions: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px] 
-PASS CSS Transitions: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 7px 33px 7px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 10px 30px 10px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 13px 27px 13px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 16px 24px 16px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 25px 15px 25px] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0) is [none] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.3) is [rgba(0, 128, 0, 0.3) 6px 6px 6px] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.6) is [rgba(0, 128, 0, 0.6) 12px 12px 12px] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (1.5) is [rgb(0, 192, 0) 30px 30px 30px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS CSS Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px] 
-PASS CSS Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px] 
-PASS CSS Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 7px 33px 7px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 10px 30px 10px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 13px 27px 13px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 16px 24px 16px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS Web Animations: property <text-shadow> from neutral to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 25px 15px 25px] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (-0.3) is [rgba(0, 0, 0, 0) -6px -6px 0px] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0) is [none] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.3) is [rgba(0, 128, 0, 0.3) 6px 6px 6px] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (0.6) is [rgba(0, 128, 0, 0.6) 12px 12px 12px] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS Web Animations: property <text-shadow> from [initial] to [20px 20px 20px green] at (1.5) is [rgb(0, 192, 0) 30px 30px 30px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS Web Animations: property <text-shadow> from [inherit] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (-0.3) is [rgb(255, 176, 0) 33px 7px 33px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0) is [rgb(255, 165, 0) 30px 10px 30px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.3) is [rgb(179, 154, 0) 27px 13px 27px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (0.6) is [rgb(102, 143, 0) 24px 16px 24px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (1) is [rgb(0, 128, 0) 20px 20px 20px] 
-PASS Web Animations: property <text-shadow> from [unset] to [20px 20px 20px green] at (1.5) is [rgb(0, 110, 0) 15px 25px 15px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (-0.3) is [rgb(0, 0, 0) 24px 16px 0px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0) is [rgb(0, 0, 0) 15px 10px 5px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.3) is [rgb(77, 50, 0) 6px 4px 11px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (0.6) is [rgb(153, 99, 0) -3px -2px 17px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1) is [rgb(255, 165, 0) -15px -10px 25px] 
-PASS Web Animations: property <text-shadow> from [15px 10px 5px black] to [-15px -10px 25px orange] at (1.5) is [rgb(255, 248, 0) -30px -20px 35px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (-0.3) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0) is [rgb(0, 0, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.3) is [rgb(0, 38, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (0.6) is [rgb(0, 77, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1) is [rgb(0, 128, 0) 10px 10px 10px] 
-PASS Web Animations: property <text-shadow> from [10px 10px 10px black] to [10px 10px 10px currentColor] at (1.5) is [rgb(0, 192, 0) 10px 10px 10px] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/webkit-mask-box-image-source-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/webkit-mask-box-image-source-interpolation-expected.txt
deleted file mode 100644
index 4237f70..0000000
--- a/third_party/WebKit/LayoutTests/animations/interpolation/webkit-mask-box-image-source-interpolation-expected.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-This is a testharness.js-based test.
-PASS This test uses interpolation-test.js. 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.6) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../blue-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0) is [url(file:///.../blue-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.3)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.5)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.6)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 100.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "url ( file : / / / ... / green - 100.png ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( url ( file : / / / ... / green - 100.png ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "linear - gradient ( - 45deg , red , yellow ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.3 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.5 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-FAIL CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [linear-gradient(45deg, blue, orange)] assert_equals: expected "- webkit - cross - fade ( linear - gradient ( - 45deg , red , yellow ) , linear - gradient ( 45deg , blue , orange ) , 0.6 ) " but got "linear - gradient ( 45deg , blue , orange ) "
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Transitions: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../stripes-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from neutral to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (0.6) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [initial] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (-0.3) is [url(file:///.../blue-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0) is [url(file:///.../blue-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.3)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.5)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../blue-100.png), url(file:///.../green-100.png), 0.6)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (1) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [inherit] to [url(../resources/green-100.png)] at (1.5) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [unset] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (-0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.3) is [none] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (0.6) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [none] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.3)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.5)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), url(file:///.../stripes-100.png), 0.6)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [url(../resources/stripes-100.png)] at (1.5) is [url(file:///.../stripes-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0) is [url(file:///.../green-100.png)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(url(file:///.../green-100.png), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [url(../resources/green-100.png)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (-0.3) is [linear-gradient(-45deg, red, yellow)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0) is [linear-gradient(-45deg, red, yellow)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.3) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.3)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.5) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.5)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (0.6) is [-webkit-cross-fade(linear-gradient(-45deg, red, yellow), linear-gradient(45deg, blue, orange), 0.6)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1) is [linear-gradient(45deg, blue, orange)] 
-PASS CSS Animations: property <-webkit-mask-box-image-source> from [linear-gradient(-45deg, red, yellow)] to [linear-gradient(45deg, blue, orange)] at (1.5) is [linear-gradient(45deg, blue, orange)] 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/animations/transition-zoomed-length.html b/third_party/WebKit/LayoutTests/animations/transition-zoomed-length.html
index 6a8e9f4f..516d4d9 100644
--- a/third_party/WebKit/LayoutTests/animations/transition-zoomed-length.html
+++ b/third_party/WebKit/LayoutTests/animations/transition-zoomed-length.html
@@ -3,7 +3,6 @@
 <script src="../resources/testharnessreport.js"></script>
 <style>
 #target {
-  transition: 1s;
   border-style: solid;
   outline-style: solid;
   column-rule-style: solid;
@@ -72,6 +71,7 @@
     target.style[property] = '10px';
     expected[property] = getComputedStyle(target)[property];
   }
+  target.style.transition = '1s';
   internals.setZoomFactor(2);
 });
 
diff --git a/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset-expected.html b/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset-expected.html
new file mode 100644
index 0000000..a5925bb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset-expected.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<script src="../media-file.js"></script>
+<video controls width=400>
+  <track kind=subtitles src=fake-en-sub.vtt srclang=en label=English>
+  <track kind=subtitles src=fake-fr-sub.vtt srclang=fr label=French>
+</video>
+<script>
+  var video = document.querySelector('video');
+  video.src = findMediaFile('video', '../content/test');
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset.html b/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset.html
new file mode 100644
index 0000000..a08cd65
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/controls/buttons-after-reset.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<title>Test that resetting the controls after load is a no-op.</title>
+<script src="../media-file.js"></script>
+<video controls width=400>
+  <track kind=subtitles src=fake-en-sub.vtt srclang=en label=English>
+  <track kind=subtitles src=fake-fr-sub.vtt srclang=fr label=French>
+</video>
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
+
+  var video = document.querySelector('video');
+  video.src = findMediaFile('video', '../content/test');
+  video.addEventListener('loadedmetadata', () => {
+    video.controls = false;
+    testRunner.layoutAndPaintAsyncThen(() => {
+      video.controls = true;
+
+      testRunner.layoutAndPaintAsyncThen(() => {
+        testRunner.notifyDone();
+      });
+    });
+  });
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-anchor-point-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-anchor-point-expected.png
index 38b08b1..057ae38b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-anchor-point-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-anchor-point-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png
index 41cf685..f0f3eb6 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-anchor-point-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-anchor-point-expected.png
index 1ae5cb4..e5c4dd7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-anchor-point-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-anchor-point-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-anchor-point-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-anchor-point-expected.png
index 9a16aac..10ce7c1 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-anchor-point-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-anchor-point-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-animated-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-animated-expected.png
index e1c9563..7fb2dbf 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-animated-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-animated-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions-expected.txt b/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions-expected.txt
deleted file mode 100644
index 126a8722..0000000
--- a/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-PASS - "box-shadow" property for "box" element at 0.5s saw something close to: rgb(128, 128, 128) 15px 15px 4px 0px inset, rgba(0, 0, 0, 0.5) 5px 5px 3px 0px
-
diff --git a/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions.html b/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions.html
deleted file mode 100644
index 4df7e34..0000000
--- a/third_party/WebKit/LayoutTests/transitions/mismatched-shadow-transitions.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE>
-
-<html>
-<head>
-  <style>
-    .box {
-      height: 100px;
-      width: 100px;
-      margin: 50px;
-      border: 1px solid black;
-      text-align: center;
-      padding: 20px;
-      background-repeat: no-repeat;
-      -webkit-transition-duration: 1s;
-      -webkit-transition-timing-function: linear;
-      -webkit-transition-property: box-shadow;
-    }
-    
-    #box {
-      box-shadow: inset 10px 20px 4px gray;
-    }
-    
-    #box.final {
-      box-shadow: inset 20px 10px 4px gray, 10px 10px 6px black;
-    }
-
-  </style>
-  <script src="../animations/resources/animation-test-helpers.js"></script>
-  <script type="text/javascript">
-
-    const expectedValues = [
-      // [time, element-id, property, expected-value, tolerance]
-      [0.5, 'box', 'box-shadow', "rgb(128, 128, 128) 15px 15px 4px 0px inset, rgba(0, 0, 0, 0.5) 5px 5px 3px 0px", 4],
-    ];
-  
-    function setupTest()
-    {
-      document.getElementById('box').className = 'box final';
-    }
-  
-    runTransitionTest(expectedValues, setupTest);
-  </script>
-</head>
-<body>
-
-  <div id="box" class="box">BOX</div>
-  <div id="result"></div>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions-expected.txt b/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions-expected.txt
index f2aee0f..d3acad1 100644
--- a/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions-expected.txt
+++ b/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions-expected.txt
@@ -1,4 +1,4 @@
 PASS - "box-shadow" property for "box" element at 0.5s saw something close to: rgb(255, 0, 0) 0px 0px 10px 0px, rgb(0, 0, 255) 0px 0px 10px 0px
-PASS - "box-shadow" property for "box2" element at 0.5s saw something close to: rgb(255, 0, 0) 0px -20px 10px 0px, rgba(0, 0, 255, 0.5) 0px 10px 5px 0px
-PASS - "box-shadow" property for "box3" element at 0.5s saw something close to: rgb(128, 0, 128) 0px 0px 10px 0px, rgba(0, 0, 255, 0.5) 0px 10px 5px 0px
+PASS - "box-shadow" property for "box2" element at 0.5s saw something close to: rgb(255, 0, 0) 0px -20px 10px 0px, rgb(128, 0, 128) 0px 0px 10px 0px
+PASS - "box-shadow" property for "box3" element at 0.5s saw something close to: rgb(128, 0, 128) 0px 0px 10px 0px, rgb(0, 0, 255) 0px 20px 10px 0px
 
diff --git a/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions.html b/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions.html
index 1237cca..0a8825d 100644
--- a/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions.html
+++ b/third_party/WebKit/LayoutTests/transitions/multiple-shadow-transitions.html
@@ -54,8 +54,8 @@
     const expectedValues = [
       // [time, element-id, property, expected-value, tolerance]
       [0.5, 'box', 'box-shadow', 'rgb(255, 0, 0) 0px 0px 10px 0px, rgb(0, 0, 255) 0px 0px 10px 0px', 4],
-      [0.5, 'box2', 'box-shadow', 'rgb(255, 0, 0) 0px -20px 10px 0px, rgba(0, 0, 255, 0.5) 0px 10px 5px 0px', 4],
-      [0.5, 'box3', 'box-shadow', 'rgb(128, 0, 128) 0px 0px 10px 0px, rgba(0, 0, 255, 0.5) 0px 10px 5px 0px', 4],
+      [0.5, 'box2', 'box-shadow', 'rgb(255, 0, 0) 0px -20px 10px 0px, rgb(128, 0, 128) 0px 0px 10px 0px', 4],
+      [0.5, 'box3', 'box-shadow', 'rgb(128, 0, 128) 0px 0px 10px 0px, rgb(0, 0, 255) 0px 20px 10px 0px', 4],
     ];
   
     function setupTest()
diff --git a/third_party/WebKit/LayoutTests/transitions/svg-transitions-expected.txt b/third_party/WebKit/LayoutTests/transitions/svg-transitions-expected.txt
index 4be498ab..52add4f 100644
--- a/third_party/WebKit/LayoutTests/transitions/svg-transitions-expected.txt
+++ b/third_party/WebKit/LayoutTests/transitions/svg-transitions-expected.txt
@@ -8,11 +8,11 @@
 PASS - "stroke-dasharray" property for "rect2" element at 1s saw something close to: 15,15
 PASS - "stroke-width" property for "rect4" element at 1s saw something close to: 8
 PASS - "stroke-width" property for "rect5" element at 1s saw something close to: 5
-PASS - "stroke-dasharray" property for "rect5" element at 1s saw something close to: 10,10
+PASS - "stroke-dasharray" property for "rect5" element at 1s saw something close to: 20
 PASS - "stroke-width" property for "rect6" element at 1s saw something close to: 15
 PASS - "stroke-dasharray" property for "rect6" element at 1s saw something close to: 15,15,20,12.5,17.5,17.5
 FAIL - "fill" property for "rect7" element at 1s expected: 0,0,127 but saw: url("#invalid") rgb(0, 0, 255)
-PASS - "stroke-dasharray" property for "rect7" element at 1s saw something close to: 10,10
+PASS - "stroke-dasharray" property for "rect7" element at 1s saw something close to: none
 PASS - "stop-color" property for "stop1" element at 1s saw something close to: 127,127,0
 PASS - "stop-opacity" property for "stop1" element at 1s saw something close to: 0.75
 PASS - "stroke-miterlimit" property for "polyline1" element at 1s saw something close to: 11
diff --git a/third_party/WebKit/LayoutTests/transitions/svg-transitions.html b/third_party/WebKit/LayoutTests/transitions/svg-transitions.html
index f5f6afb5..c277445 100644
--- a/third_party/WebKit/LayoutTests/transitions/svg-transitions.html
+++ b/third_party/WebKit/LayoutTests/transitions/svg-transitions.html
@@ -140,11 +140,11 @@
   [1, "rect2", "stroke-dasharray", [15, 15], 1], // (10, 10) -> (20, 20)
   [1, "rect4", "stroke-width", 8, 0.5],  // 1px to 4mm (~15.1px)
   [1, "rect5", "stroke-width", 5, 1],  // 0 to 10px
-  [1, "rect5", "stroke-dasharray", [10, 10], 1], // (0, 0) -> (20, 20)
+  [1, "rect5", "stroke-dasharray", 20, 1], // none -> 20
   [1, "rect6", "stroke-width", 15, 2],  // 10% to 20%
   [1, "rect6", "stroke-dasharray", [15, 15, 20, 12.5, 17.5, 17.5], 1], // (10, 15, 20, 15, 20, 15) -> (10, 15, 20, 10, 15, 20)
   [1, "rect7", "fill", [0, 0, 127], 20],  // url(#invalid) black -> url(#invalid) blue
-  [1, "rect7", "stroke-dasharray", [10, 10], 1], // (20, 20) -> (0, 0)
+  [1, "rect7", "stroke-dasharray", 'none', 1], // 20 -> none
   [1, "stop1", "stop-color", [127, 127, 0], 20], // rgb(255,0,0) -> rgb(0, 255, 0)
   [1, "stop1", "stop-opacity", 0.75, 0.1], // 1 -> 0.5
   [1, "polyline1", "stroke-miterlimit", 11, 0.5], // 12 -> 10 (this is an abrupt change in rendering even though the property animation is smooth)
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp b/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
index e4524c7..1a0909a 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
@@ -538,9 +538,8 @@
 }
 
 template <typename PlatformAnimationCurveType>
-void addKeyframesToCurve(
-    PlatformAnimationCurveType& curve,
-    const AnimatableValuePropertySpecificKeyframeVector& keyframes) {
+void addKeyframesToCurve(PlatformAnimationCurveType& curve,
+                         const PropertySpecificKeyframeVector& keyframes) {
   auto* lastKeyframe = keyframes.back().get();
   for (const auto& keyframe : keyframes) {
     const TimingFunction* keyframeTimingFunction = 0;
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimationUpdate.h b/third_party/WebKit/Source/core/animation/css/CSSAnimationUpdate.h
index 613f2e6..8b2de64 100644
--- a/third_party/WebKit/Source/core/animation/css/CSSAnimationUpdate.h
+++ b/third_party/WebKit/Source/core/animation/css/CSSAnimationUpdate.h
@@ -163,15 +163,15 @@
   }
 
   void startTransition(CSSPropertyID id,
-                       const AnimatableValue* from,
-                       const AnimatableValue* to,
+                       RefPtr<AnimatableValue> from,
+                       RefPtr<AnimatableValue> to,
                        PassRefPtr<AnimatableValue> reversingAdjustedStartValue,
                        double reversingShorteningFactor,
                        const InertEffect& effect) {
     NewTransition newTransition;
     newTransition.id = id;
-    newTransition.from = from;
-    newTransition.to = to;
+    newTransition.from = std::move(from);
+    newTransition.to = std::move(to);
     newTransition.reversingAdjustedStartValue = reversingAdjustedStartValue;
     newTransition.reversingShorteningFactor = reversingShorteningFactor;
     newTransition.effect = &effect;
@@ -209,8 +209,8 @@
     DEFINE_INLINE_TRACE() { visitor->trace(effect); }
 
     CSSPropertyID id;
-    const AnimatableValue* from;
-    const AnimatableValue* to;
+    RefPtr<AnimatableValue> from;
+    RefPtr<AnimatableValue> to;
     RefPtr<AnimatableValue> reversingAdjustedStartValue;
     double reversingShorteningFactor;
     Member<const InertEffect> effect;
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
index 39a15c6b..aa8e2bb 100644
--- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
+++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
@@ -30,16 +30,21 @@
 
 #include "core/animation/css/CSSAnimations.h"
 
+#include <algorithm>
+#include <bitset>
 #include "core/StylePropertyShorthand.h"
 #include "core/animation/Animation.h"
+#include "core/animation/CSSInterpolationTypesMap.h"
 #include "core/animation/CompositorAnimations.h"
 #include "core/animation/DocumentTimeline.h"
 #include "core/animation/ElementAnimations.h"
 #include "core/animation/InertEffect.h"
 #include "core/animation/Interpolation.h"
+#include "core/animation/InterpolationEnvironment.h"
+#include "core/animation/InterpolationType.h"
 #include "core/animation/KeyframeEffectModel.h"
 #include "core/animation/KeyframeEffectReadOnly.h"
-#include "core/animation/LegacyStyleInterpolation.h"
+#include "core/animation/TransitionInterpolation.h"
 #include "core/animation/css/CSSAnimatableValueFactory.h"
 #include "core/css/CSSKeyframeRule.h"
 #include "core/css/CSSPropertyEquality.h"
@@ -59,8 +64,6 @@
 #include "platform/animation/TimingFunction.h"
 #include "public/platform/Platform.h"
 #include "wtf/HashSet.h"
-#include <algorithm>
-#include <bitset>
 
 namespace blink {
 
@@ -554,16 +557,14 @@
               : element->document().timeline().currentTimeInternal() -
                     oldStartTime;
 
-      AnimatableValueKeyframeEffectModel* oldEffect =
-          toAnimatableValueKeyframeEffectModel(inertAnimation->model());
+      TransitionKeyframeEffectModel* oldEffect =
+          toTransitionKeyframeEffectModel(inertAnimation->model());
       const KeyframeVector& frames = oldEffect->getFrames();
 
-      AnimatableValueKeyframeVector newFrames;
-      newFrames.push_back(toAnimatableValueKeyframe(frames[0]->clone().get()));
-      newFrames.push_back(toAnimatableValueKeyframe(frames[1]->clone().get()));
-      newFrames.push_back(toAnimatableValueKeyframe(frames[2]->clone().get()));
-      newFrames[0]->clearPropertyValue(id);
-      newFrames[1]->clearPropertyValue(id);
+      TransitionKeyframeVector newFrames;
+      newFrames.push_back(toTransitionKeyframe(frames[0]->clone().get()));
+      newFrames.push_back(toTransitionKeyframe(frames[1]->clone().get()));
+      newFrames.push_back(toTransitionKeyframe(frames[2]->clone().get()));
 
       InertEffect* inertAnimationForSampling = InertEffect::create(
           oldAnimation->model(), oldAnimation->specifiedTiming(), false,
@@ -571,11 +572,15 @@
       Vector<RefPtr<Interpolation>> sample;
       inertAnimationForSampling->sample(sample);
       if (sample.size() == 1) {
-        newFrames[0]->setPropertyValue(
-            id, toLegacyStyleInterpolation(sample.at(0).get())->currentValue());
-        newFrames[1]->setPropertyValue(
-            id, toLegacyStyleInterpolation(sample.at(0).get())->currentValue());
-        model = AnimatableValueKeyframeEffectModel::create(newFrames);
+        const TransitionInterpolation& interpolation =
+            toTransitionInterpolation(*sample.at(0));
+        newFrames[0]->setValue(interpolation.getInterpolatedValue());
+        newFrames[0]->setCompositorValue(
+            interpolation.getInterpolatedCompositorValue());
+        newFrames[1]->setValue(interpolation.getInterpolatedValue());
+        newFrames[1]->setCompositorValue(
+            interpolation.getInterpolatedCompositorValue());
+        model = TransitionKeyframeEffectModel::create(newFrames);
       }
     }
 
@@ -617,7 +622,7 @@
     if (activeTransitionIter != activeTransitions->end()) {
       const RunningTransition* runningTransition = &activeTransitionIter->value;
       to = CSSAnimatableValueFactory::create(id, style);
-      const AnimatableValue* activeTo = runningTransition->to;
+      const AnimatableValue* activeTo = runningTransition->to.get();
       if (to->equals(activeTo))
         return;
       update.cancelTransition(id);
@@ -631,15 +636,45 @@
 
   if (CSSPropertyEquality::propertiesEqual(id, oldStyle, style))
     return;
+
   if (!to)
     to = CSSAnimatableValueFactory::create(id, style);
-
   RefPtr<AnimatableValue> from =
       CSSAnimatableValueFactory::create(id, oldStyle);
+
+  // TODO(alancutter): Support transitions on registered custom properties and
+  // give the map a PropertyRegistry.
+  CSSInterpolationTypesMap map(nullptr);
+  InterpolationEnvironment oldEnvironment(map, oldStyle);
+  InterpolationEnvironment newEnvironment(map, style);
+  InterpolationValue start = nullptr;
+  InterpolationValue end = nullptr;
+  const InterpolationType* transitionType = nullptr;
+  PropertyHandle property(id);
+  for (const auto& interpolationType : map.get(property)) {
+    start = interpolationType->maybeConvertUnderlyingValue(oldEnvironment);
+    if (!start) {
+      continue;
+    }
+    end = interpolationType->maybeConvertUnderlyingValue(newEnvironment);
+    if (!end) {
+      continue;
+    }
+    // Merge will only succeed if the two values are considered interpolable.
+    if (interpolationType->maybeMergeSingles(start.clone(), end.clone())) {
+      transitionType = interpolationType.get();
+      break;
+    }
+  }
+
+  // No smooth interpolation exists between these values so don't start a
+  // transition.
+  if (!transitionType) {
+    return;
+  }
+
   // If we have multiple transitions on the same property, we will use the
   // last one since we iterate over them in order.
-  if (AnimatableValue::usesDefaultInterpolation(to.get(), from.get()))
-    return;
 
   Timing timing = transitionData.convertToTiming(transitionIndex);
   if (timing.startDelay + timing.iterationDuration <= 0)
@@ -651,10 +686,7 @@
     const double interruptedProgress =
         interruptedTransition->animation->effect()->progress();
     if (!std::isnan(interruptedProgress)) {
-      // const_cast because we need to take a ref later when passing to
-      // startTransition.
-      reversingAdjustedStartValue =
-          const_cast<AnimatableValue*>(interruptedTransition->to);
+      reversingAdjustedStartValue = interruptedTransition->to.get();
       reversingShorteningFactor =
           clampTo((interruptedProgress *
                    interruptedTransition->reversingShorteningFactor) +
@@ -667,7 +699,7 @@
     }
   }
 
-  AnimatableValueKeyframeVector keyframes;
+  TransitionKeyframeVector keyframes;
   double startKeyframeOffset = 0;
 
   if (timing.startDelay > 0) {
@@ -676,28 +708,39 @@
     timing.startDelay = 0;
   }
 
-  RefPtr<AnimatableValueKeyframe> delayKeyframe =
-      AnimatableValueKeyframe::create();
-  delayKeyframe->setPropertyValue(id, from.get());
+  RefPtr<TransitionKeyframe> delayKeyframe =
+      TransitionKeyframe::create(property);
+  delayKeyframe->setValue(TypedInterpolationValue::create(
+      *transitionType, start.interpolableValue->clone(),
+      start.nonInterpolableValue));
   delayKeyframe->setOffset(0);
   keyframes.push_back(delayKeyframe);
 
-  RefPtr<AnimatableValueKeyframe> startKeyframe =
-      AnimatableValueKeyframe::create();
-  startKeyframe->setPropertyValue(id, from.get());
+  RefPtr<TransitionKeyframe> startKeyframe =
+      TransitionKeyframe::create(property);
+  startKeyframe->setValue(TypedInterpolationValue::create(
+      *transitionType, start.interpolableValue->clone(),
+      start.nonInterpolableValue));
   startKeyframe->setOffset(startKeyframeOffset);
   startKeyframe->setEasing(std::move(timing.timingFunction));
   timing.timingFunction = LinearTimingFunction::shared();
   keyframes.push_back(startKeyframe);
 
-  RefPtr<AnimatableValueKeyframe> endKeyframe =
-      AnimatableValueKeyframe::create();
-  endKeyframe->setPropertyValue(id, to.get());
+  RefPtr<TransitionKeyframe> endKeyframe = TransitionKeyframe::create(property);
+  endKeyframe->setValue(TypedInterpolationValue::create(
+      *transitionType, end.interpolableValue->clone(),
+      end.nonInterpolableValue));
   endKeyframe->setOffset(1);
   keyframes.push_back(endKeyframe);
 
-  AnimatableValueKeyframeEffectModel* model =
-      AnimatableValueKeyframeEffectModel::create(keyframes);
+  if (CompositorAnimations::isCompositableProperty(id)) {
+    delayKeyframe->setCompositorValue(from);
+    startKeyframe->setCompositorValue(from);
+    endKeyframe->setCompositorValue(to);
+  }
+
+  TransitionKeyframeEffectModel* model =
+      TransitionKeyframeEffectModel::create(keyframes);
   update.startTransition(id, from.get(), to.get(), reversingAdjustedStartValue,
                          reversingShorteningFactor,
                          *InertEffect::create(model, timing, false, 0));
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimations.h b/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
index 2160035..fbbb3b90 100644
--- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
+++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
@@ -139,8 +139,8 @@
     DEFINE_INLINE_TRACE() { visitor->trace(animation); }
 
     Member<Animation> animation;
-    const AnimatableValue* from;
-    const AnimatableValue* to;
+    RefPtr<AnimatableValue> from;
+    RefPtr<AnimatableValue> to;
     RefPtr<AnimatableValue> reversingAdjustedStartValue;
     double reversingShorteningFactor;
   };
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
index be12c3b..7612822 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
@@ -41,6 +41,7 @@
 #include "core/animation/InvalidatableInterpolation.h"
 #include "core/animation/KeyframeEffect.h"
 #include "core/animation/LegacyStyleInterpolation.h"
+#include "core/animation/TransitionInterpolation.h"
 #include "core/animation/animatable/AnimatableValue.h"
 #include "core/animation/css/CSSAnimatableValueFactory.h"
 #include "core/animation/css/CSSAnimations.h"
@@ -1181,9 +1182,10 @@
       CSSInterpolationTypesMap map(state.document().propertyRegistry());
       InterpolationEnvironment environment(map, state);
       InvalidatableInterpolation::applyStack(entry.value, environment);
+    } else if (interpolation.isTransitionInterpolation()) {
+      toTransitionInterpolation(interpolation).apply(state);
     } else {
-      // TODO(alancutter): Remove this old code path once animations have
-      // completely migrated to InterpolationTypes.
+      // TODO(alancutter): Move CustomCompositorAnimations off AnimatableValues.
       toLegacyStyleInterpolation(interpolation).apply(state);
     }
   }
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
index e148177..b359dfe 100644
--- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -48,7 +48,10 @@
 namespace blink {
 
 static Node* selectionShadowAncestor(LocalFrame* frame) {
-  Node* node = frame->selection().selection().base().anchorNode();
+  Node* node = frame->selection()
+                   .computeVisibleSelectionInDOMTreeDeprecated()
+                   .base()
+                   .anchorNode();
   if (!node)
     return 0;
 
@@ -74,7 +77,7 @@
 
 const VisibleSelection& DOMSelection::visibleSelection() const {
   DCHECK(frame());
-  return frame()->selection().selection();
+  return frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
 }
 
 bool DOMSelection::isBaseFirstInSelection() const {
@@ -259,7 +262,8 @@
   if (!isAvailable())
     return;
 
-  const VisibleSelection& selection = frame()->selection().selection();
+  const VisibleSelection& selection =
+      frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
 
   if (selection.isNone()) {
     exceptionState.throwDOMException(InvalidStateError,
@@ -276,7 +280,8 @@
   if (!isAvailable())
     return;
 
-  const VisibleSelection& selection = frame()->selection().selection();
+  const VisibleSelection& selection =
+      frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
 
   if (selection.isNone()) {
     exceptionState.throwDOMException(InvalidStateError,
@@ -658,7 +663,8 @@
   frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
   Range* selectedRange =
-      createRange(selection.selection().toNormalizedEphemeralRange());
+      createRange(selection.computeVisibleSelectionInDOMTreeDeprecated()
+                      .toNormalizedEphemeralRange());
   if (!selectedRange)
     return;
 
@@ -688,7 +694,8 @@
 
   FrameSelection& selection = frame()->selection();
   const EphemeralRange selectedRange =
-      selection.selection().toNormalizedEphemeralRange();
+      selection.computeVisibleSelectionInDOMTreeDeprecated()
+          .toNormalizedEphemeralRange();
   if (selectedRange.isNull())
     return false;
 
@@ -748,8 +755,10 @@
   DocumentLifecycle::DisallowTransitionScope disallowTransition(
       frame()->document()->lifecycle());
 
-  const EphemeralRange range =
-      frame()->selection().selection().toNormalizedEphemeralRange();
+  const EphemeralRange range = frame()
+                                   ->selection()
+                                   .computeVisibleSelectionInDOMTreeDeprecated()
+                                   .toNormalizedEphemeralRange();
   return plainText(
       range,
       TextIteratorBehavior::Builder().setForSelectionToString(true).build());
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
index 3ef32f17..319324f 100644
--- a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
+++ b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
@@ -2046,7 +2046,10 @@
   if (!hasRichlyEditableStyle(node))
     return nullptr;
   return new RangeVector(
-      1, firstRangeOf(node.document().frame()->selection().selection()));
+      1, firstRangeOf(node.document()
+                          .frame()
+                          ->selection()
+                          .computeVisibleSelectionInDOMTreeDeprecated()));
 }
 
 DispatchEventResult dispatchBeforeInputInsertText(Node* target,
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp
index 809f18b..e312d48 100644
--- a/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -157,7 +157,8 @@
 // |SelectionInDOMTree| instead of |VisibleSelection|.
 VisibleSelection Editor::selectionForCommand(Event* event) {
   frame().selection().updateIfNeeded();
-  VisibleSelection selection = frame().selection().selection();
+  VisibleSelection selection =
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (!event)
     return selection;
   // If the target is a text control, and the current selection is outside of
@@ -696,7 +697,10 @@
 }
 
 EphemeralRange Editor::selectedRange() {
-  return frame().selection().selection().toNormalizedEphemeralRange();
+  return frame()
+      .selection()
+      .computeVisibleSelectionInDOMTreeDeprecated()
+      .toNormalizedEphemeralRange();
 }
 
 bool Editor::canDeleteRange(const EphemeralRange& range) const {
@@ -745,7 +749,8 @@
 }
 
 Element* Editor::findEventTargetFromSelection() const {
-  return findEventTargetFrom(frame().selection().selection());
+  return findEventTargetFrom(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated());
 }
 
 void Editor::applyStyle(StylePropertySet* style,
@@ -799,7 +804,7 @@
   EditingStyle* styleToCheck = EditingStyle::create(propertyID, value);
   EditingStyle* styleAtStart =
       EditingStyleUtilities::createStyleAtSelectionStart(
-          frame().selection().selection(),
+          frame().selection().computeVisibleSelectionInDOMTreeDeprecated(),
           propertyID == CSSPropertyBackgroundColor, styleToCheck->style());
   return styleToCheck->triStateOfStyle(styleAtStart);
 }
@@ -807,13 +812,14 @@
 TriState Editor::selectionHasStyle(CSSPropertyID propertyID,
                                    const String& value) const {
   return EditingStyle::create(propertyID, value)
-      ->triStateOfStyle(frame().selection().selection());
+      ->triStateOfStyle(
+          frame().selection().computeVisibleSelectionInDOMTreeDeprecated());
 }
 
 String Editor::selectionStartCSSPropertyValue(CSSPropertyID propertyID) {
   EditingStyle* selectionStyle =
       EditingStyleUtilities::createStyleAtSelectionStart(
-          frame().selection().selection(),
+          frame().selection().computeVisibleSelectionInDOMTreeDeprecated(),
           propertyID == CSSPropertyBackgroundColor);
   if (!selectionStyle || !selectionStyle->style())
     return String();
@@ -1024,7 +1030,10 @@
   if (!canEdit())
     return false;
 
-  VisiblePosition caret = frame().selection().selection().visibleStart();
+  VisiblePosition caret = frame()
+                              .selection()
+                              .computeVisibleSelectionInDOMTreeDeprecated()
+                              .visibleStart();
   bool alignToEdge = isEndOfEditableOrNonEditableContent(caret);
   DCHECK(frame().document());
   if (!TypingCommand::insertLineBreak(*frame().document()))
@@ -1043,7 +1052,10 @@
   if (!canEditRichly())
     return insertLineBreak();
 
-  VisiblePosition caret = frame().selection().selection().visibleStart();
+  VisiblePosition caret = frame()
+                              .selection()
+                              .computeVisibleSelectionInDOMTreeDeprecated()
+                              .visibleStart();
   bool alignToEdge = isEndOfEditableOrNonEditableContent(caret);
   DCHECK(frame().document());
   EditingState editingState;
@@ -1317,7 +1329,8 @@
   if (!canEdit())
     return;
 
-  VisibleSelection selection = frame().selection().selection();
+  VisibleSelection selection =
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (!selection.isCaret())
     return;
 
@@ -1344,7 +1357,8 @@
   String transposed = text.right(1) + text.left(1);
 
   // Select the two characters.
-  if (newSelection != frame().selection().selection())
+  if (newSelection !=
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated())
     frame().selection().setSelection(newSelection);
 
   // Insert the transposed characters.
@@ -1374,7 +1388,8 @@
   // See <rdar://problem/5729315> Some shouldChangeSelectedDOMRange contain
   // Ranges for selections that are no longer valid
   bool selectionDidNotChangeDOMPosition =
-      newSelection == frame().selection().selection();
+      newSelection ==
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated();
   frame().selection().setSelection(newSelection, options);
 
   // Some editing operations change the selection visually without affecting its
@@ -1445,7 +1460,11 @@
     m_typingStyle = EditingStyle::create(style);
 
   m_typingStyle->prepareToApplyAt(
-      frame().selection().selection().visibleStart().deepEquivalent(),
+      frame()
+          .selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .visibleStart()
+          .deepEquivalent(),
       EditingStyle::PreserveWritingDirection);
 
   // Handle block styles, substracting these from the typing style.
@@ -1458,7 +1477,8 @@
 }
 
 bool Editor::findString(const String& target, FindOptions options) {
-  VisibleSelection selection = frame().selection().selection();
+  VisibleSelection selection =
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated();
 
   // TODO(yosin) We should make |findRangeOfString()| to return
   // |EphemeralRange| rather than|Range| object.
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index bef7a92..5ac86457 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -134,22 +134,25 @@
 }
 
 Element* FrameSelection::rootEditableElementOrDocumentElement() const {
-  Element* selectionRoot = selection().rootEditableElement();
+  Element* selectionRoot =
+      computeVisibleSelectionInDOMTreeDeprecated().rootEditableElement();
   return selectionRoot ? selectionRoot : document().documentElement();
 }
 
 ContainerNode* FrameSelection::rootEditableElementOrTreeScopeRootNode() const {
-  Element* selectionRoot = selection().rootEditableElement();
+  Element* selectionRoot =
+      computeVisibleSelectionInDOMTreeDeprecated().rootEditableElement();
   if (selectionRoot)
     return selectionRoot;
 
-  Node* node = selection().base().computeContainerNode();
+  Node* node = computeVisibleSelectionInDOMTreeDeprecated()
+                   .base()
+                   .computeContainerNode();
   return node ? &node->treeScope().rootNode() : 0;
 }
 
-// TODO(yosin): We should rename |FrameSelection::selection()| to
-// |selectionDeprecated()|.
-const VisibleSelection& FrameSelection::selection() const {
+const VisibleSelection&
+FrameSelection::computeVisibleSelectionInDOMTreeDeprecated() const {
   // TODO(yosin): We should hoist updateStyleAndLayoutIgnorePendingStylesheets
   // to caller. See http://crbug.com/590369 for more details.
   document().updateStyleAndLayoutIgnorePendingStylesheets();
@@ -170,7 +173,8 @@
   const VisiblePosition position =
       visiblePositionForContentsPoint(point, frame());
   SelectionInDOMTree::Builder builder;
-  builder.setIsDirectional(selection().isDirectional());
+  builder.setIsDirectional(
+      computeVisibleSelectionInDOMTreeDeprecated().isDirectional());
   builder.setIsHandleVisible(true);
   if (position.isNotNull())
     builder.collapse(position.toPositionWithAffinity());
@@ -371,12 +375,15 @@
                             SelectionDirection direction,
                             TextGranularity granularity,
                             EUserTriggered userTriggered) {
-  SelectionModifier selectionModifier(*frame(), selection(),
-                                      m_xPosForVerticalArrowNavigation);
+  SelectionModifier selectionModifier(
+      *frame(), computeVisibleSelectionInDOMTreeDeprecated(),
+      m_xPosForVerticalArrowNavigation);
   const bool modified = selectionModifier.modify(alter, direction, granularity);
   if (userTriggered == UserTriggered &&
-      selectionModifier.selection().isRange() && selection().isCaret() &&
-      dispatchSelectStart(selection()) != DispatchEventResult::NotCanceled) {
+      selectionModifier.selection().isRange() &&
+      computeVisibleSelectionInDOMTreeDeprecated().isCaret() &&
+      dispatchSelectStart(computeVisibleSelectionInDOMTreeDeprecated()) !=
+          DispatchEventResult::NotCanceled) {
     return false;
   }
   if (!modified) {
@@ -410,7 +417,8 @@
 bool FrameSelection::modify(EAlteration alter,
                             unsigned verticalDistance,
                             VerticalDirection direction) {
-  SelectionModifier selectionModifier(*frame(), selection());
+  SelectionModifier selectionModifier(
+      *frame(), computeVisibleSelectionInDOMTreeDeprecated());
   if (!selectionModifier.modifyWithPageGranularity(alter, verticalDistance,
                                                    direction)) {
     return false;
@@ -477,7 +485,7 @@
 }
 
 IntRect FrameSelection::absoluteCaretBounds() {
-  DCHECK(selection().isValidFor(*m_frame->document()));
+  DCHECK(computeVisibleSelectionInDOMTree().isValidFor(*m_frame->document()));
   return m_frameCaret->absoluteCaretBounds();
 }
 
@@ -547,9 +555,9 @@
   // needs to be audited.  See http://crbug.com/590369 for more details.
   document().updateStyleAndLayoutIgnorePendingStylesheets();
 
-  if (!isStartOfDocument(selection().visibleStart()))
+  if (!isStartOfDocument(computeVisibleSelectionInDOMTree().visibleStart()))
     return;
-  if (!isEndOfDocument(selection().visibleEnd()))
+  if (!isEndOfDocument(computeVisibleSelectionInDOMTree().visibleEnd()))
     return;
 
   // FIXME: This is not yet implemented for cross-process frame relationships.
@@ -622,13 +630,16 @@
   Node* root = nullptr;
   Node* selectStartTarget = nullptr;
   if (isContentEditable()) {
-    root = highestEditableRoot(selection().start());
-    if (Node* shadowRoot = nonBoundaryShadowTreeRootNode(selection().start()))
+    root = highestEditableRoot(
+        computeVisibleSelectionInDOMTreeDeprecated().start());
+    if (Node* shadowRoot = nonBoundaryShadowTreeRootNode(
+            computeVisibleSelectionInDOMTreeDeprecated().start()))
       selectStartTarget = shadowRoot->ownerShadowHost();
     else
       selectStartTarget = root;
   } else {
-    root = nonBoundaryShadowTreeRootNode(selection().start());
+    root = nonBoundaryShadowTreeRootNode(
+        computeVisibleSelectionInDOMTreeDeprecated().start());
     if (root) {
       selectStartTarget = root->ownerShadowHost();
     } else {
@@ -1029,7 +1040,7 @@
 #ifndef NDEBUG
 
 void FrameSelection::showTreeForThis() const {
-  selection().showTreeForThis();
+  computeVisibleSelectionInDOMTreeDeprecated().showTreeForThis();
 }
 
 #endif
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h
index 1d74004..af41e3b 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.h
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -104,15 +104,20 @@
   Document& document() const;
   LocalFrame* frame() const { return m_frame; }
   Element* rootEditableElement() const {
-    return selection().rootEditableElement();
+    return computeVisibleSelectionInDOMTreeDeprecated().rootEditableElement();
   }
   Element* rootEditableElementOrDocumentElement() const;
   ContainerNode* rootEditableElementOrTreeScopeRootNode() const;
 
-  bool hasEditableStyle() const { return selection().hasEditableStyle(); }
-  bool isContentEditable() const { return selection().isContentEditable(); }
+  bool hasEditableStyle() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().hasEditableStyle();
+  }
+  bool isContentEditable() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().isContentEditable();
+  }
   bool isContentRichlyEditable() const {
-    return selection().isContentRichlyEditable();
+    return computeVisibleSelectionInDOMTreeDeprecated()
+        .isContentRichlyEditable();
   }
 
   // An implementation of |WebFrame::moveCaretSelection()|
@@ -121,7 +126,11 @@
   const VisibleSelection& computeVisibleSelectionInDOMTree() const;
   const VisibleSelectionInFlatTree& computeVisibleSelectionInFlatTree() const;
 
-  const VisibleSelection& selection() const;
+  // TODO(editing-dev): We should replace
+  // |computeVisibleSelectionInDOMTreeDeprecated()| with update layout and
+  // |computeVisibleSelectionInDOMTree()| to increase places hoisting update
+  // layout.
+  const VisibleSelection& computeVisibleSelectionInDOMTreeDeprecated() const;
 
   void setSelection(const SelectionInDOMTree&,
                     SetSelectionOptions = CloseTyping | ClearTypingStyle,
@@ -163,7 +172,7 @@
   bool contains(const LayoutPoint&);
 
   SelectionType getSelectionType() const {
-    return selection().getSelectionType();
+    return computeVisibleSelectionInDOMTreeDeprecated().getSelectionType();
   }
 
   TextAffinity affinity() const { return selectionInDOMTree().affinity(); }
@@ -186,10 +195,18 @@
 
   TextGranularity granularity() const { return m_granularity; }
 
-  Position base() const { return selection().base(); }
-  Position extent() const { return selection().extent(); }
-  Position start() const { return selection().start(); }
-  Position end() const { return selection().end(); }
+  Position base() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().base();
+  }
+  Position extent() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().extent();
+  }
+  Position start() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().start();
+  }
+  Position end() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().end();
+  }
 
   // Returns true if specified layout block should paint caret. This function is
   // called during painting only.
@@ -202,9 +219,15 @@
 
   const SelectionInDOMTree& selectionInDOMTree() const;
   // TODO(yosin): We should rename |isNone()| to |isVisibleNone()|.
-  bool isNone() const { return selection().isNone(); }
-  bool isCaret() const { return selection().isCaret(); }
-  bool isRange() const { return selection().isRange(); }
+  bool isNone() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().isNone();
+  }
+  bool isCaret() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().isCaret();
+  }
+  bool isRange() const {
+    return computeVisibleSelectionInDOMTreeDeprecated().isRange();
+  }
   bool isInPasswordField() const;
   bool isDirectional() const { return selectionInDOMTree().isDirectional(); }
 
diff --git a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
index a0749ae..ddfaa7f 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
@@ -31,7 +31,7 @@
 class FrameSelectionTest : public EditingTestBase {
  protected:
   const VisibleSelection& visibleSelectionInDOMTree() const {
-    return selection().selection();
+    return selection().computeVisibleSelectionInDOMTreeDeprecated();
   }
   const VisibleSelectionInFlatTree& visibleSelectionInFlatTree() const {
     return selection().selectionInFlatTree();
@@ -206,7 +206,7 @@
   SelectionControllerTest() = default;
 
   const VisibleSelection& visibleSelectionInDOMTree() const {
-    return selection().selection();
+    return selection().computeVisibleSelectionInDOMTreeDeprecated();
   }
 
   const VisibleSelectionInFlatTree& visibleSelectionInFlatTree() const {
diff --git a/third_party/WebKit/Source/core/editing/GranularityStrategy.cpp b/third_party/WebKit/Source/core/editing/GranularityStrategy.cpp
index 62d82b70..26c3c82 100644
--- a/third_party/WebKit/Source/core/editing/GranularityStrategy.cpp
+++ b/third_party/WebKit/Source/core/editing/GranularityStrategy.cpp
@@ -67,7 +67,8 @@
     LocalFrame* frame) {
   const VisiblePosition& extentPosition =
       visiblePositionForContentsPoint(extentPoint, frame);
-  const VisibleSelection& selection = frame->selection().selection();
+  const VisibleSelection& selection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (selection.visibleBase().deepEquivalent() ==
       extentPosition.deepEquivalent())
     return selection;
@@ -99,7 +100,8 @@
 VisibleSelection DirectionGranularityStrategy::updateExtent(
     const IntPoint& extentPoint,
     LocalFrame* frame) {
-  const VisibleSelection& selection = frame->selection().selection();
+  const VisibleSelection& selection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
 
   if (m_state == StrategyState::Cleared)
     m_state = StrategyState::Expanding;
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
index e84573a..01eaa00 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
@@ -675,7 +675,8 @@
 }
 
 PlainTextRange InputMethodController::getSelectionOffsets() const {
-  EphemeralRange range = firstEphemeralRangeOf(frame().selection().selection());
+  EphemeralRange range = firstEphemeralRangeOf(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated());
   if (range.isNull())
     return PlainTextRange();
   ContainerNode* editable =
@@ -907,8 +908,8 @@
   if (info.value.isEmpty())
     return info;
 
-  EphemeralRange firstRange =
-      firstEphemeralRangeOf(frame().selection().selection());
+  EphemeralRange firstRange = firstEphemeralRangeOf(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated());
   if (firstRange.isNotNull()) {
     PlainTextRange plainTextRange(PlainTextRange::create(*element, firstRange));
     if (plainTextRange.isNotNull()) {
@@ -1025,7 +1026,10 @@
   // It's important to preserve the equivalence of textInputInfo().type and
   // textInputType(), so perform the same rootEditableElement() existence check
   // here for consistency.
-  if (!frame().selection().selection().rootEditableElement())
+  if (!frame()
+           .selection()
+           .computeVisibleSelectionInDOMTreeDeprecated()
+           .rootEditableElement())
     return WebTextInputTypeNone;
 
   if (!isAvailable())
diff --git a/third_party/WebKit/Source/core/editing/PendingSelection.cpp b/third_party/WebKit/Source/core/editing/PendingSelection.cpp
index 2a98762..1aca83e8 100644
--- a/third_party/WebKit/Source/core/editing/PendingSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/PendingSelection.cpp
@@ -35,7 +35,7 @@
     : m_frameSelection(&frameSelection), m_hasPendingSelection(false) {}
 
 const VisibleSelection& PendingSelection::visibleSelection() const {
-  return m_frameSelection->selection();
+  return m_frameSelection->computeVisibleSelectionInDOMTree();
 }
 
 static bool isSelectionInDocument(
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp
index 5328509..be8d850 100644
--- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
@@ -344,8 +344,9 @@
   m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
   const PositionWithAffinity& rawTargetPosition =
-      positionRespectingEditingBoundary(selection().selection().start(),
-                                        hitTestResult.localPoint(), target);
+      positionRespectingEditingBoundary(
+          selection().computeVisibleSelectionInDOMTreeDeprecated().start(),
+          hitTestResult.localPoint(), target);
   VisiblePositionInFlatTree targetPosition = createVisiblePosition(
       fromPositionInDOMTree<EditingInFlatTreeStrategy>(rawTargetPosition));
   // Don't modify the selection if we're not on a node.
diff --git a/third_party/WebKit/Source/core/editing/SelectionControllerTest.cpp b/third_party/WebKit/Source/core/editing/SelectionControllerTest.cpp
index 15d8c3e..2d856bd 100644
--- a/third_party/WebKit/Source/core/editing/SelectionControllerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionControllerTest.cpp
@@ -17,7 +17,7 @@
   SelectionControllerTest() = default;
 
   const VisibleSelection& visibleSelectionInDOMTree() const {
-    return selection().selection();
+    return selection().computeVisibleSelectionInDOMTreeDeprecated();
   }
 
   const VisibleSelectionInFlatTree& visibleSelectionInFlatTree() const {
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
index 8abdcb4c..d14f4be6 100644
--- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
@@ -2652,9 +2652,11 @@
   HitTestResult result(request, contentsPoint);
   frame->document()->layoutViewItem().hitTest(result);
 
-  if (Node* node = result.innerNode())
+  if (Node* node = result.innerNode()) {
     return createVisiblePosition(positionRespectingEditingBoundary(
-        frame->selection().selection().start(), result.localPoint(), node));
+        frame->selection().computeVisibleSelectionInDOMTreeDeprecated().start(),
+        result.localPoint(), node));
+  }
   return VisiblePosition();
 }
 
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
index aa29a5f5..d7391d43 100644
--- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
@@ -81,7 +81,9 @@
 
 CompositeEditCommand::CompositeEditCommand(Document& document)
     : EditCommand(document) {
-  setStartingSelection(document.frame()->selection().selection());
+  setStartingSelection(document.frame()
+                           ->selection()
+                           .computeVisibleSelectionInDOMTreeDeprecated());
   setEndingVisibleSelection(m_startingSelection);
 }
 
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
index 097528b5..2c123d2 100644
--- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -196,7 +196,8 @@
     SelectionDirection direction,
     TextGranularity granularity) {
   frame.document()->updateStyleAndLayoutIgnorePendingStylesheets();
-  SelectionModifier selectionModifier(frame, frame.selection().selection());
+  SelectionModifier selectionModifier(
+      frame, frame.selection().computeVisibleSelectionInDOMTreeDeprecated());
   if (selectionModifier.selection().isCaret())
     selectionModifier.modify(FrameSelection::AlterationExtend, direction,
                              granularity);
@@ -293,7 +294,7 @@
                                      CSSValue* value) {
   EditingStyle* selectionStyle =
       EditingStyleUtilities::createStyleAtSelectionStart(
-          frame.selection().selection());
+          frame.selection().computeVisibleSelectionInDOMTreeDeprecated());
   if (!selectionStyle || !selectionStyle->style())
     return false;
 
@@ -388,8 +389,12 @@
                                          TextGranularity granularity) {
   const VisibleSelection& selection = createVisibleSelection(
       SelectionInDOMTree::Builder()
-          .setBaseAndExtent(frame.selection().selection().base(),
-                            frame.selection().selection().extent())
+          .setBaseAndExtent(frame.selection()
+                                .computeVisibleSelectionInDOMTreeDeprecated()
+                                .base(),
+                            frame.selection()
+                                .computeVisibleSelectionInDOMTreeDeprecated()
+                                .extent())
           .setGranularity(granularity)
           .build());
   const EphemeralRange newRange = selection.toNormalizedEphemeralRange();
@@ -411,13 +416,16 @@
 static TriState selectionListState(const FrameSelection& selection,
                                    const QualifiedName& tagName) {
   if (selection.isCaret()) {
-    if (enclosingElementWithTag(selection.selection().start(), tagName))
+    if (enclosingElementWithTag(
+            selection.computeVisibleSelectionInDOMTreeDeprecated().start(),
+            tagName))
       return TrueTriState;
   } else if (selection.isRange()) {
-    Element* startElement =
-        enclosingElementWithTag(selection.selection().start(), tagName);
-    Element* endElement =
-        enclosingElementWithTag(selection.selection().end(), tagName);
+    Element* startElement = enclosingElementWithTag(
+        selection.computeVisibleSelectionInDOMTreeDeprecated().start(),
+        tagName);
+    Element* endElement = enclosingElementWithTag(
+        selection.computeVisibleSelectionInDOMTreeDeprecated().end(), tagName);
 
     if (startElement && endElement && startElement == endElement) {
       // If the selected list has the different type of list as child, return
@@ -459,8 +467,8 @@
   bool hasNestedOrMultipleEmbeddings;
   WritingDirection selectionDirection =
       EditingStyleUtilities::textDirectionForSelection(
-          frame.selection().selection(), frame.editor().typingStyle(),
-          hasNestedOrMultipleEmbeddings);
+          frame.selection().computeVisibleSelectionInDOMTreeDeprecated(),
+          frame.editor().typingStyle(), hasNestedOrMultipleEmbeddings);
   // FXIME: We should be returning MixedTriState when selectionDirection ==
   // direction && hasNestedOrMultipleEmbeddings
   return (selectionDirection == direction && !hasNestedOrMultipleEmbeddings)
@@ -689,7 +697,8 @@
       return false;
   }
   frame.editor().performDelete();
-  frame.editor().setMark(frame.selection().selection());
+  frame.editor().setMark(
+      frame.selection().computeVisibleSelectionInDOMTreeDeprecated());
   return true;
 }
 
@@ -1661,7 +1670,8 @@
                            Event*,
                            EditorCommandSource,
                            const String&) {
-  frame.editor().setMark(frame.selection().selection());
+  frame.editor().setMark(
+      frame.selection().computeVisibleSelectionInDOMTreeDeprecated());
   return true;
 }
 
@@ -1715,7 +1725,8 @@
                                 EditorCommandSource,
                                 const String&) {
   const VisibleSelection& mark = frame.editor().mark();
-  const VisibleSelection& selection = frame.selection().selection();
+  const VisibleSelection& selection =
+      frame.selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (mark.isNone() || selection.isNone())
     return false;
   frame.selection().setSelection(mark);
@@ -2060,7 +2071,8 @@
 }
 
 static String valueFormatBlock(LocalFrame& frame, Event*) {
-  const VisibleSelection& selection = frame.selection().selection();
+  const VisibleSelection& selection =
+      frame.selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (!selection.isNonOrphanedCaretOrRange() || !selection.isContentEditable())
     return "";
   Element* formatBlockElement =
diff --git a/third_party/WebKit/Source/core/editing/commands/RemoveFormatCommand.cpp b/third_party/WebKit/Source/core/editing/commands/RemoveFormatCommand.cpp
index 96197db..8132dae 100644
--- a/third_party/WebKit/Source/core/editing/commands/RemoveFormatCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/RemoveFormatCommand.cpp
@@ -58,7 +58,9 @@
 void RemoveFormatCommand::doApply(EditingState* editingState) {
   LocalFrame* frame = document().frame();
 
-  if (!frame->selection().selection().isNonOrphanedCaretOrRange())
+  if (!frame->selection()
+           .computeVisibleSelectionInDOMTreeDeprecated()
+           .isNonOrphanedCaretOrRange())
     return;
 
   // Get the default style for this editable root, it's the style that we'll
diff --git a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
index 96643333..ab9a3abc 100644
--- a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
@@ -80,7 +80,8 @@
 }
 
 PlainTextRange getSelectionOffsets(LocalFrame* frame) {
-  EphemeralRange range = firstEphemeralRangeOf(frame->selection().selection());
+  EphemeralRange range = firstEphemeralRangeOf(
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated());
   if (range.isNull())
     return PlainTextRange();
   ContainerNode* editable =
@@ -230,7 +231,8 @@
     TypingCommand* typingCommand,
     LocalFrame* frame) {
   DCHECK(frame);
-  VisibleSelection currentSelection = frame->selection().selection();
+  VisibleSelection currentSelection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (currentSelection == typingCommand->endingSelection())
     return;
 
@@ -250,8 +252,9 @@
     document.frame()->spellChecker().updateMarkersForWordsAffectedByEditing(
         isSpaceOrNewline(text[0]));
 
-  insertText(document, text, frame->selection().selection(), options,
-             composition, isIncrementalInsertion);
+  insertText(document, text,
+             frame->selection().computeVisibleSelectionInDOMTreeDeprecated(),
+             options, composition, isIncrementalInsertion);
 }
 
 void TypingCommand::adjustSelectionAfterIncrementalInsertion(
@@ -264,7 +267,9 @@
   // needs to be audited. see http://crbug.com/590369 for more details.
   frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
-  Element* element = frame->selection().selection().rootEditableElement();
+  Element* element = frame->selection()
+                         .computeVisibleSelectionInDOMTreeDeprecated()
+                         .rootEditableElement();
   DCHECK(element);
 
   const size_t end = m_selectionStart + textLength;
@@ -273,7 +278,10 @@
   const SelectionInDOMTree& selection =
       createSelection(start, end, endingSelection().isDirectional(), element);
 
-  if (selection == frame->selection().selection().asSelection())
+  if (selection ==
+      frame->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .asSelection())
     return;
 
   setEndingSelection(selection);
@@ -291,7 +299,8 @@
   LocalFrame* frame = document.frame();
   DCHECK(frame);
 
-  VisibleSelection currentSelection = frame->selection().selection();
+  VisibleSelection currentSelection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
 
   String newText = text;
   if (compositionType != TextCompositionUpdate)
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
index 503eb21..bd4b4a3 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -235,7 +235,9 @@
 }
 
 void SpellChecker::ignoreSpelling() {
-  removeMarkers(frame().selection().selection(), DocumentMarker::Spelling);
+  removeMarkers(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated(),
+      DocumentMarker::Spelling);
 }
 
 void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) {
@@ -248,7 +250,8 @@
 
   // Start at the end of the selection, search to edge of document. Starting at
   // the selection end makes repeated "check spelling" commands work.
-  VisibleSelection selection(frame().selection().selection());
+  VisibleSelection selection(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated());
   Position spellingSearchStart, spellingSearchEnd;
   Range::selectNodeContents(frame().document(), spellingSearchStart,
                             spellingSearchEnd);
@@ -709,7 +712,8 @@
     bool doNotRemoveIfSelectionAtWordBoundary) {
   DCHECK(frame().selection().isAvailable());
   TRACE_EVENT0("blink", "SpellChecker::updateMarkersForWordsAffectedByEditing");
-  if (!isSpellCheckingEnabledFor(frame().selection().selection()))
+  if (!isSpellCheckingEnabledFor(
+          frame().selection().computeVisibleSelectionInDOMTreeDeprecated()))
     return;
 
   Document* document = frame().document();
@@ -730,8 +734,15 @@
   // that fall on the boundaries of selection, and remove words between the
   // selection boundaries.
   VisiblePosition startOfSelection =
-      frame().selection().selection().visibleStart();
-  VisiblePosition endOfSelection = frame().selection().selection().visibleEnd();
+      frame()
+          .selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .visibleStart();
+  VisiblePosition endOfSelection =
+      frame()
+          .selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .visibleEnd();
   if (startOfSelection.isNull())
     return;
   // First word is the word that ends after or on the start of selection.
@@ -832,8 +843,10 @@
 }
 
 void SpellChecker::replaceMisspelledRange(const String& text) {
-  EphemeralRange caretRange =
-      frame().selection().selection().toNormalizedEphemeralRange();
+  EphemeralRange caretRange = frame()
+                                  .selection()
+                                  .computeVisibleSelectionInDOMTreeDeprecated()
+                                  .toNormalizedEphemeralRange();
   if (caretRange.isNull())
     return;
   DocumentMarkerVector markers = frame().document()->markers().markersInRange(
@@ -929,7 +942,8 @@
       frame().document()->lifecycle());
 
   VisibleSelection newAdjacentWords;
-  const VisibleSelection newSelection = frame().selection().selection();
+  const VisibleSelection newSelection =
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (newSelection.isContentEditable()) {
     newAdjacentWords =
         createVisibleSelection(selectWord(newSelection.visibleStart()));
@@ -961,10 +975,16 @@
   if (RuntimeEnabledFeatures::idleTimeSpellCheckingEnabled())
     return;
 
-  if (!frame().selection().selection().isContentEditable())
+  if (!frame()
+           .selection()
+           .computeVisibleSelectionInDOMTreeDeprecated()
+           .isContentEditable())
     return;
 
-  if (isPositionInTextField(frame().selection().selection().start())) {
+  if (isPositionInTextField(frame()
+                                .selection()
+                                .computeVisibleSelectionInDOMTreeDeprecated()
+                                .start())) {
     // textFieldDidEndEditing() and textFieldDidBeginEditing() handle this.
     return;
   }
@@ -979,7 +999,9 @@
       frame().document()->lifecycle());
 
   VisibleSelection empty;
-  spellCheckOldSelection(frame().selection().selection().start(), empty);
+  spellCheckOldSelection(
+      frame().selection().computeVisibleSelectionInDOMTreeDeprecated().start(),
+      empty);
 }
 
 void SpellChecker::spellCheckOldSelection(
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
index 05bf0a8..39e6852 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
@@ -48,7 +48,11 @@
   input->focus();
   input->setValue("Hello, input field");
   document().updateStyleAndLayout();
-  VisibleSelection oldSelection = document().frame()->selection().selection();
+  VisibleSelection oldSelection =
+      document()
+          .frame()
+          ->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated();
 
   Position newPosition(input->innerEditorElement()->firstChild(), 3);
   document().frame()->selection().setSelection(
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
index 3d6ecea..f2bd3f1a 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -64,7 +64,7 @@
 
 Location* DOMWindow::location() const {
   if (!m_location)
-    m_location = Location::create(frame());
+    m_location = Location::create(const_cast<DOMWindow*>(this));
   return m_location.get();
 }
 
@@ -147,15 +147,6 @@
   return true;
 }
 
-void DOMWindow::resetLocation() {
-  // Location needs to be reset manually so that it doesn't retain a stale
-  // Frame pointer.
-  if (m_location) {
-    m_location->reset();
-    m_location = nullptr;
-  }
-}
-
 void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message,
                             const MessagePortArray& ports,
                             const String& targetOrigin,
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.h b/third_party/WebKit/Source/core/frame/DOMWindow.h
index c1d2bb8..9d1a2c3 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.h
@@ -98,8 +98,6 @@
   // See https://bugs.webkit.org/show_bug.cgi?id=62054
   bool isCurrentlyDisplayedInFrame() const;
 
-  void resetLocation();
-
   bool isSecureContext() const;
 
   InputDeviceCapabilitiesConstants* getInputDeviceCapabilities();
diff --git a/third_party/WebKit/Source/core/frame/Frame.cpp b/third_party/WebKit/Source/core/frame/Frame.cpp
index 36729ad4..088d8401 100644
--- a/third_party/WebKit/Source/core/frame/Frame.cpp
+++ b/third_party/WebKit/Source/core/frame/Frame.cpp
@@ -72,7 +72,6 @@
 void Frame::detach(FrameDetachType type) {
   ASSERT(m_client);
   m_client->setOpener(0);
-  domWindow()->resetLocation();
   disconnectOwnerElement();
   // After this, we must no longer talk to the client since this clears
   // its owning reference back to our owning LocalFrame.
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 4fda1a2..824c132 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -480,7 +480,6 @@
 }
 
 void LocalDOMWindow::frameDestroyed() {
-  resetLocation();
   removeAllEventListeners();
   disconnectFromFrame();
 }
diff --git a/third_party/WebKit/Source/core/frame/Location.cpp b/third_party/WebKit/Source/core/frame/Location.cpp
index 44ee661..d030155 100644
--- a/third_party/WebKit/Source/core/frame/Location.cpp
+++ b/third_party/WebKit/Source/core/frame/Location.cpp
@@ -34,6 +34,7 @@
 #include "core/dom/DOMURLUtilsReadOnly.h"
 #include "core/dom/Document.h"
 #include "core/dom/ExceptionCode.h"
+#include "core/frame/DOMWindow.h"
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/LocalFrame.h"
 #include "core/loader/FrameLoader.h"
@@ -43,14 +44,14 @@
 
 namespace blink {
 
-Location::Location(Frame* frame) : m_frame(frame) {}
+Location::Location(DOMWindow* domWindow) : m_domWindow(domWindow) {}
 
 DEFINE_TRACE(Location) {
-  visitor->trace(m_frame);
+  visitor->trace(m_domWindow);
 }
 
 inline const KURL& Location::url() const {
-  const KURL& url = toLocalFrame(m_frame)->document()->url();
+  const KURL& url = document()->url();
   if (!url.isValid()) {
     // Use "about:blank" while the page is still loading (before we have a
     // frame).
@@ -61,59 +62,42 @@
 }
 
 String Location::href() const {
-  if (!m_frame)
-    return String();
-
   return url().strippedForUseAsHref();
 }
 
 String Location::protocol() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::protocol(url());
 }
 
 String Location::host() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::host(url());
 }
 
 String Location::hostname() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::hostname(url());
 }
 
 String Location::port() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::port(url());
 }
 
 String Location::pathname() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::pathname(url());
 }
 
 String Location::search() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::search(url());
 }
 
 String Location::origin() const {
-  if (!m_frame)
-    return String();
   return DOMURLUtilsReadOnly::origin(url());
 }
 
 DOMStringList* Location::ancestorOrigins() const {
   DOMStringList* origins = DOMStringList::create();
-  if (!m_frame)
+  if (!isAttached())
     return origins;
-  for (Frame* frame = m_frame->tree().parent(); frame;
+  for (Frame* frame = m_domWindow->frame()->tree().parent(); frame;
        frame = frame->tree().parent()) {
     origins->append(frame->securityContext()->getSecurityOrigin()->toString());
   }
@@ -121,9 +105,6 @@
 }
 
 String Location::hash() const {
-  if (!m_frame)
-    return String();
-
   return DOMURLUtilsReadOnly::hash(url());
 }
 
@@ -131,8 +112,6 @@
                        LocalDOMWindow* enteredWindow,
                        const String& url,
                        ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
   setLocation(url, currentWindow, enteredWindow, &exceptionState);
 }
 
@@ -140,9 +119,7 @@
                            LocalDOMWindow* enteredWindow,
                            const String& protocol,
                            ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   if (!url.setProtocol(protocol)) {
     exceptionState.throwDOMException(
         SyntaxError, "'" + protocol + "' is an invalid protocol.");
@@ -155,9 +132,7 @@
                        LocalDOMWindow* enteredWindow,
                        const String& host,
                        ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   url.setHostAndPort(host);
   setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState);
 }
@@ -166,9 +141,7 @@
                            LocalDOMWindow* enteredWindow,
                            const String& hostname,
                            ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   url.setHost(hostname);
   setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState);
 }
@@ -177,9 +150,7 @@
                        LocalDOMWindow* enteredWindow,
                        const String& portString,
                        ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   url.setPort(portString);
   setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState);
 }
@@ -188,9 +159,7 @@
                            LocalDOMWindow* enteredWindow,
                            const String& pathname,
                            ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   url.setPath(pathname);
   setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState);
 }
@@ -199,9 +168,7 @@
                          LocalDOMWindow* enteredWindow,
                          const String& search,
                          ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   url.setQuery(search);
   setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState);
 }
@@ -211,9 +178,7 @@
                        const String& hash,
                        ExceptionState& exceptionState) {
   TRACE_EVENT0("blink", "Location::setHash");
-  if (!m_frame)
-    return;
-  KURL url = toLocalFrame(m_frame)->document()->url();
+  KURL url = document()->url();
   String oldFragmentIdentifier = url.fragmentIdentifier();
   String newFragmentIdentifier = hash;
   if (hash[0] == '#')
@@ -239,8 +204,6 @@
     return;
   }
 
-  if (!m_frame)
-    return;
   setLocation(url, currentWindow, enteredWindow, &exceptionState);
 }
 
@@ -248,22 +211,21 @@
                        LocalDOMWindow* enteredWindow,
                        const String& url,
                        ExceptionState& exceptionState) {
-  if (!m_frame)
-    return;
   setLocation(url, currentWindow, enteredWindow, &exceptionState,
               SetLocationPolicy::ReplaceThisFrame);
 }
 
 void Location::reload(LocalDOMWindow* currentWindow) {
-  if (!m_frame)
+  if (!isAttached())
     return;
-  if (toLocalFrame(m_frame)->document()->url().protocolIsJavaScript())
+  if (document()->url().protocolIsJavaScript())
     return;
   FrameLoadType reloadType =
       RuntimeEnabledFeatures::fasterLocationReloadEnabled()
           ? FrameLoadTypeReloadMainResource
           : FrameLoadTypeReload;
-  m_frame->reload(reloadType, ClientRedirectPolicy::ClientRedirect);
+  m_domWindow->frame()->reload(reloadType,
+                               ClientRedirectPolicy::ClientRedirect);
 }
 
 void Location::setLocation(const String& url,
@@ -271,14 +233,13 @@
                            LocalDOMWindow* enteredWindow,
                            ExceptionState* exceptionState,
                            SetLocationPolicy setLocationPolicy) {
-  DCHECK(m_frame);
-  if (!m_frame || !m_frame->host())
+  if (!isAttached())
     return;
 
   if (!currentWindow->frame())
     return;
 
-  if (!currentWindow->frame()->canNavigate(*m_frame)) {
+  if (!currentWindow->frame()->canNavigate(*m_domWindow->frame())) {
     if (exceptionState) {
       exceptionState->throwSecurityError(
           "The current window does not have permission to navigate the target "
@@ -301,8 +262,7 @@
     return;
   }
 
-  if (m_frame->domWindow()->isInsecureScriptAccess(*currentWindow,
-                                                   completedURL))
+  if (m_domWindow->isInsecureScriptAccess(*currentWindow, completedURL))
     return;
 
   V8DOMActivityLogger* activityLogger =
@@ -315,9 +275,18 @@
     argv.push_back(completedURL);
     activityLogger->logEvent("blinkSetAttribute", argv.size(), argv.data());
   }
-  m_frame->navigate(*currentWindow->document(), completedURL,
-                    setLocationPolicy == SetLocationPolicy::ReplaceThisFrame,
-                    UserGestureStatus::None);
+  m_domWindow->frame()->navigate(
+      *currentWindow->document(), completedURL,
+      setLocationPolicy == SetLocationPolicy::ReplaceThisFrame,
+      UserGestureStatus::None);
+}
+
+Document* Location::document() const {
+  return toLocalDOMWindow(m_domWindow)->document();
+}
+
+bool Location::isAttached() const {
+  return m_domWindow->frame() && m_domWindow->frame()->host();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/Location.h b/third_party/WebKit/Source/core/frame/Location.h
index 2618f79..43a58ff 100644
--- a/third_party/WebKit/Source/core/frame/Location.h
+++ b/third_party/WebKit/Source/core/frame/Location.h
@@ -33,28 +33,33 @@
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "core/CoreExport.h"
 #include "core/dom/DOMStringList.h"
+#include "core/frame/DOMWindow.h"
 #include "wtf/text/WTFString.h"
 
 namespace blink {
 
+class Document;
 class LocalDOMWindow;
 class ExceptionState;
-class Frame;
 class KURL;
 
-// This class corresponds to the JS Location API, which is the only DOM API
-// besides Window that is operable in a RemoteFrame. Location needs to be
-// manually updated in DOMWindow::reset() to ensure it doesn't retain a stale
-// Frame pointer.
+// This class corresponds to the Location interface. Location is the only
+// interface besides Window that is accessible cross-origin and must handle
+// remote frames.
+//
+// HTML standard: https://whatwg.org/C/browsers.html#the-location-interface
 class CORE_EXPORT Location final : public GarbageCollected<Location>,
                                    public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static Location* create(Frame* frame) { return new Location(frame); }
+  static Location* create(DOMWindow* domWindow) {
+    return new Location(domWindow);
+  }
 
-  Frame* frame() const { return m_frame.get(); }
-  void reset() { m_frame = nullptr; }
+  DOMWindow* domWindow() const { return m_domWindow.get(); }
+  // TODO(dcheng): Deprecated and will be removed. Do not use in new code!
+  Frame* frame() const { return m_domWindow->frame(); }
 
   void setHref(LocalDOMWindow* currentWindow,
                LocalDOMWindow* enteredWindow,
@@ -120,7 +125,16 @@
   DECLARE_VIRTUAL_TRACE();
 
  private:
-  explicit Location(Frame*);
+  explicit Location(DOMWindow*);
+
+  // Note: it is only valid to call this if this is a Location object for a
+  // LocalDOMWindow.
+  Document* document() const;
+
+  // Returns true if:
+  // (1) the associated Window is the active Window in the frame
+  // (2) and the frame is attached.
+  bool isAttached() const;
 
   enum class SetLocationPolicy { Normal, ReplaceThisFrame };
   void setLocation(const String&,
@@ -131,7 +145,7 @@
 
   const KURL& url() const;
 
-  Member<Frame> m_frame;
+  const Member<DOMWindow> m_domWindow;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/TextControlElement.cpp b/third_party/WebKit/Source/core/html/TextControlElement.cpp
index 2d888db1..0ed399f2 100644
--- a/third_party/WebKit/Source/core/html/TextControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/TextControlElement.cpp
@@ -501,7 +501,8 @@
                               selection.computeStartPosition());
     }
   }
-  const VisibleSelection& visibleSelection = frame->selection().selection();
+  const VisibleSelection& visibleSelection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   return indexForPosition(innerEditorElement(), visibleSelection.start());
 }
 
@@ -531,7 +532,8 @@
                               selection.computeEndPosition());
     }
   }
-  const VisibleSelection& visibleSelection = frame->selection().selection();
+  const VisibleSelection& visibleSelection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   return indexForPosition(innerEditorElement(), visibleSelection.end());
 }
 
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
index cefa6bb..3d5cff44 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
+++ b/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
@@ -830,28 +830,10 @@
       m_durationDisplay.get(),
   };
 
-  int usedWidth = 0;
-
   // TODO(mlamouri): we need a more dynamic way to find out the width of an
   // element.
   const int sliderMargin = 36;  // Sliders have 18px margin on each side.
 
-  // Assume that all controls require 48px, unless we can get the computed
-  // style for the play button.  Since the play button or overflow is always
-  // shown, one of the two buttons should be available the first time we're
-  // called after layout.  This will
-  // also be the first time we have m_panelWidth!=0, so it won't matter if
-  // we get this wrong before that.
-  int minimumWidth = 48;
-  if (m_playButton->layoutObject() && m_playButton->layoutObject()->style()) {
-    const ComputedStyle* style = m_playButton->layoutObject()->style();
-    minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
-  } else if (m_overflowMenu->layoutObject() &&
-             m_overflowMenu->layoutObject()->style()) {
-    const ComputedStyle* style = m_overflowMenu->layoutObject()->style();
-    minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
-  }
-
   if (!m_panelWidth) {
     // No layout yet -- hide everything, then make them show up later.
     // This prevents the wrong controls from being shown briefly
@@ -864,12 +846,27 @@
     return;
   }
 
+  // Assume that all controls require 48px, unless we can get the computed
+  // style for a button. The minimumWidth is recorded and re-use for future
+  // MediaControls instances and future calls to this method given that at the
+  // moment the controls button width is per plataform.
+  // TODO(mlamouri): improve the mechanism without bandaid.
+  static int minimumWidth = 48;
+  if (m_playButton->layoutObject() && m_playButton->layoutObject()->style()) {
+    const ComputedStyle* style = m_playButton->layoutObject()->style();
+    minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
+  } else if (m_overflowMenu->layoutObject() &&
+             m_overflowMenu->layoutObject()->style()) {
+    const ComputedStyle* style = m_overflowMenu->layoutObject()->style();
+    minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
+  }
+
   // Insert an overflow menu. However, if we see that the overflow menu
   // doesn't end up containing at least two elements, we will not display it
   // but instead make place for the first element that was dropped.
   m_overflowMenu->setDoesFit(true);
   m_overflowMenu->setIsWanted(true);
-  usedWidth = minimumWidth;
+  int usedWidth = minimumWidth;
 
   std::list<MediaControlElement*> overflowElements;
   MediaControlElement* firstDisplacedElement = nullptr;
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index e3979db..c96ff69 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -1834,7 +1834,8 @@
   Element* focusedElement =
       overrideTargetElement ? overrideTargetElement : doc->focusedElement();
   FrameSelection& selection = m_frame->selection();
-  Position start = selection.selection().start();
+  Position start =
+      selection.computeVisibleSelectionInDOMTreeDeprecated().start();
   VisualViewport& visualViewport = frameHost()->visualViewport();
 
   if (!overrideTargetElement && start.anchorNode() &&
@@ -1844,7 +1845,8 @@
     doc->updateStyleAndLayoutIgnorePendingStylesheets();
 
     IntRect firstRect = m_frame->editor().firstRectForRange(
-        selection.selection().toNormalizedEphemeralRange());
+        selection.computeVisibleSelectionInDOMTree()
+            .toNormalizedEphemeralRange());
 
     int x = rightAligned ? firstRect.maxX() : firstRect.x();
     // In a multiline edit, firstRect.maxY() would end up on the next line, so
diff --git a/third_party/WebKit/Source/core/input/EventHandlerTest.cpp b/third_party/WebKit/Source/core/input/EventHandlerTest.cpp
index 43835e1..f2646b8 100644
--- a/third_party/WebKit/Source/core/input/EventHandlerTest.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandlerTest.cpp
@@ -135,8 +135,9 @@
   document().frame()->eventHandler().handleMouseReleaseEvent(mouseUpEvent);
 
   ASSERT_TRUE(selection().isRange());
-  Range* range =
-      createRange(selection().selection().toNormalizedEphemeralRange());
+  Range* range = createRange(selection()
+                                 .computeVisibleSelectionInDOMTreeDeprecated()
+                                 .toNormalizedEphemeralRange());
   ASSERT_TRUE(range);
   EXPECT_EQ("Line 1\nLine 2", range->text());
 }
diff --git a/third_party/WebKit/Source/core/input/MouseEventManager.cpp b/third_party/WebKit/Source/core/input/MouseEventManager.cpp
index 874a250..2be66b1a 100644
--- a/third_party/WebKit/Source/core/input/MouseEventManager.cpp
+++ b/third_party/WebKit/Source/core/input/MouseEventManager.cpp
@@ -428,8 +428,9 @@
   if (element && m_frame->selection().isRange()) {
     // TODO(yosin) We should not create |Range| object for calling
     // |isNodeFullyContained()|.
-    if (createRange(
-            m_frame->selection().selection().toNormalizedEphemeralRange())
+    if (createRange(m_frame->selection()
+                        .computeVisibleSelectionInDOMTreeDeprecated()
+                        .toNormalizedEphemeralRange())
             ->isNodeFullyContained(*element) &&
         element->isDescendantOf(m_frame->document()->focusedElement()))
       return WebInputEventResult::NotHandled;
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
index de5d6c01..dc3c3d7c 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
@@ -786,7 +786,8 @@
   if (!frame)
     return;
 
-  VisibleSelection selection = frame->selection().selection();
+  VisibleSelection selection =
+      frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (selection.isCaret()) {
     ts << "caret: position " << selection.start().computeEditingOffset()
        << " of " << nodePosition(selection.start().anchorNode());
diff --git a/third_party/WebKit/Source/core/page/DragController.cpp b/third_party/WebKit/Source/core/page/DragController.cpp
index c07fb62..3ffdd07b 100644
--- a/third_party/WebKit/Source/core/page/DragController.cpp
+++ b/third_party/WebKit/Source/core/page/DragController.cpp
@@ -475,7 +475,7 @@
 
     frame->selection().setSelection(
         SelectionInDOMTree::Builder().collapse(position).build());
-    dragCaret = frame->selection().selection();
+    dragCaret = frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
     range = createRange(dragCaret.toNormalizedEphemeralRange());
   }
   return !frame->selection().isNone() && frame->selection().isContentEditable();
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
index e25a21c..c25e91c 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -1713,7 +1713,10 @@
     return AXRange();
 
   VisibleSelection selection =
-      getLayoutObject()->frame()->selection().selection();
+      getLayoutObject()
+          ->frame()
+          ->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated();
   if (selection.isNone())
     return AXRange();
 
@@ -1780,7 +1783,10 @@
     return AXRange();
 
   VisibleSelection selection =
-      getLayoutObject()->frame()->selection().selection();
+      getLayoutObject()
+          ->frame()
+          ->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated();
   Range* selectionRange = firstRangeOf(selection);
   ContainerNode* parentNode = getNode()->parentNode();
   int nodeIndex = getNode()->nodeIndex();
@@ -1824,7 +1830,8 @@
   if (!axObject || !axObject->isAXLayoutObject())
     return AXRange();
 
-  VisibleSelection selection = layout->frame()->selection().selection();
+  VisibleSelection selection =
+      layout->frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
   TextControlElement* textControl =
       toLayoutTextControl(layout)->textControlElement();
   ASSERT(textControl);
diff --git a/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp b/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
index 5552310..92e913cc 100644
--- a/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
@@ -116,36 +116,20 @@
   m_resourceResponse->setURL(url);
 }
 
-unsigned WebURLResponse::connectionID() const {
-  return m_resourceResponse->connectionID();
-}
-
 void WebURLResponse::setConnectionID(unsigned connectionID) {
   m_resourceResponse->setConnectionID(connectionID);
 }
 
-bool WebURLResponse::connectionReused() const {
-  return m_resourceResponse->connectionReused();
-}
-
 void WebURLResponse::setConnectionReused(bool connectionReused) {
   m_resourceResponse->setConnectionReused(connectionReused);
 }
 
-WebURLLoadTiming WebURLResponse::loadTiming() {
-  return WebURLLoadTiming(m_resourceResponse->resourceLoadTiming());
-}
-
 void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing) {
   RefPtr<ResourceLoadTiming> loadTiming =
       PassRefPtr<ResourceLoadTiming>(timing);
   m_resourceResponse->setResourceLoadTiming(std::move(loadTiming));
 }
 
-WebHTTPLoadInfo WebURLResponse::httpLoadInfo() {
-  return WebHTTPLoadInfo(m_resourceResponse->resourceLoadInfo());
-}
-
 void WebURLResponse::setHTTPLoadInfo(const WebHTTPLoadInfo& value) {
   m_resourceResponse->setResourceLoadInfo(value);
 }
@@ -170,10 +154,6 @@
   m_resourceResponse->setExpectedContentLength(expectedContentLength);
 }
 
-WebString WebURLResponse::textEncodingName() const {
-  return m_resourceResponse->textEncodingName();
-}
-
 void WebURLResponse::setTextEncodingName(const WebString& textEncodingName) {
   m_resourceResponse->setTextEncodingName(textEncodingName);
 }
@@ -231,15 +211,6 @@
     visitor->visitHeader(it->key, it->value);
 }
 
-double WebURLResponse::lastModifiedDate() const {
-  return static_cast<double>(m_resourceResponse->lastModifiedDate());
-}
-
-void WebURLResponse::setLastModifiedDate(double lastModifiedDate) {
-  m_resourceResponse->setLastModifiedDate(
-      static_cast<time_t>(lastModifiedDate));
-}
-
 long long WebURLResponse::appCacheID() const {
   return m_resourceResponse->appCacheID();
 }
@@ -260,10 +231,6 @@
   m_resourceResponse->setHasMajorCertificateErrors(value);
 }
 
-WebSecurityStyle WebURLResponse::getSecurityStyle() const {
-  return static_cast<WebSecurityStyle>(m_resourceResponse->getSecurityStyle());
-}
-
 void WebURLResponse::setSecurityStyle(WebSecurityStyle securityStyle) {
   m_resourceResponse->setSecurityStyle(
       static_cast<ResourceResponse::SecurityStyle>(securityStyle));
@@ -293,46 +260,18 @@
       static_cast<time_t>(webSecurityDetails.validTo), certificate, sctList);
 }
 
-ResourceResponse& WebURLResponse::toMutableResourceResponse() {
-  return *m_resourceResponse;
-}
-
 const ResourceResponse& WebURLResponse::toResourceResponse() const {
   return *m_resourceResponse;
 }
 
-bool WebURLResponse::wasCached() const {
-  return m_resourceResponse->wasCached();
-}
-
 void WebURLResponse::setWasCached(bool value) {
   m_resourceResponse->setWasCached(value);
 }
 
-bool WebURLResponse::wasFetchedViaSPDY() const {
-  return m_resourceResponse->wasFetchedViaSPDY();
-}
-
 void WebURLResponse::setWasFetchedViaSPDY(bool value) {
   m_resourceResponse->setWasFetchedViaSPDY(value);
 }
 
-bool WebURLResponse::wasNpnNegotiated() const {
-  return m_resourceResponse->wasNpnNegotiated();
-}
-
-void WebURLResponse::setWasNpnNegotiated(bool value) {
-  m_resourceResponse->setWasNpnNegotiated(value);
-}
-
-bool WebURLResponse::wasAlternateProtocolAvailable() const {
-  return m_resourceResponse->wasAlternateProtocolAvailable();
-}
-
-void WebURLResponse::setWasAlternateProtocolAvailable(bool value) {
-  m_resourceResponse->setWasAlternateProtocolAvailable(value);
-}
-
 bool WebURLResponse::wasFetchedViaServiceWorker() const {
   return m_resourceResponse->wasFetchedViaServiceWorker();
 }
@@ -341,26 +280,14 @@
   m_resourceResponse->setWasFetchedViaServiceWorker(value);
 }
 
-bool WebURLResponse::wasFetchedViaForeignFetch() const {
-  return m_resourceResponse->wasFetchedViaForeignFetch();
-}
-
 void WebURLResponse::setWasFetchedViaForeignFetch(bool value) {
   m_resourceResponse->setWasFetchedViaForeignFetch(value);
 }
 
-bool WebURLResponse::wasFallbackRequiredByServiceWorker() const {
-  return m_resourceResponse->wasFallbackRequiredByServiceWorker();
-}
-
 void WebURLResponse::setWasFallbackRequiredByServiceWorker(bool value) {
   m_resourceResponse->setWasFallbackRequiredByServiceWorker(value);
 }
 
-WebServiceWorkerResponseType WebURLResponse::serviceWorkerResponseType() const {
-  return m_resourceResponse->serviceWorkerResponseType();
-}
-
 void WebURLResponse::setServiceWorkerResponseType(
     WebServiceWorkerResponseType value) {
   m_resourceResponse->setServiceWorkerResponseType(value);
@@ -382,10 +309,6 @@
   m_resourceResponse->setMultipartBoundary(bytes, size);
 }
 
-WebString WebURLResponse::cacheStorageCacheName() const {
-  return m_resourceResponse->cacheStorageCacheName();
-}
-
 void WebURLResponse::setCacheStorageCacheName(
     const WebString& cacheStorageCacheName) {
   m_resourceResponse->setCacheStorageCacheName(cacheStorageCacheName);
@@ -398,10 +321,6 @@
   m_resourceResponse->setCorsExposedHeaderNames(exposedHeaderNames);
 }
 
-bool WebURLResponse::didServiceWorkerNavigationPreload() const {
-  return m_resourceResponse->didServiceWorkerNavigationPreload();
-}
-
 void WebURLResponse::setDidServiceWorkerNavigationPreload(bool value) {
   m_resourceResponse->setDidServiceWorkerNavigationPreload(value);
 }
@@ -430,26 +349,14 @@
   m_resourceResponse->setRemotePort(remotePort);
 }
 
-long long WebURLResponse::encodedDataLengthForTesting() const {
-  return m_resourceResponse->encodedDataLength();
-}
-
 void WebURLResponse::setEncodedDataLength(long long length) {
   m_resourceResponse->setEncodedDataLength(length);
 }
 
-long long WebURLResponse::encodedBodyLengthForTesting() const {
-  return m_resourceResponse->encodedBodyLength();
-}
-
 void WebURLResponse::addToEncodedBodyLength(long long length) {
   m_resourceResponse->addToEncodedBodyLength(length);
 }
 
-long long WebURLResponse::decodedBodyLengthForTesting() const {
-  return m_resourceResponse->decodedBodyLength();
-}
-
 void WebURLResponse::addToDecodedBodyLength(long long bytes) {
   m_resourceResponse->addToDecodedBodyLength(bytes);
 }
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.cpp b/third_party/WebKit/Source/platform/heap/HeapPage.cpp
index a05ffa8f..c27a79a 100644
--- a/third_party/WebKit/Source/platform/heap/HeapPage.cpp
+++ b/third_party/WebKit/Source/platform/heap/HeapPage.cpp
@@ -1095,14 +1095,7 @@
   // that could be caused by lazy sweeping etc.
   size_t allowedCount = 0;
   size_t forbiddenCount = 0;
-  for (size_t i = sizeof(FreeListEntry); i < size; i++) {
-    if (address[i] == reuseAllowedZapValue)
-      allowedCount++;
-    else if (address[i] == reuseForbiddenZapValue)
-      forbiddenCount++;
-    else
-      ASSERT_NOT_REACHED();
-  }
+  getAllowedAndForbiddenCounts(address, size, allowedCount, forbiddenCount);
   size_t entryCount = size - sizeof(FreeListEntry);
   if (forbiddenCount == entryCount) {
     // If all values in the memory region are reuseForbiddenZapValue,
@@ -1141,6 +1134,22 @@
 
 #if DCHECK_IS_ON() || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) || \
     defined(MEMORY_SANITIZER)
+NO_SANITIZE_MEMORY
+void NEVER_INLINE
+FreeList::getAllowedAndForbiddenCounts(Address address,
+                                       size_t size,
+                                       size_t& allowedCount,
+                                       size_t& forbiddenCount) {
+  for (size_t i = sizeof(FreeListEntry); i < size; i++) {
+    if (address[i] == reuseAllowedZapValue)
+      allowedCount++;
+    else if (address[i] == reuseForbiddenZapValue)
+      forbiddenCount++;
+    else
+      NOTREACHED();
+  }
+}
+
 NO_SANITIZE_ADDRESS
 NO_SANITIZE_MEMORY
 void NEVER_INLINE FreeList::zapFreedMemory(Address address, size_t size) {
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.h b/third_party/WebKit/Source/platform/heap/HeapPage.h
index b72ea740..aa38c8e 100644
--- a/third_party/WebKit/Source/platform/heap/HeapPage.h
+++ b/third_party/WebKit/Source/platform/heap/HeapPage.h
@@ -655,6 +655,7 @@
 
 #if DCHECK_IS_ON() || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) || \
     defined(MEMORY_SANITIZER)
+  static void getAllowedAndForbiddenCounts(Address, size_t, size_t&, size_t&);
   static void zapFreedMemory(Address, size_t);
   static void checkFreedMemoryIsZapped(Address, size_t);
 #endif
diff --git a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp
index e55514d3..8517599 100644
--- a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp
+++ b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp
@@ -76,7 +76,6 @@
 ResourceResponse::ResourceResponse()
     : m_expectedContentLength(0),
       m_httpStatusCode(0),
-      m_lastModifiedDate(0),
       m_wasCached(false),
       m_connectionID(0),
       m_connectionReused(false),
@@ -94,8 +93,6 @@
       m_httpVersion(HTTPVersionUnknown),
       m_appCacheID(0),
       m_wasFetchedViaSPDY(false),
-      m_wasNpnNegotiated(false),
-      m_wasAlternateProtocolAvailable(false),
       m_wasFetchedViaProxy(false),
       m_wasFetchedViaServiceWorker(false),
       m_wasFetchedViaForeignFetch(false),
@@ -117,7 +114,6 @@
       m_expectedContentLength(expectedLength),
       m_textEncodingName(textEncodingName),
       m_httpStatusCode(0),
-      m_lastModifiedDate(0),
       m_wasCached(false),
       m_connectionID(0),
       m_connectionReused(false),
@@ -135,8 +131,6 @@
       m_httpVersion(HTTPVersionUnknown),
       m_appCacheID(0),
       m_wasFetchedViaSPDY(false),
-      m_wasNpnNegotiated(false),
-      m_wasAlternateProtocolAvailable(false),
       m_wasFetchedViaProxy(false),
       m_wasFetchedViaServiceWorker(false),
       m_wasFetchedViaForeignFetch(false),
@@ -160,7 +154,6 @@
   setHTTPStatusText(AtomicString(data->m_httpStatusText));
 
   m_httpHeaderFields.adopt(std::move(data->m_httpHeaders));
-  setLastModifiedDate(data->m_lastModifiedDate);
   setResourceLoadTiming(data->m_resourceLoadTiming.release());
   m_hasMajorCertificateErrors = data->m_hasMajorCertificateErrors;
   m_securityStyle = data->m_securityStyle;
@@ -182,8 +175,6 @@
   m_appCacheManifestURL = data->m_appCacheManifestURL.copy();
   m_multipartBoundary = data->m_multipartBoundary;
   m_wasFetchedViaSPDY = data->m_wasFetchedViaSPDY;
-  m_wasNpnNegotiated = data->m_wasNpnNegotiated;
-  m_wasAlternateProtocolAvailable = data->m_wasAlternateProtocolAvailable;
   m_wasFetchedViaProxy = data->m_wasFetchedViaProxy;
   m_wasFetchedViaServiceWorker = data->m_wasFetchedViaServiceWorker;
   m_wasFetchedViaForeignFetch = data->m_wasFetchedViaForeignFetch;
@@ -222,7 +213,6 @@
   data->m_httpStatusCode = httpStatusCode();
   data->m_httpStatusText = httpStatusText().getString().isolatedCopy();
   data->m_httpHeaders = httpHeaderFields().copyData();
-  data->m_lastModifiedDate = lastModifiedDate();
   if (m_resourceLoadTiming)
     data->m_resourceLoadTiming = m_resourceLoadTiming->deepCopy();
   data->m_hasMajorCertificateErrors = m_hasMajorCertificateErrors;
@@ -248,8 +238,6 @@
   data->m_appCacheManifestURL = m_appCacheManifestURL.copy();
   data->m_multipartBoundary = m_multipartBoundary;
   data->m_wasFetchedViaSPDY = m_wasFetchedViaSPDY;
-  data->m_wasNpnNegotiated = m_wasNpnNegotiated;
-  data->m_wasAlternateProtocolAvailable = m_wasAlternateProtocolAvailable;
   data->m_wasFetchedViaProxy = m_wasFetchedViaProxy;
   data->m_wasFetchedViaServiceWorker = m_wasFetchedViaServiceWorker;
   data->m_wasFetchedViaForeignFetch = m_wasFetchedViaForeignFetch;
@@ -544,14 +532,6 @@
       httpHeaderField(HTTPNames::Content_Type).lower());
 }
 
-void ResourceResponse::setLastModifiedDate(time_t lastModifiedDate) {
-  m_lastModifiedDate = lastModifiedDate;
-}
-
-time_t ResourceResponse::lastModifiedDate() const {
-  return m_lastModifiedDate;
-}
-
 bool ResourceResponse::wasCached() const {
   return m_wasCached;
 }
diff --git a/third_party/WebKit/Source/platform/network/ResourceResponse.h b/third_party/WebKit/Source/platform/network/ResourceResponse.h
index 273dc9a..712228c 100644
--- a/third_party/WebKit/Source/platform/network/ResourceResponse.h
+++ b/third_party/WebKit/Source/platform/network/ResourceResponse.h
@@ -190,12 +190,6 @@
 
   AtomicString httpContentType() const;
 
-  // FIXME: These are used by PluginStream on some platforms. Calculations may
-  // differ from just returning plain Last-Modified header.
-  // Leaving it for now but this should go away in favor of generic solution.
-  void setLastModifiedDate(time_t);
-  time_t lastModifiedDate() const;
-
   // These functions return parsed values of the corresponding response headers.
   // NaN means that the header was not present or had invalid value.
   bool cacheControlContainsNoCache() const;
@@ -262,16 +256,6 @@
   bool wasFetchedViaSPDY() const { return m_wasFetchedViaSPDY; }
   void setWasFetchedViaSPDY(bool value) { m_wasFetchedViaSPDY = value; }
 
-  bool wasNpnNegotiated() const { return m_wasNpnNegotiated; }
-  void setWasNpnNegotiated(bool value) { m_wasNpnNegotiated = value; }
-
-  bool wasAlternateProtocolAvailable() const {
-    return m_wasAlternateProtocolAvailable;
-  }
-  void setWasAlternateProtocolAvailable(bool value) {
-    m_wasAlternateProtocolAvailable = value;
-  }
-
   // See ServiceWorkerResponseInfo::was_fetched_via_service_worker.
   bool wasFetchedViaServiceWorker() const {
     return m_wasFetchedViaServiceWorker;
@@ -394,7 +378,6 @@
   int m_httpStatusCode;
   AtomicString m_httpStatusText;
   HTTPHeaderMap m_httpHeaderFields;
-  time_t m_lastModifiedDate;
   bool m_wasCached : 1;
   unsigned m_connectionID;
   bool m_connectionReused : 1;
@@ -446,15 +429,6 @@
   // Was the resource fetched over SPDY.  See http://dev.chromium.org/spdy
   bool m_wasFetchedViaSPDY;
 
-  // Was the resource fetched over a channel which used
-  // TLS/Next-Protocol-Negotiation (also SPDY related).
-  bool m_wasNpnNegotiated;
-
-  // Was the resource fetched over a channel which specified
-  // "Alternate-Protocol"
-  // (e.g.: Alternate-Protocol: 443:npn-spdy/1).
-  bool m_wasAlternateProtocolAvailable;
-
   // Was the resource fetched over an explicit proxy (HTTP, SOCKS, etc).
   bool m_wasFetchedViaProxy;
 
@@ -541,7 +515,6 @@
   int m_httpStatusCode;
   String m_httpStatusText;
   std::unique_ptr<CrossThreadHTTPHeaderMapData> m_httpHeaders;
-  time_t m_lastModifiedDate;
   RefPtr<ResourceLoadTiming> m_resourceLoadTiming;
   bool m_hasMajorCertificateErrors;
   ResourceResponse::SecurityStyle m_securityStyle;
@@ -554,8 +527,6 @@
   KURL m_appCacheManifestURL;
   Vector<char> m_multipartBoundary;
   bool m_wasFetchedViaSPDY;
-  bool m_wasNpnNegotiated;
-  bool m_wasAlternateProtocolAvailable;
   bool m_wasFetchedViaProxy;
   bool m_wasFetchedViaServiceWorker;
   bool m_wasFetchedViaForeignFetch;
diff --git a/third_party/WebKit/Source/platform/wtf/DEPS b/third_party/WebKit/Source/platform/newwtf/DEPS
similarity index 96%
rename from third_party/WebKit/Source/platform/wtf/DEPS
rename to third_party/WebKit/Source/platform/newwtf/DEPS
index 255ca52..0c1df8d 100644
--- a/third_party/WebKit/Source/platform/wtf/DEPS
+++ b/third_party/WebKit/Source/platform/newwtf/DEPS
@@ -23,6 +23,6 @@
     # To avoid recursive dependency, we impose a blanket ban on using other
     # platform files. Think carefully if you want to relax this restriction.
     "-platform",
-    "+platform/wtf",
+    "+platform/newwtf",
     "-v8",
 ]
diff --git a/third_party/WebKit/Source/platform/wtf/OWNERS b/third_party/WebKit/Source/platform/newwtf/OWNERS
similarity index 100%
rename from third_party/WebKit/Source/platform/wtf/OWNERS
rename to third_party/WebKit/Source/platform/newwtf/OWNERS
diff --git a/third_party/WebKit/Source/platform/newwtf/README.md b/third_party/WebKit/Source/platform/newwtf/README.md
new file mode 100644
index 0000000..8ab2fac
--- /dev/null
+++ b/third_party/WebKit/Source/platform/newwtf/README.md
@@ -0,0 +1,25 @@
+# platform/newwtf (will become platform/wtf eventually)
+
+This is a temporary location where all files under Source/wtf/ will be moved
+eventually. For details about WTF relocation project, see
+[the proposal](https://docs.google.com/document/d/1shS1IZe__auYxjm9FhPbTY2P01FbNTMYRh-nen5gkDo/edit?usp=sharing)
+and
+[the design doc](https://docs.google.com/document/d/1JK26H-1-cD9-s9QLvEfY55H2kgSxRFNPLfjs049Us5w/edit?usp=sharing).
+You can see
+[bug 691465](https://bugs.chromium.org/p/chromium/issues/detail?id=691465)
+for the project's status.
+
+During the project, files in wtf/ are moved to platform/newwtf/ incrementally,
+and redirection headers will be placed in wtf/. So nothing should break in the
+meantime. You can continue including WTF headers like `#include "wtf/Xxx.h"`
+till the next announcement in blink-dev.
+
+Why "new" wtf? We initially named this directory platform/wtf/, but it turned
+out this would cause a warning on win-clang due to MSVC-specific #include
+search order. Basically, we can't have "platform/wtf/Foo.h" and "wtf/Foo.h" at
+the same time, since `#include "wtf/Foo.h"` may imply platform/wtf/Foo.h
+depending on the context. We don't want to turn off this warning Blink-wide,
+and that's why we have platform/newwtf/.
+
+platform/newwtf/ will be renamed to platform/wtf/ after we get rid of wtf/
+completely.
diff --git a/third_party/WebKit/Source/platform/wtf/README.md b/third_party/WebKit/Source/platform/wtf/README.md
deleted file mode 100644
index e61a5014..0000000
--- a/third_party/WebKit/Source/platform/wtf/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# platform/wtf
-
-This is the location where all the files under Source/wtf will be moved
-eventually. See
-[the proposal](https://docs.google.com/document/d/1shS1IZe__auYxjm9FhPbTY2P01FbNTMYRh-nen5gkDo/edit?usp=sharing)
-and
-[the design doc](https://docs.google.com/document/d/1JK26H-1-cD9-s9QLvEfY55H2kgSxRFNPLfjs049Us5w/edit?usp=sharing)
-regarding the relocation project. For the project's progress, see
-[bug 691465](https://bugs.chromium.org/p/chromium/issues/detail?id=691465).
-
-During the project, files in wtf/ are moved to platform/wtf incrementally, and
-redirection headers will be placed in wtf/. So nothing should break in the
-meantime. You can continue including WTF headers like `#include "wtf/Xxx.h"`
-till the next announce in blink-dev.
diff --git a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
index f3147fe..52093ffa 100644
--- a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
+++ b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
@@ -109,7 +109,8 @@
 static String selectMisspellingAsync(LocalFrame* selectedFrame,
                                      String& description,
                                      uint32_t& hash) {
-  VisibleSelection selection = selectedFrame->selection().selection();
+  VisibleSelection selection =
+      selectedFrame->selection().computeVisibleSelectionInDOMTreeDeprecated();
   if (selection.isNone())
     return String();
 
diff --git a/third_party/WebKit/Source/web/SpellCheckerClientImpl.cpp b/third_party/WebKit/Source/web/SpellCheckerClientImpl.cpp
index 25a18d4c..4eb94e7 100644
--- a/third_party/WebKit/Source/web/SpellCheckerClientImpl.cpp
+++ b/third_party/WebKit/Source/web/SpellCheckerClientImpl.cpp
@@ -98,7 +98,8 @@
     m_spellCheckThisFieldStatus = SpellCheckForcedOn;
     if (m_webView->focusedCoreFrame()->isLocalFrame()) {
       if (LocalFrame* frame = toLocalFrame(m_webView->focusedCoreFrame())) {
-        VisibleSelection frameSelection = frame->selection().selection();
+        VisibleSelection frameSelection =
+            frame->selection().computeVisibleSelectionInDOMTreeDeprecated();
         // If a selection is in an editable element spell check its content.
         if (Element* rootEditableElement =
                 frameSelection.rootEditableElement()) {
diff --git a/third_party/WebKit/Source/web/TextFinder.cpp b/third_party/WebKit/Source/web/TextFinder.cpp
index 77a2598..37909c5 100644
--- a/third_party/WebKit/Source/web/TextFinder.cpp
+++ b/third_party/WebKit/Source/web/TextFinder.cpp
@@ -125,7 +125,10 @@
   // If the user has selected something since the last Find operation we want
   // to start from there. Otherwise, we start searching from where the last Find
   // operation left off (either a Find or a FindNext operation).
-  VisibleSelection selection(ownerFrame().frame()->selection().selection());
+  VisibleSelection selection(ownerFrame()
+                                 .frame()
+                                 ->selection()
+                                 .computeVisibleSelectionInDOMTreeDeprecated());
   bool activeSelection = !selection.isNone();
   if (activeSelection) {
     m_activeMatch = firstRangeOf(selection);
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
index 8fd20c1..dba0b1d5 100644
--- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
+++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
@@ -466,7 +466,10 @@
     LocalFrame* focusedFrame = page()->focusController().focusedFrame();
     if (focusedFrame) {
       Element* element = focusedFrame->document()->focusedElement();
-      if (element && focusedFrame->selection().selection().isNone()) {
+      if (element &&
+          focusedFrame->selection()
+              .computeVisibleSelectionInDOMTreeDeprecated()
+              .isNone()) {
         // If the selection was cleared while the WebView was not
         // focused, then the focus element shows with a focus ring but
         // no caret and does respond to keyboard inputs.
@@ -559,7 +562,8 @@
     anchor = focus = selection.absoluteCaretBounds();
   } else {
     const EphemeralRange selectedRange =
-        selection.selection().toNormalizedEphemeralRange();
+        selection.computeVisibleSelectionInDOMTree()
+            .toNormalizedEphemeralRange();
     if (selectedRange.isNull())
       return false;
     anchor = localFrame->editor().firstRectForRange(
@@ -576,7 +580,7 @@
   anchor = scaledAnchor;
   focus = scaledFocus;
 
-  if (!selection.selection().isBaseFirst())
+  if (!selection.computeVisibleSelectionInDOMTree().isBaseFirst())
     std::swap(anchor, focus);
   return true;
 }
@@ -594,7 +598,9 @@
   frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
   FrameSelection& selection = frame->selection();
-  if (selection.selection().toNormalizedEphemeralRange().isNull())
+  if (selection.computeVisibleSelectionInDOMTree()
+          .toNormalizedEphemeralRange()
+          .isNull())
     return false;
   start =
       toWebTextDirection(primaryDirectionOf(*selection.start().anchorNode()));
@@ -605,8 +611,11 @@
 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This
 // code needs to be refactored  (http://crbug.com/629721).
 bool WebFrameWidgetImpl::isSelectionAnchorFirst() const {
-  if (const LocalFrame* frame = focusedLocalFrameInWidget())
-    return frame->selection().selection().isBaseFirst();
+  if (const LocalFrame* frame = focusedLocalFrameInWidget()) {
+    return frame->selection()
+        .computeVisibleSelectionInDOMTreeDeprecated()
+        .isBaseFirst();
+  }
   return false;
 }
 
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 2aef884..de2132e 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1094,7 +1094,10 @@
   // needs to be audited.  See http://crbug.com/590369 for more details.
   frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
-  return frame()->selection().selection().toNormalizedEphemeralRange();
+  return frame()
+      ->selection()
+      .computeVisibleSelectionInDOMTreeDeprecated()
+      .toNormalizedEphemeralRange();
 }
 
 WebString WebLocalFrameImpl::selectionAsText() const {
@@ -1150,7 +1153,7 @@
   frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
   return frame()->selection().selectWordAroundPosition(
-      selection.selection().visibleStart());
+      selection.computeVisibleSelectionInDOMTreeDeprecated().visibleStart());
 }
 
 void WebLocalFrameImpl::selectRange(const WebPoint& baseInViewport,
@@ -1737,7 +1740,8 @@
   if (Range* activeMatch = m_textFinder->activeMatch()) {
     // If the user has set the selection since the match was found, we
     // don't focus anything.
-    VisibleSelection selection(frame()->selection().selection());
+    VisibleSelection selection(
+        frame()->selection().computeVisibleSelectionInDOMTreeDeprecated());
     if (!selection.isNone())
       return;
 
diff --git a/third_party/WebKit/Source/web/WebSurroundingText.cpp b/third_party/WebKit/Source/web/WebSurroundingText.cpp
index e7cec906..1dab1315 100644
--- a/third_party/WebKit/Source/web/WebSurroundingText.cpp
+++ b/third_party/WebKit/Source/web/WebSurroundingText.cpp
@@ -76,8 +76,10 @@
   // needs to be audited.  See http://crbug.com/590369 for more details.
   webFrame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
-  if (Range* range = createRange(
-          webFrame->selection().selection().toNormalizedEphemeralRange())) {
+  if (Range* range =
+          createRange(webFrame->selection()
+                          .computeVisibleSelectionInDOMTreeDeprecated()
+                          .toNormalizedEphemeralRange())) {
     // TODO(xiaochengh): The followinng SurroundingText can hold a null Range,
     // in which case we should prevent it from being stored in |m_private|.
     m_private.reset(new SurroundingText(*range, maxLength));
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
index 43d2e28a..155c10e 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2267,7 +2267,10 @@
     LocalFrame* focusedFrame = m_page->focusController().focusedFrame();
     if (focusedFrame) {
       Element* element = focusedFrame->document()->focusedElement();
-      if (element && focusedFrame->selection().selection().isNone()) {
+      if (element &&
+          focusedFrame->selection()
+              .computeVisibleSelectionInDOMTreeDeprecated()
+              .isNone()) {
         // If the selection was cleared while the WebView was not
         // focused, then the focus element shows with a focus ring but
         // no caret and does respond to keyboard inputs.
@@ -2368,7 +2371,8 @@
     anchor = focus = selection.absoluteCaretBounds();
   } else {
     const EphemeralRange selectedRange =
-        selection.selection().toNormalizedEphemeralRange();
+        selection.computeVisibleSelectionInDOMTreeDeprecated()
+            .toNormalizedEphemeralRange();
     if (selectedRange.isNull())
       return false;
     anchor = localFrame->editor().firstRectForRange(
@@ -2380,7 +2384,7 @@
   anchor = localFrame->view()->contentsToViewport(anchor);
   focus = localFrame->view()->contentsToViewport(focus);
 
-  if (!selection.selection().isBaseFirst())
+  if (!selection.computeVisibleSelectionInDOMTreeDeprecated().isBaseFirst())
     std::swap(anchor, focus);
   return true;
 }
@@ -2413,7 +2417,9 @@
   // needs to be audited.  See http://crbug.com/590369 for more details.
   frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
-  if (selection.selection().toNormalizedEphemeralRange().isNull())
+  if (selection.computeVisibleSelectionInDOMTree()
+          .toNormalizedEphemeralRange()
+          .isNull())
     return false;
   start =
       toWebTextDirection(primaryDirectionOf(*selection.start().anchorNode()));
@@ -2433,7 +2439,7 @@
     // plugins/mouse-capture-inside-shadow.html reaches here.
     return false;
   }
-  return selection.selection().isBaseFirst();
+  return selection.computeVisibleSelectionInDOMTreeDeprecated().isBaseFirst();
 }
 
 WebColor WebViewImpl::backgroundColor() const {
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index 9ff2b542..ad05184 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -6283,7 +6283,10 @@
   const int allTextLength = 11;
   frame->selectRange(WebRange(allTextBeginOffset, allTextLength));
   EphemeralRange selectionRange =
-      frame->frame()->selection().selection().toNormalizedEphemeralRange();
+      frame->frame()
+          ->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .toNormalizedEphemeralRange();
 
   EXPECT_EQ(1, spellcheck.numberOfTimesChecked());
   EXPECT_EQ(1U, document->markers()
@@ -6322,7 +6325,10 @@
   const int allTextLength = 11;
   frame->selectRange(WebRange(allTextBeginOffset, allTextLength));
   EphemeralRange selectionRange =
-      frame->frame()->selection().selection().toNormalizedEphemeralRange();
+      frame->frame()
+          ->selection()
+          .computeVisibleSelectionInDOMTreeDeprecated()
+          .toNormalizedEphemeralRange();
 
   EXPECT_EQ(0U, document->markers()
                     .markersInRange(selectionRange, DocumentMarker::Spelling)
diff --git a/third_party/WebKit/Source/wtf/DEPS b/third_party/WebKit/Source/wtf/DEPS
index 49c624e5..ce89b4a 100644
--- a/third_party/WebKit/Source/wtf/DEPS
+++ b/third_party/WebKit/Source/wtf/DEPS
@@ -20,7 +20,7 @@
     "+base/time/time.h",
     "+base/tuple.h",
     "+build",
-    # Allow redirection to platform/wtf. See crbug.com/691465.
-    "+platform/wtf",
+    # Allow redirection to platform/newwtf. See crbug.com/691465.
+    "+platform/newwtf",
     "-v8",
 ]
diff --git a/third_party/WebKit/Source/wtf/README.md b/third_party/WebKit/Source/wtf/README.md
index 980a7bac..a65a111 100644
--- a/third_party/WebKit/Source/wtf/README.md
+++ b/third_party/WebKit/Source/wtf/README.md
@@ -1,4 +1,4 @@
 # WTF -- Web Template Framework
 
-The contents in this directory are being moved to platform/wtf. See
-[platform/wtf/README.md](../platform/wtf/README.md) for details.
+The contents in this directory are being moved to platform/newwtf. See
+[platform/newwtf/README.md](../platform/wtf/README.md) for details.
diff --git a/third_party/WebKit/public/platform/WebURLResponse.h b/third_party/WebKit/public/platform/WebURLResponse.h
index 0db0de0..c2697429 100644
--- a/third_party/WebKit/public/platform/WebURLResponse.h
+++ b/third_party/WebKit/public/platform/WebURLResponse.h
@@ -151,16 +151,12 @@
   BLINK_PLATFORM_EXPORT WebURL url() const;
   BLINK_PLATFORM_EXPORT void setURL(const WebURL&);
 
-  BLINK_PLATFORM_EXPORT unsigned connectionID() const;
   BLINK_PLATFORM_EXPORT void setConnectionID(unsigned);
 
-  BLINK_PLATFORM_EXPORT bool connectionReused() const;
   BLINK_PLATFORM_EXPORT void setConnectionReused(bool);
 
-  BLINK_PLATFORM_EXPORT WebURLLoadTiming loadTiming();
   BLINK_PLATFORM_EXPORT void setLoadTiming(const WebURLLoadTiming&);
 
-  BLINK_PLATFORM_EXPORT WebHTTPLoadInfo httpLoadInfo();
   BLINK_PLATFORM_EXPORT void setHTTPLoadInfo(const WebHTTPLoadInfo&);
 
   BLINK_PLATFORM_EXPORT void setResponseTime(long long);
@@ -171,7 +167,6 @@
   BLINK_PLATFORM_EXPORT long long expectedContentLength() const;
   BLINK_PLATFORM_EXPORT void setExpectedContentLength(long long);
 
-  BLINK_PLATFORM_EXPORT WebString textEncodingName() const;
   BLINK_PLATFORM_EXPORT void setTextEncodingName(const WebString&);
 
   BLINK_PLATFORM_EXPORT HTTPVersion httpVersion() const;
@@ -191,9 +186,6 @@
   BLINK_PLATFORM_EXPORT void clearHTTPHeaderField(const WebString& name);
   BLINK_PLATFORM_EXPORT void visitHTTPHeaderFields(WebHTTPHeaderVisitor*) const;
 
-  BLINK_PLATFORM_EXPORT double lastModifiedDate() const;
-  BLINK_PLATFORM_EXPORT void setLastModifiedDate(double);
-
   BLINK_PLATFORM_EXPORT long long appCacheID() const;
   BLINK_PLATFORM_EXPORT void setAppCacheID(long long);
 
@@ -202,53 +194,35 @@
 
   BLINK_PLATFORM_EXPORT void setHasMajorCertificateErrors(bool);
 
-  BLINK_PLATFORM_EXPORT WebSecurityStyle getSecurityStyle() const;
   BLINK_PLATFORM_EXPORT void setSecurityStyle(WebSecurityStyle);
 
   BLINK_PLATFORM_EXPORT void setSecurityDetails(const WebSecurityDetails&);
 
 #if INSIDE_BLINK
-  BLINK_PLATFORM_EXPORT ResourceResponse& toMutableResourceResponse();
   BLINK_PLATFORM_EXPORT const ResourceResponse& toResourceResponse() const;
 #endif
 
   // Flag whether this request was served from the disk cache entry.
-  BLINK_PLATFORM_EXPORT bool wasCached() const;
   BLINK_PLATFORM_EXPORT void setWasCached(bool);
 
   // Flag whether this request was loaded via the SPDY protocol or not.
   // SPDY is an experimental web protocol, see http://dev.chromium.org/spdy
-  BLINK_PLATFORM_EXPORT bool wasFetchedViaSPDY() const;
   BLINK_PLATFORM_EXPORT void setWasFetchedViaSPDY(bool);
 
-  // Flag whether this request was loaded after the
-  // TLS/Next-Protocol-Negotiation was used.  This is related to SPDY.
-  BLINK_PLATFORM_EXPORT bool wasNpnNegotiated() const;
-  BLINK_PLATFORM_EXPORT void setWasNpnNegotiated(bool);
-
-  // Flag whether this request was made when "Alternate-Protocol: xxx"
-  // is present in server's response.
-  BLINK_PLATFORM_EXPORT bool wasAlternateProtocolAvailable() const;
-  BLINK_PLATFORM_EXPORT void setWasAlternateProtocolAvailable(bool);
-
   // Flag whether this request was loaded via a ServiceWorker. See
   // ServiceWorkerResponseInfo::was_fetched_via_service_worker() for details.
   BLINK_PLATFORM_EXPORT bool wasFetchedViaServiceWorker() const;
   BLINK_PLATFORM_EXPORT void setWasFetchedViaServiceWorker(bool);
 
   // Flag whether this request was loaded using a foreign fetch service worker.
-  BLINK_PLATFORM_EXPORT bool wasFetchedViaForeignFetch() const;
   BLINK_PLATFORM_EXPORT void setWasFetchedViaForeignFetch(bool);
 
   // Flag whether the fallback request with skip service worker flag was
   // required. See ServiceWorkerResponseInfo::was_fallback_required() for
   // details.
-  BLINK_PLATFORM_EXPORT bool wasFallbackRequiredByServiceWorker() const;
   BLINK_PLATFORM_EXPORT void setWasFallbackRequiredByServiceWorker(bool);
 
   // The type of the response which was served by the ServiceWorker.
-  BLINK_PLATFORM_EXPORT WebServiceWorkerResponseType
-  serviceWorkerResponseType() const;
   BLINK_PLATFORM_EXPORT void setServiceWorkerResponseType(
       WebServiceWorkerResponseType);
 
@@ -269,19 +243,16 @@
 
   // The cache name of the CacheStorage from where the response is served via
   // the ServiceWorker. Null if the response isn't from the CacheStorage.
-  BLINK_PLATFORM_EXPORT WebString cacheStorageCacheName() const;
   BLINK_PLATFORM_EXPORT void setCacheStorageCacheName(const WebString&);
 
   // The headers that should be exposed according to CORS. Only guaranteed
   // to be set if the response was served by a ServiceWorker.
-  BLINK_PLATFORM_EXPORT WebVector<WebString> corsExposedHeaderNames() const;
   BLINK_PLATFORM_EXPORT void setCorsExposedHeaderNames(
       const WebVector<WebString>&);
 
   // Whether service worker navigation preload occurred.
   // See ServiceWorkerResponseInfo::did_navigation_preload() for
   // details.
-  BLINK_PLATFORM_EXPORT bool didServiceWorkerNavigationPreload() const;
   BLINK_PLATFORM_EXPORT void setDidServiceWorkerNavigationPreload(bool);
 
   // This indicates the location of a downloaded response if the
@@ -299,15 +270,12 @@
   BLINK_PLATFORM_EXPORT void setRemotePort(unsigned short);
 
   // Original size of the response before decompression.
-  BLINK_PLATFORM_EXPORT long long encodedDataLengthForTesting() const;
   BLINK_PLATFORM_EXPORT void setEncodedDataLength(long long);
 
   // Original size of the response body before decompression.
-  BLINK_PLATFORM_EXPORT long long encodedBodyLengthForTesting() const;
   BLINK_PLATFORM_EXPORT void addToEncodedBodyLength(long long);
 
   // Size of the response body after removing any content encoding.
-  BLINK_PLATFORM_EXPORT long long decodedBodyLengthForTesting() const;
   BLINK_PLATFORM_EXPORT void addToDecodedBodyLength(long long);
 
   // Extra data associated with the underlying resource response. Resource