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