diff --git a/.gitattributes b/.gitattributes index a6d3a04b6431..fe066b18c25f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -36,4 +36,4 @@ objc/*.h diff=objcppheader /Source/JavaScriptCore/b3/testb3*.cpp test=1 /Source/JavaScriptCore/b3/air/testair.cpp test=1 /Source/JavaScriptCore/dfg/testdfg.cpp test=1 -/Tools/TestWebKitAPI/**/* test=1 +/Tools/TestWebKitAPI/Tests/**/* test=1 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d0ecbf2c0047..1e33c821a223 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -101,8 +101,6 @@ AllowedSPI*.toml @emw-apple /Source/WebCore/editing @rniwa /LayoutTests/editing @rniwa -/Source/WebCore/Modules/applepay @aprotyas -/Source/WebCore/Modules/applepay-ams-ui @aprotyas /Source/WebCore/Modules/applicationmanifest/ @marcoscaceres /Source/WebCore/Modules/beacon @cdumez /Source/WebCore/Modules/contact-picker @marcoscaceres @@ -110,7 +108,7 @@ AllowedSPI*.toml @emw-apple /Source/WebCore/Modules/geolocation @cdumez @marcoscaceres /Source/WebCore/Modules/model-element @mwyrzykowski @etiennesegonzac /Source/WebCore/Modules/notifications @cdumez -/Source/WebCore/Modules/paymentrequest @aprotyas @marcoscaceres +/Source/WebCore/Modules/paymentrequest @marcoscaceres /Source/WebCore/Modules/permissions @marcoscaceres /Source/WebCore/Modules/credentialmanagement @marcoscaceres /Source/WebCore/Modules/gamepad @marcoscaceres @@ -129,21 +127,21 @@ AllowedSPI*.toml @emw-apple /Source/WebCore/worklets @cdumez /Source/WebCore/xml @cdumez /Source/WebCore/page @cdumez +/Source/WebCore/page/PointerCaptureController.cpp @lilyspiniolas +/Source/WebCore/page/PointerCaptureController.h @lilyspiniolas ./Source/WebCore/page/Navigator.* @marcoscaceres /Source/WebCore/animation @graouts -/LayoutTests/http/tests/paymentrequest @aprotyas @marcoscaceres +/LayoutTests/http/tests/paymentrequest @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/badging @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/contenteditable @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/digital-credentials @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/gamepad @marcoscaceres -/LayoutTests/http/tests/ssl/applepay @aprotyas -/LayoutTests/http/tests/ssl/applepay-ams-ui @aprotyas /LayoutTests/imported/w3c/web-platform-tests/geolocation @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/html/user-activation @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/merchant-validation @marcoscaceres -/LayoutTests/imported/w3c/web-platform-tests/payment-request @aprotyas @marcoscaceres +/LayoutTests/imported/w3c/web-platform-tests/payment-request @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/permissions @marcoscaceres /LayoutTests/imported/w3c/web-platform-tests/resources @gsnedders /LayoutTests/imported/w3c/web-platform-tests/screen-orientation @marcoscaceres @@ -163,9 +161,7 @@ AllowedSPI*.toml @emw-apple /Source/WebKit/NetworkProcess @cdumez /Source/WebKit/NetworkProcess/mac/com.apple.WebKit.NetworkProcess.sb.in @brentfulgham @pvollan /Source/WebKit/Platform @cdumez -/Source/WebKit/Platform/*/Payment* @aprotyas /Source/WebKit/Resources/SandboxProfiles @brentfulgham @pvollan -/Source/WebKit/Shared/ApplePay @aprotyas /Source/WebKit/Shared/Sandbox @brentfulgham @pvollan /Source/WebKit/UIProcess @cdumez /Source/WebKit/UIProcess/Extensions @b-weinstein @xeenon @@ -175,7 +171,6 @@ AllowedSPI*.toml @emw-apple /Source/WebKit/WebProcess @cdumez /Source/WebKit/WebProcess/DigitalCredentials @marcoscaceres /Source/WebKit/WebKitSwift/IdentityDocumentServices @marcoscaceres -/Source/WebKit/WebProcess/ApplePay @aprotyas /Source/WebKit/WebProcess/Extensions @b-weinstein @xeenon /Source/WebKit/WebProcess/Inspector @dcrousso @patrickangle @burg /Source/WebKit/WebProcess/com.apple.WebProcess.sb.in @brentfulgham @pvollan diff --git a/.wkdev-sdk-version b/.wkdev-sdk-version index 0c0de28c02e8..9b6a526b22ed 100644 --- a/.wkdev-sdk-version +++ b/.wkdev-sdk-version @@ -1 +1 @@ -2.53-v5-3bdf4b8 +2.53-v6-d535e88 diff --git a/CMakeLists.txt b/CMakeLists.txt index 0726e8c795c5..0bdbada6264f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,33 +10,38 @@ cmake_minimum_required(VERSION 3.20) if (PORT STREQUAL "IOS") set(CMAKE_SYSTEM_NAME iOS) - if (NOT CMAKE_OSX_SYSROOT) - if (DEFINED ENV{SDKROOT} AND EXISTS "$ENV{SDKROOT}") - set(CMAKE_OSX_SYSROOT "$ENV{SDKROOT}" CACHE PATH "iOS SDK path" FORCE) + if (CMAKE_IOS_SIMULATOR) + set(_sdk_name "iphonesimulator.internal") + set(_sdk_name_fallback "iphonesimulator") + else () + set(_sdk_name "iphoneos.internal") + set(_sdk_name_fallback "iphoneos") + endif () + execute_process(COMMAND xcrun --sdk ${_sdk_name} --show-sdk-path + OUTPUT_VARIABLE _ios_sysroot + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _internal_sdk_result + ERROR_QUIET) + if (NOT _internal_sdk_result EQUAL 0 OR NOT _ios_sysroot) + set(_ios_sysroot "") + if (CMAKE_OSX_SYSROOT AND EXISTS "${CMAKE_OSX_SYSROOT}") + set(_ios_sysroot "${CMAKE_OSX_SYSROOT}") + elseif (DEFINED ENV{SDKROOT} AND EXISTS "$ENV{SDKROOT}" AND "$ENV{SDKROOT}" MATCHES "iPhone") + set(_ios_sysroot "$ENV{SDKROOT}") else () - if (CMAKE_IOS_SIMULATOR) - set(_sdk_name "iphonesimulator.internal") - set(_sdk_name_fallback "iphonesimulator") - else () - set(_sdk_name "iphoneos.internal") - set(_sdk_name_fallback "iphoneos") - endif () - execute_process(COMMAND xcrun --sdk ${_sdk_name} --show-sdk-path + execute_process(COMMAND xcrun --sdk ${_sdk_name_fallback} --show-sdk-path OUTPUT_VARIABLE _ios_sysroot OUTPUT_STRIP_TRAILING_WHITESPACE - RESULT_VARIABLE _internal_sdk_result ERROR_QUIET) - if (NOT _internal_sdk_result EQUAL 0 OR NOT _ios_sysroot) - execute_process(COMMAND xcrun --sdk ${_sdk_name_fallback} --show-sdk-path - OUTPUT_VARIABLE _ios_sysroot - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) - endif () - if (_ios_sysroot) - set(CMAKE_OSX_SYSROOT "${_ios_sysroot}" CACHE PATH "iOS SDK path" FORCE) - endif () endif () endif () + if (_ios_sysroot) + set(CMAKE_OSX_SYSROOT "${_ios_sysroot}" CACHE PATH "iOS SDK path" FORCE) + endif () + unset(_sdk_name) + unset(_sdk_name_fallback) + unset(_internal_sdk_result) + unset(_ios_sysroot) if (NOT CMAKE_OSX_ARCHITECTURES) if (CMAKE_OSX_SYSROOT MATCHES "\\.Internal\\.sdk$" AND NOT CMAKE_OSX_SYSROOT MATCHES "[Ss]imulator") @@ -95,34 +100,19 @@ include(WebKitCommon) # "project()" line #------------------------------------------------------------------------------ if (SWIFT_REQUIRED) - cmake_policy(SET CMP0157 NEW) + if (POLICY CMP0157) + cmake_policy(SET CMP0157 NEW) + endif () # CMake omits -target for swiftc during iOS cross-compilation. - if (PORT STREQUAL "IOS" AND NOT CMAKE_Swift_COMPILER_TARGET) - if (CMAKE_OSX_SYSROOT MATCHES "[Ss]imulator") + if (PORT STREQUAL "IOS") + if (CMAKE_IOS_SIMULATOR OR CMAKE_OSX_SYSROOT MATCHES "[Ss]imulator") set(CMAKE_Swift_COMPILER_TARGET "${CMAKE_OSX_ARCHITECTURES}-apple-ios${CMAKE_OSX_DEPLOYMENT_TARGET}-simulator" CACHE STRING "Swift target triple" FORCE) else () set(CMAKE_Swift_COMPILER_TARGET "${CMAKE_OSX_ARCHITECTURES}-apple-ios${CMAKE_OSX_DEPLOYMENT_TARGET}" CACHE STRING "Swift target triple" FORCE) endif () endif () - if (PORT STREQUAL "IOS") - execute_process(COMMAND xcrun --show-sdk-platform-path - OUTPUT_VARIABLE _ios_platform_path - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) - if (_ios_platform_path) - execute_process(COMMAND find "${_ios_platform_path}" -name swiftc -path "*/xctoolchain/*" -type f -print -quit - OUTPUT_VARIABLE _ios_swiftc - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) - if (_ios_swiftc AND NOT _ios_swiftc STREQUAL CMAKE_Swift_COMPILER) - set(CMAKE_Swift_COMPILER "${_ios_swiftc}" CACHE FILEPATH "Swift compiler" FORCE) - message(STATUS "iOS: using platform-specific Swift compiler: ${_ios_swiftc}") - endif () - endif () - endif () - enable_language(Swift) # -F causes Swift to find C++23 framework headers in implicit module builds. @@ -130,17 +120,12 @@ if (SWIFT_REQUIRED) set(CMAKE_Swift_FRAMEWORK_SEARCH_FLAG "-Xcc -iquote") endif () - # Override Swift compiler to a wrapper script to work around the - # fact CMake feeds incorrect flags to swiftc. - set(_swift_wrapper "${CMAKE_SOURCE_DIR}/Tools/Scripts/swift/swiftc-wrapper.sh") - if (CMAKE_Swift_COMPILER STREQUAL _swift_wrapper) - if (NOT ORIGINAL_Swift_COMPILER) - find_program(ORIGINAL_Swift_COMPILER NAMES swiftc REQUIRED) - endif () + if (APPLE) + WEBKIT_XCRUN(ORIGINAL_Swift_COMPILER --find swiftc) else () - set(ORIGINAL_Swift_COMPILER "${CMAKE_Swift_COMPILER}" CACHE FILEPATH "Original Swift compiler" FORCE) + set(ORIGINAL_Swift_COMPILER "${CMAKE_Swift_COMPILER}") endif () - set(CMAKE_Swift_COMPILER "${_swift_wrapper}") + set(CMAKE_Swift_COMPILER "${CMAKE_SOURCE_DIR}/Tools/Scripts/swift/swiftc-wrapper.sh") add_compile_options($<$:--original-swift-compiler=${ORIGINAL_Swift_COMPILER}>) add_link_options($<$:--original-swift-compiler=${ORIGINAL_Swift_COMPILER}>) # The static archive rule () uses neither @@ -148,7 +133,6 @@ if (SWIFT_REQUIRED) string(REPLACE "" " --original-swift-compiler=${ORIGINAL_Swift_COMPILER}" CMAKE_Swift_CREATE_STATIC_LIBRARY "${CMAKE_Swift_CREATE_STATIC_LIBRARY}") - unset(_swift_wrapper) endif () # ----------------------------------------------------------------------------- diff --git a/CMakePresets.json b/CMakePresets.json index d8982f0f074f..e6d4fc90695a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -92,7 +92,7 @@ }, "CMAKE_MAKE_PROGRAM": { "type": "FILEPATH", - "value": "${sourceDir}/Tools/Scripts/caffeinate-ninja" + "value": "${sourceDir}/Source/cmake/ninja-wrapper" } }, "environment": { diff --git a/Configurations/CommonBase.xcconfig b/Configurations/CommonBase.xcconfig index 93c38fc34db7..b9f977ef6e71 100644 --- a/Configurations/CommonBase.xcconfig +++ b/Configurations/CommonBase.xcconfig @@ -74,6 +74,8 @@ _EXPERIMENTAL_SWIFT_EXPLICIT_MODULES = YES; WK_DEFAULT_COMPILATION_CACHE_ENABLE_CACHING = YES; COMPILATION_CACHE_ENABLE_CACHING = $(WK_DEFAULT_COMPILATION_CACHE_ENABLE_CACHING); +FUSE_BUILD_SCRIPT_PHASES = YES; + WK_COMMON_OTHER_LDFLAGS = $(WK_SANITIZER_OTHER_LDFLAGS) $(WK_COMMON_OTHER_LDFLAGS_INSTRUMENTATION_$(ENABLE_LLVM_PROFILE_GENERATION)); // Work around rdar://151083138 by moving the section the profiling runtime // mmaps to its own segment. @@ -83,7 +85,7 @@ OTHER_LDFLAGS = $(inherited) $(WK_COMMON_OTHER_LDFLAGS); WK_COMMON_OTHER_TAPI_FLAGS = -x objective-c++ -std=c++2b -fno-rtti $(WK_SANITIZER_OTHER_TAPI_FLAGS); OTHER_TAPI_FLAGS = $(inherited) $(WK_COMMON_OTHER_TAPI_FLAGS); -WK_DEFAULT_WK_AUDIT_SPI[sdk=iphoneos*] = $(WK_NOT_$(WK_OR_$(WK_ANY_SANITIZER_ENABLED)_$(OVERRIDE_SUPPORTS_TEXT_BASED_API))); +WK_DEFAULT_WK_AUDIT_SPI[sdk=iphoneos*] = $(WK_AND_$(WK_NOT_$(WK_ANY_SANITIZER_ENABLED))_$(OVERRIDE_SUPPORTS_TEXT_BASED_API:default=YES)); // Explicitly disable auditing on other embedded platforms, because some SDKs // fall back to reading settings for iOS. WK_DEFAULT_WK_AUDIT_SPI[sdk=appletvos*] = ; @@ -127,7 +129,7 @@ WK_SWIFT_CLANG_DEPLOYMENT_TARGET = $(WK_SWIFT_CLANG_DEPLOYMENT_TARGET_$(WK_PLATF WK_SWIFT_CLANG_DEPLOYMENT_TARGET_macosx = -clang-target $(CURRENT_ARCH)-apple-macos$(MACOSX_DEPLOYMENT_TARGET); // rdar://170129992: remove -track-system-dependencies when resolved -OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fvisibility=hidden -Werror ExistentialAny -enable-upcoming-feature ExistentialAny $(WK_SWIFT_MEMORY_SAFETY_FLAGS) $(WK_SWIFT_MEMORY_SAFETY_ERROR_FLAGS) $(WK_SWIFT_CLANG_DEPLOYMENT_TARGET) $(WK_SANITIZER_OTHER_SWIFT_FLAGS) -enable-upcoming-feature InternalImportsByDefault -enable-upcoming-feature MemberImportVisibility -track-system-dependencies -enable-experimental-feature ImportCxxMembersLazily; +OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fvisibility=hidden -Werror ExistentialAny -Werror NoUseUnstructuredThrowingTask -enable-upcoming-feature ExistentialAny $(WK_SWIFT_MEMORY_SAFETY_FLAGS) $(WK_SWIFT_MEMORY_SAFETY_ERROR_FLAGS) $(WK_SWIFT_CLANG_DEPLOYMENT_TARGET) $(WK_SANITIZER_OTHER_SWIFT_FLAGS) -enable-upcoming-feature InternalImportsByDefault -enable-upcoming-feature MemberImportVisibility -track-system-dependencies -enable-experimental-feature ImportCxxMembersLazily; // Work around rdar://157581667 on affected toolchains. OTHER_SWIFT_FLAGS[sdk=*26.2*] = $(inherited) -Xcc -fno-modulemap-allow-subdirectory-search; OTHER_SWIFT_FLAGS[sdk=*26.3*] = $(inherited) -Xcc -fno-modulemap-allow-subdirectory-search; diff --git a/JSTests/microbenchmarks/array-iterator-fast-entries.js b/JSTests/microbenchmarks/array-iterator-fast-entries.js new file mode 100644 index 000000000000..8c7d482f9794 --- /dev/null +++ b/JSTests/microbenchmarks/array-iterator-fast-entries.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over array.entries() (allocates [index, element] per step). + +function arrayEntriesSum(arr) { + var sum = 0; + for (var [k, v] of arr.entries()) + sum += k + v; + return sum; +} +noInline(arrayEntriesSum); + +var arr = []; +for (var i = 0; i < 1024; ++i) + arr.push(i); + +var iters = 2e4; +for (var i = 0; i < iters; ++i) + arrayEntriesSum(arr); diff --git a/JSTests/microbenchmarks/array-iterator-fast-keys.js b/JSTests/microbenchmarks/array-iterator-fast-keys.js new file mode 100644 index 000000000000..877d5c55f629 --- /dev/null +++ b/JSTests/microbenchmarks/array-iterator-fast-keys.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over array.keys() (no element load needed). + +function arrayKeysSum(arr) { + var sum = 0; + for (var k of arr.keys()) + sum += k; + return sum; +} +noInline(arrayKeysSum); + +var arr = []; +for (var i = 0; i < 1024; ++i) + arr.push(i); + +var iters = 4e4; +for (var i = 0; i < iters; ++i) + arrayKeysSum(arr); diff --git a/JSTests/microbenchmarks/array-iterator-fast-values.js b/JSTests/microbenchmarks/array-iterator-fast-values.js new file mode 100644 index 000000000000..acb96e5f33bc --- /dev/null +++ b/JSTests/microbenchmarks/array-iterator-fast-values.js @@ -0,0 +1,36 @@ +// Microbenchmark: fast iteration over array.keys()/values()/entries(). + +function arrayValues(arr) { + var sum = 0; + for (var v of arr.values()) + sum += v; + return sum; +} +noInline(arrayValues); + +function arrayKeys(arr) { + var sum = 0; + for (var k of arr.keys()) + sum += k; + return sum; +} +noInline(arrayKeys); + +function arrayEntries(arr) { + var sum = 0; + for (var [k, v] of arr.entries()) + sum += k + v; + return sum; +} +noInline(arrayEntries); + +var arr = []; +for (var i = 0; i < 1024; ++i) + arr.push(i); + +var iters = 1e4; +for (var i = 0; i < iters; ++i) { + arrayValues(arr); + arrayKeys(arr); + arrayEntries(arr); +} diff --git a/JSTests/microbenchmarks/array-prototype-lastIndexOf-double-large.js b/JSTests/microbenchmarks/array-prototype-lastIndexOf-double-large.js new file mode 100644 index 000000000000..4c86cdf26407 --- /dev/null +++ b/JSTests/microbenchmarks/array-prototype-lastIndexOf-double-large.js @@ -0,0 +1,15 @@ +function test(array, searchElement) { + return array.lastIndexOf(searchElement); +} +noInline(test); + +var array = new Array(1024); +for (var i = 0; i < array.length; i++) + array[i] = i + 0.5; + +var result = 0; +for (var i = 0; i < 1e6; ++i) + result += test(array, -1.0); // absent: forces a full backward scan, returns -1 + +if (result !== -1e6) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/bigint-heap-dec.js b/JSTests/microbenchmarks/bigint-heap-dec.js new file mode 100644 index 000000000000..5a800ff91966 --- /dev/null +++ b/JSTests/microbenchmarks/bigint-heap-dec.js @@ -0,0 +1,14 @@ +function test(start, count) { + let n = start; + for (let i = 0; i < count; i++) + n--; + return n; +} +noInline(test); + +const start = 0x123456789abcdef0123456789abcdefn; +let result = 0n; +for (let i = 0; i < 2000; i++) + result = test(start, 2000); +if (result !== start - 2000n) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/bigint-heap-inc.js b/JSTests/microbenchmarks/bigint-heap-inc.js new file mode 100644 index 000000000000..98fb206d3806 --- /dev/null +++ b/JSTests/microbenchmarks/bigint-heap-inc.js @@ -0,0 +1,14 @@ +function test(start, count) { + let n = start; + for (let i = 0; i < count; i++) + n++; + return n; +} +noInline(test); + +const start = 0x123456789abcdef0123456789abcdefn; +let result = 0n; +for (let i = 0; i < 2000; i++) + result = test(start, 2000); +if (result !== start + 2000n) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/intl-string-tolocalelowercase.js b/JSTests/microbenchmarks/intl-string-tolocalelowercase.js new file mode 100644 index 000000000000..66276833039c --- /dev/null +++ b/JSTests/microbenchmarks/intl-string-tolocalelowercase.js @@ -0,0 +1,14 @@ +function test() { + let count = 0; + for (let i = 0; i < 1e5; ++i) { + if ("Hello World".toLocaleLowerCase() === "hello world") + ++count; + if ("HELLO WORLD".toLocaleLowerCase("en") === "hello world") + ++count; + } + return count; +} + +const result = test(); +if (result !== 2e5) + throw new Error("Bad result: " + result); diff --git a/JSTests/microbenchmarks/intl-string-tolocaleuppercase.js b/JSTests/microbenchmarks/intl-string-tolocaleuppercase.js new file mode 100644 index 000000000000..d77230f1ab6e --- /dev/null +++ b/JSTests/microbenchmarks/intl-string-tolocaleuppercase.js @@ -0,0 +1,14 @@ +function test() { + let count = 0; + for (let i = 0; i < 1e5; ++i) { + if ("Hello World".toLocaleUpperCase() === "HELLO WORLD") + ++count; + if ("hello world".toLocaleUpperCase("en") === "HELLO WORLD") + ++count; + } + return count; +} + +const result = test(); +if (result !== 2e5) + throw new Error("Bad result: " + result); diff --git a/JSTests/microbenchmarks/map-clone-large.js b/JSTests/microbenchmarks/map-clone-large.js new file mode 100644 index 000000000000..826ec13cac4a --- /dev/null +++ b/JSTests/microbenchmarks/map-clone-large.js @@ -0,0 +1,11 @@ +function test(map) { + return new Map(map); +} +noInline(test); + +var map = new Map(); +for (var j = 0; j < 1000; ++j) + map.set(j, j); + +for (var i = 0; i < testLoopCount; ++i) + test(map); diff --git a/JSTests/microbenchmarks/map-clone.js b/JSTests/microbenchmarks/map-clone.js new file mode 100644 index 000000000000..6db38deba127 --- /dev/null +++ b/JSTests/microbenchmarks/map-clone.js @@ -0,0 +1,11 @@ +function test(map) { + return new Map(map); +} +noInline(test); + +var map = new Map(); +for (var j = 0; j < 100; ++j) + map.set(j, j); + +for (var i = 0; i < testLoopCount; ++i) + test(map); diff --git a/JSTests/microbenchmarks/map-iterator-fast-entries.js b/JSTests/microbenchmarks/map-iterator-fast-entries.js new file mode 100644 index 000000000000..717bf67eb48f --- /dev/null +++ b/JSTests/microbenchmarks/map-iterator-fast-entries.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over map.entries() (allocates [key, value] per step). + +function mapEntriesSum(map) { + var sum = 0; + for (var [k, v] of map.entries()) + sum += k + v; + return sum; +} +noInline(mapEntriesSum); + +var map = new Map(); +for (var i = 0; i < 1024; ++i) + map.set(i, i * 2); + +var iters = 1e4; +for (var i = 0; i < iters; ++i) + mapEntriesSum(map); diff --git a/JSTests/microbenchmarks/map-iterator-fast-keys.js b/JSTests/microbenchmarks/map-iterator-fast-keys.js new file mode 100644 index 000000000000..fa4cf8f5d24b --- /dev/null +++ b/JSTests/microbenchmarks/map-iterator-fast-keys.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over map.keys() (no value load needed). + +function mapKeysSum(map) { + var sum = 0; + for (var k of map.keys()) + sum += k; + return sum; +} +noInline(mapKeysSum); + +var map = new Map(); +for (var i = 0; i < 1024; ++i) + map.set(i, i * 2); + +var iters = 2e4; +for (var i = 0; i < iters; ++i) + mapKeysSum(map); diff --git a/JSTests/microbenchmarks/map-iterator-fast-values.js b/JSTests/microbenchmarks/map-iterator-fast-values.js new file mode 100644 index 000000000000..32856969e4e1 --- /dev/null +++ b/JSTests/microbenchmarks/map-iterator-fast-values.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over map.values() (no key load needed). + +function mapValuesSum(map) { + var sum = 0; + for (var v of map.values()) + sum += v; + return sum; +} +noInline(mapValuesSum); + +var map = new Map(); +for (var i = 0; i < 1024; ++i) + map.set(i, i * 2); + +var iters = 2e4; +for (var i = 0; i < iters; ++i) + mapValuesSum(map); diff --git a/JSTests/microbenchmarks/regexp-matchall-digit-cached.js b/JSTests/microbenchmarks/regexp-matchall-digit-cached.js new file mode 100644 index 000000000000..fc01ba12a810 --- /dev/null +++ b/JSTests/microbenchmarks/regexp-matchall-digit-cached.js @@ -0,0 +1,15 @@ +// Hot-path microbenchmark for String.prototype.matchAll with a cached primordial +// RegExp argument. Exercises the C++ host function's fast path +// (isSymbolMatchAllFastAndNonObservable + inline iterator construction) plus the +// downstream RegExpStringIterator next() path. + +function matchAll(string, regexp) +{ + return [...string.matchAll(regexp)]; +} +noInline(matchAll); + +var string = "abc1def2ghi3jkl4mno5"; +var regexp = /[0-9]/g; +for (var i = 0; i < 3e5; ++i) + matchAll(string, regexp); diff --git a/JSTests/microbenchmarks/regexp-matchall-digit-literal.js b/JSTests/microbenchmarks/regexp-matchall-digit-literal.js new file mode 100644 index 000000000000..1174e8207d1e --- /dev/null +++ b/JSTests/microbenchmarks/regexp-matchall-digit-literal.js @@ -0,0 +1,13 @@ +// Hot-path microbenchmark for String.prototype.matchAll with a RegExp literal +// allocated on every call. Stresses the primordial-RegExp fast path together with +// regex allocation. + +function matchAll(string) +{ + return [...string.matchAll(/[0-9]/g)]; +} +noInline(matchAll); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 3e5; ++i) + matchAll(string); diff --git a/JSTests/microbenchmarks/regexp-search-digit-cached.js b/JSTests/microbenchmarks/regexp-search-digit-cached.js new file mode 100644 index 000000000000..48bd5e511b4e --- /dev/null +++ b/JSTests/microbenchmarks/regexp-search-digit-cached.js @@ -0,0 +1,14 @@ +// Hot-path microbenchmark for String.prototype.search with a cached primordial +// RegExp argument. The DFG StringSearch node is converted to RegExpSearch in +// fixup, guarded by a CheckStructure on the primordial RegExp structure. + +function search(string, regexp) +{ + return string.search(regexp); +} +noInline(search); + +var string = "abc1def2ghi3jkl4mno5"; +var regexp = /[0-9]/; +for (var i = 0; i < 1e6; ++i) + search(string, regexp); diff --git a/JSTests/microbenchmarks/regexp-search-digit-literal.js b/JSTests/microbenchmarks/regexp-search-digit-literal.js new file mode 100644 index 000000000000..145626266727 --- /dev/null +++ b/JSTests/microbenchmarks/regexp-search-digit-literal.js @@ -0,0 +1,13 @@ +// Hot-path microbenchmark for String.prototype.search with a RegExp literal +// allocated on every call. Stresses the primordial-RegExp fast path together +// with regex allocation. + +function search(string) +{ + return string.search(/[0-9]/); +} +noInline(search); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 1e6; ++i) + search(string); diff --git a/JSTests/microbenchmarks/set-clone-large.js b/JSTests/microbenchmarks/set-clone-large.js new file mode 100644 index 000000000000..fb8a01ad9a70 --- /dev/null +++ b/JSTests/microbenchmarks/set-clone-large.js @@ -0,0 +1,11 @@ +function test(set) { + return new Set(set); +} +noInline(test); + +var set = new Set(); +for (var j = 0; j < 1000; ++j) + set.add(j); + +for (var i = 0; i < testLoopCount; ++i) + test(set); diff --git a/JSTests/microbenchmarks/set-clone.js b/JSTests/microbenchmarks/set-clone.js new file mode 100644 index 000000000000..f3ab6a16f199 --- /dev/null +++ b/JSTests/microbenchmarks/set-clone.js @@ -0,0 +1,11 @@ +function test(set) { + return new Set(set); +} +noInline(test); + +var set = new Set(); +for (var j = 0; j < 100; ++j) + set.add(j); + +for (var i = 0; i < testLoopCount; ++i) + test(set); diff --git a/JSTests/microbenchmarks/set-iterator-fast-entries.js b/JSTests/microbenchmarks/set-iterator-fast-entries.js new file mode 100644 index 000000000000..fb44460eff33 --- /dev/null +++ b/JSTests/microbenchmarks/set-iterator-fast-entries.js @@ -0,0 +1,17 @@ +// Microbenchmark: fast iteration over set.entries() (allocates [value, value] per step). + +function setEntriesSum(set) { + var sum = 0; + for (var [a, b] of set.entries()) + sum += a + b; + return sum; +} +noInline(setEntriesSum); + +var set = new Set(); +for (var i = 0; i < 1024; ++i) + set.add(i); + +var iters = 1e4; +for (var i = 0; i < iters; ++i) + setEntriesSum(set); diff --git a/JSTests/microbenchmarks/set-iterator-fast-keys.js b/JSTests/microbenchmarks/set-iterator-fast-keys.js new file mode 100644 index 000000000000..8f4e2cec73de --- /dev/null +++ b/JSTests/microbenchmarks/set-iterator-fast-keys.js @@ -0,0 +1,18 @@ +// Microbenchmark: fast iteration over set.keys() (== set.values() in JS, but exercises the +// FastSetValues reuse path with an iterator obtained via .keys()). + +function setKeysSum(set) { + var sum = 0; + for (var k of set.keys()) + sum += k; + return sum; +} +noInline(setKeysSum); + +var set = new Set(); +for (var i = 0; i < 1024; ++i) + set.add(i); + +var iters = 2e4; +for (var i = 0; i < iters; ++i) + setKeysSum(set); diff --git a/JSTests/microbenchmarks/set-iterator-fast-values.js b/JSTests/microbenchmarks/set-iterator-fast-values.js new file mode 100644 index 000000000000..83327fc1f02a --- /dev/null +++ b/JSTests/microbenchmarks/set-iterator-fast-values.js @@ -0,0 +1,27 @@ +// Microbenchmark: fast iteration over set.values() / for-of set. + +function setValuesSum(set) { + var sum = 0; + for (var v of set.values()) + sum += v; + return sum; +} +noInline(setValuesSum); + +function setForOfSum(set) { + var sum = 0; + for (var v of set) + sum += v; + return sum; +} +noInline(setForOfSum); + +var set = new Set(); +for (var i = 0; i < 1024; ++i) + set.add(i); + +var iters = 2e4; +for (var i = 0; i < iters; ++i) { + setValuesSum(set); + setForOfSum(set); +} diff --git a/JSTests/microbenchmarks/string-from-code-point.js b/JSTests/microbenchmarks/string-from-code-point.js new file mode 100644 index 000000000000..2b9c1daee802 --- /dev/null +++ b/JSTests/microbenchmarks/string-from-code-point.js @@ -0,0 +1,37 @@ +//@ skip if $model == "Apple Watch Series 3" + +function fromCodePointLatin1(start, count) { + let result = 0; + for (let i = 0; i < count; ++i) + result += String.fromCodePoint((start + i) & 0xFF).length; + return result; +} +noInline(fromCodePointLatin1); + +function fromCodePointBMP(start, count) { + let result = 0; + for (let i = 0; i < count; ++i) + result += String.fromCodePoint(0x3000 + ((start + i) & 0xFF)).length; + return result; +} +noInline(fromCodePointBMP); + +function fromCodePointMixed(start, count) { + let result = 0; + for (let i = 0; i < count; ++i) { + const cp = ((start + i) & 0x1) ? 0x41 : 0x1F600; + result += String.fromCodePoint(cp).length; + } + return result; +} +noInline(fromCodePointMixed); + +let total = 0; +for (let i = 0; i < 5000; ++i) { + total += fromCodePointLatin1(i, 200); + total += fromCodePointBMP(i, 200); + total += fromCodePointMixed(i, 200); +} + +if (total !== 5000 * (200 + 200 + 300)) + throw new Error(`bad total: ${total}`); diff --git a/JSTests/microbenchmarks/string-iterator-for-of-ascii.js b/JSTests/microbenchmarks/string-iterator-for-of-ascii.js new file mode 100644 index 000000000000..25f997130e91 --- /dev/null +++ b/JSTests/microbenchmarks/string-iterator-for-of-ascii.js @@ -0,0 +1,15 @@ +function sumCodePoints(string) { + var result = 0; + for (var character of string) + result += character.codePointAt(0); + return result; +} +noInline(sumCodePoints); + +var string = "Hello, World! The quick brown fox jumps over the lazy dog.".repeat(4); +var expected = sumCodePoints(string); +for (var i = 0; i < 1e5; ++i) { + var result = sumCodePoints(string); + if (result !== expected) + throw new Error("bad result: " + result); +} diff --git a/JSTests/microbenchmarks/string-iterator-for-of-surrogate-pairs.js b/JSTests/microbenchmarks/string-iterator-for-of-surrogate-pairs.js new file mode 100644 index 000000000000..ccf1f79d834d --- /dev/null +++ b/JSTests/microbenchmarks/string-iterator-for-of-surrogate-pairs.js @@ -0,0 +1,15 @@ +function sumCodePoints(string) { + var result = 0; + for (var character of string) + result += character.codePointAt(0); + return result; +} +noInline(sumCodePoints); + +var string = "𠮷野家で𩸽と𠀋を食べた😀😃😄😁🍣🍺".repeat(10); +var expected = sumCodePoints(string); +for (var i = 0; i < 1e5; ++i) { + var result = sumCodePoints(string); + if (result !== expected) + throw new Error("bad result: " + result); +} diff --git a/JSTests/microbenchmarks/string-iterator-spread-surrogate-pairs.js b/JSTests/microbenchmarks/string-iterator-spread-surrogate-pairs.js new file mode 100644 index 000000000000..a14f483c631d --- /dev/null +++ b/JSTests/microbenchmarks/string-iterator-spread-surrogate-pairs.js @@ -0,0 +1,12 @@ +function spread(string) { + return [...string]; +} +noInline(spread); + +var string = "𠮷野家で𩸽と𠀋を食べた😀😃😄😁🍣🍺".repeat(10); +var expectedLength = spread(string).length; +for (var i = 0; i < 1e5; ++i) { + var result = spread(string); + if (result.length !== expectedLength) + throw new Error("bad length: " + result.length); +} diff --git a/JSTests/microbenchmarks/string-matchall-digit-short.js b/JSTests/microbenchmarks/string-matchall-digit-short.js new file mode 100644 index 000000000000..d015e4b9f4b4 --- /dev/null +++ b/JSTests/microbenchmarks/string-matchall-digit-short.js @@ -0,0 +1,14 @@ +// Hot-path microbenchmark for String.prototype.matchAll with a string regexp source. +// Exercises stringMatchAllSlow's RegExpCreate path (with the new +// (pattern, OptionSet) regExpCreate overload, which avoids allocating +// the "g" JSString) and its primordial-RegExp inline iterator construction. + +function matchAll(string, regexp) +{ + return [...string.matchAll(regexp)]; +} +noInline(matchAll); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 4e5; ++i) + matchAll(string, "[0-9]"); diff --git a/JSTests/microbenchmarks/string-matchall-letter-short.js b/JSTests/microbenchmarks/string-matchall-letter-short.js new file mode 100644 index 000000000000..7b10df5fdddf --- /dev/null +++ b/JSTests/microbenchmarks/string-matchall-letter-short.js @@ -0,0 +1,12 @@ +// Hot-path microbenchmark for String.prototype.matchAll with a single-char literal +// pattern. Targets the stringMatchAllSlow path with a trivial regexp body. + +function matchAll(string, regexp) +{ + return [...string.matchAll(regexp)]; +} +noInline(matchAll); + +var string = "alpha bravo charlie delta echo foxtrot golf"; +for (var i = 0; i < 4e5; ++i) + matchAll(string, "a"); diff --git a/JSTests/microbenchmarks/string-search-digit-short.js b/JSTests/microbenchmarks/string-search-digit-short.js new file mode 100644 index 000000000000..c5b128eec3cd --- /dev/null +++ b/JSTests/microbenchmarks/string-search-digit-short.js @@ -0,0 +1,14 @@ +// Hot-path microbenchmark for String.prototype.search with a short literal +// string regexp source. This exercises the DFG StringSearch fast path for the +// common case where the regexp arg is a string and gets coerced via +// RegExp construction. + +function search(string, regexp) +{ + return string.search(regexp); +} +noInline(search); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 1e7; ++i) + search(string, "[0-9]"); diff --git a/JSTests/microbenchmarks/typed-array-allocate-float64-variable-length.js b/JSTests/microbenchmarks/typed-array-allocate-float64-variable-length.js new file mode 100644 index 000000000000..8f6cfe164f65 --- /dev/null +++ b/JSTests/microbenchmarks/typed-array-allocate-float64-variable-length.js @@ -0,0 +1,12 @@ +function allocate(length) { + return new Float64Array(length); +} +noInline(allocate); + +let sum = 0; +for (let i = 0; i < 50000; ++i) { + let array = allocate(1000); + sum += array[0] + array[999]; +} +if (sum !== 0) + throw new Error("bad: " + sum); diff --git a/JSTests/microbenchmarks/typed-array-allocate-int32-constant-512.js b/JSTests/microbenchmarks/typed-array-allocate-int32-constant-512.js new file mode 100644 index 000000000000..fdc23fbad5f0 --- /dev/null +++ b/JSTests/microbenchmarks/typed-array-allocate-int32-constant-512.js @@ -0,0 +1,12 @@ +function allocate() { + return new Int32Array(512); +} +noInline(allocate); + +let sum = 0; +for (let i = 0; i < 100000; ++i) { + let array = allocate(); + sum += array[0] + array[511]; +} +if (sum !== 0) + throw new Error("bad: " + sum); diff --git a/JSTests/microbenchmarks/typed-array-allocate-uint8-variable-length.js b/JSTests/microbenchmarks/typed-array-allocate-uint8-variable-length.js new file mode 100644 index 000000000000..586fdb30482a --- /dev/null +++ b/JSTests/microbenchmarks/typed-array-allocate-uint8-variable-length.js @@ -0,0 +1,12 @@ +function allocate(length) { + return new Uint8Array(length); +} +noInline(allocate); + +let sum = 0; +for (let i = 0; i < 200000; ++i) { + let array = allocate(1000); + sum += array[0] + array[999]; +} +if (sum !== 0) + throw new Error("bad: " + sum); diff --git a/JSTests/microbenchmarks/weak-map-constructor-empty.js b/JSTests/microbenchmarks/weak-map-constructor-empty.js new file mode 100644 index 000000000000..0071c6bf42aa --- /dev/null +++ b/JSTests/microbenchmarks/weak-map-constructor-empty.js @@ -0,0 +1,8 @@ +function test() +{ + return new WeakMap(); +} +noInline(test); + +for (var i = 0; i < 2e6; ++i) + test(); diff --git a/JSTests/microbenchmarks/weak-set-constructor-empty.js b/JSTests/microbenchmarks/weak-set-constructor-empty.js new file mode 100644 index 000000000000..df5b5c063e7e --- /dev/null +++ b/JSTests/microbenchmarks/weak-set-constructor-empty.js @@ -0,0 +1,8 @@ +function test() +{ + return new WeakSet(); +} +noInline(test); + +for (var i = 0; i < 2e6; ++i) + test(); diff --git a/JSTests/stress/array-iterator-fast-cross-realm.js b/JSTests/stress/array-iterator-fast-cross-realm.js new file mode 100644 index 000000000000..9eb37d496836 --- /dev/null +++ b/JSTests/stress/array-iterator-fast-cross-realm.js @@ -0,0 +1,123 @@ +// Cross-realm coverage for the FastArrayValues/Keys/Entries open paths. +// +// The fast-iteration protocol must filter out iterators that belong to a different global object +// (different arrayIteratorStructure), and must safely handle a current-realm iterator whose +// iteratedObject is a cross-realm JSArray. +// +// The DFG single-mode path uses CheckStructure(currentRealm.arrayIteratorStructure), and the +// multi-mode path uses CompareEqPtr(currentRealm.iteratorProto[Symbol.iterator]). Either way, +// a cross-realm JSArrayIterator whose [Symbol.iterator] resolves to OTHER realm's iteratorPrototype +// must NOT take the fast path. The iterator-open watchpoint added in handleIteratorOpen is the +// CURRENT realm's; we rely on these dynamic checks to reject other-realm iterators. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +var otherRealm = createGlobalObject(); + +// Build a same-shape array in the other realm. +var otherRealmArray = otherRealm.Array(1, 2, 3, 4, 5); + +// (1) Iterating a CROSS-REALM JSArrayIterator whose [Symbol.iterator] is other-realm's identity. +// Our fast-path checks must reject this and route to the generic protocol. +function valuesOfIterator(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(valuesOfIterator); + +// Warm up under the FastArrayValues path with a current-realm iter so seenModes has FastArrayValues. +// (Mixing in a cross-realm iter forces the multi-mode dispatch, the path that omits the +// CheckStructure on the iterator.) +var thisRealmArray = [1, 2, 3, 4, 5]; +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(thisRealmArray.values()), 15); + +// Cross-realm JSArrayIterator: must fall back to generic and produce the right value. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(otherRealmArray.values()), 15); + +// (2) A CURRENT-realm iterator whose iteratedObject is a CROSS-REALM JSArray. The iterator's +// [Symbol.iterator] is current-realm's identity (passes the function-pointer check), and the +// iteratedObject is a JSArray (any realm). The fast path inlines butterfly access: must work. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(Array.prototype.values.call(otherRealmArray)), 15); + +// Same with keys/entries. +function keysOfIterator(iter) { + var sum = 0; + for (var k of iter) + sum += k; + return sum; +} +noInline(keysOfIterator); + +function entriesOfIterator(iter) { + var sum = 0; + for (var [k, v] of iter) + sum += k * 100 + v; + return sum; +} +noInline(entriesOfIterator); + +// Warm up. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(keysOfIterator(thisRealmArray.keys()), 10); // 0+1+2+3+4 + shouldBe(entriesOfIterator(thisRealmArray.entries()), 1015); // sum k*100+v +} + +// Now feed cross-realm-array-backed current-realm iterators (uses fast path inlining). +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(keysOfIterator(Array.prototype.keys.call(otherRealmArray)), 10); + shouldBe(entriesOfIterator(Array.prototype.entries.call(otherRealmArray)), 1015); +} + +// And cross-realm iterators (must bail to generic). +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(keysOfIterator(otherRealmArray.keys()), 10); + shouldBe(entriesOfIterator(otherRealmArray.entries()), 1015); +} + +// (3) Mid-iteration with a cross-realm iter: exercises the iter-as-iterable path too. +function consumeOneAndIterateRest(iter) { + var first = iter.next(); + var rest = 0; + for (var v of iter) + rest += v; + return [first.value, first.done, rest]; +} +noInline(consumeOneAndIterateRest); + +for (var i = 0; i < testLoopCount; ++i) { + var [first, done, rest] = consumeOneAndIterateRest(otherRealmArray.values()); + shouldBe(first, 1); + shouldBe(done, false); + shouldBe(rest, 14); // 2+3+4+5 +} + +// (4) Modifying OTHER realm's Array.prototype[Symbol.iterator] must NOT fool the fast path on +// CURRENT realm's iterators. Our watchpoint is current-realm's, so other-realm modifications are +// invisible to us. The dynamic function-pointer check on the symbolIterator slot already +// distinguishes realms, so this is purely a defense-in-depth check. +otherRealm.Array.prototype[Symbol.iterator] = function () { + var idx = 0, arr = this; + return { next() { return idx < arr.length ? { value: arr[idx++] * 100, done: false } : { value: undefined, done: true }; } }; +}; + +// Same-realm iteration unaffected. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(thisRealmArray.values()), 15); + +// for-of on cross-realm-array uses other-realm's Symbol.iterator: 100+200+...+500 = 1500. +function plainFor(arr) { + var sum = 0; + for (var v of arr) sum += v; + return sum; +} +noInline(plainFor); + +shouldBe(plainFor(otherRealmArray), 1500); diff --git a/JSTests/stress/array-iterator-fast-ftl.js b/JSTests/stress/array-iterator-fast-ftl.js new file mode 100644 index 000000000000..b4bbbea9b49b --- /dev/null +++ b/JSTests/stress/array-iterator-fast-ftl.js @@ -0,0 +1,49 @@ +// FTL tier coverage for FastArrayValues/Keys/Entries — force tier-up to FTL and verify correctness. +//@ runFTLNoCJIT +//@ runDefault("--useConcurrentJIT=1", "--thresholdForFTLOptimizeAfterWarmUp=10", "--thresholdForFTLOptimizeSoon=10", "--thresholdForOptimizeAfterWarmUp=10") + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(array) { + var sum = 0; + for (var v of array.values()) + sum += v; + return sum; +} +noInline(values); + +function keys(array) { + var sum = 0; + for (var k of array.keys()) + sum += k; + return sum; +} +noInline(keys); + +function entries(array) { + var sum = 0; + for (var [k, v] of array.entries()) + sum += k * 1000 + v; + return sum; +} +noInline(entries); + +var array = []; +for (var i = 0; i < 100; ++i) + array.push(i + 1); + +var expectedValues = 0, expectedKeys = 0, expectedEntries = 0; +for (var i = 0; i < 100; ++i) { + expectedValues += i + 1; + expectedKeys += i; + expectedEntries += i * 1000 + (i + 1); +} + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(array), expectedValues); + shouldBe(keys(array), expectedKeys); + shouldBe(entries(array), expectedEntries); +} diff --git a/JSTests/stress/array-iterator-fast-iterator-proto-symbol-iterator-overridden.js b/JSTests/stress/array-iterator-fast-iterator-proto-symbol-iterator-overridden.js new file mode 100644 index 000000000000..86fa183539ff --- /dev/null +++ b/JSTests/stress/array-iterator-fast-iterator-proto-symbol-iterator-overridden.js @@ -0,0 +1,38 @@ +// Replacing %IteratorPrototype%[Symbol.iterator] is NOT covered by arrayIteratorProtocolWatchpointSet, +// but the dynamic CheckIsConstant on the symbolIterator value should catch it and bail to generic. +// arrayIterator[Symbol.iterator] is inherited from %IteratorPrototype% — replace it and verify +// the fast path bails out. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function valuesOfIterator(array) { + var iter = array.values(); + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(valuesOfIterator); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +// Warm up under FastArrayValues path (iterating an existing JSArrayIterator). +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(array), 55); + +// Replace %IteratorPrototype%[Symbol.iterator]. arrayIterator[Symbol.iterator] now resolves to this +// new function (CheckIsConstant on the symbolIterator value should bail). +var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values())); +iteratorPrototype[Symbol.iterator] = function () { + // Return a fresh iterator over [99, 99]. + return [99, 99][Symbol.iterator](); +}; + +// `array.values()` returns a JSArrayIterator. `for (var v of iter)` calls iter[Symbol.iterator]() +// which now returns the [99, 99] iterator → 99 + 99 = 198. +shouldBe(valuesOfIterator(array), 198); diff --git a/JSTests/stress/array-iterator-fast-keys-values-entries.js b/JSTests/stress/array-iterator-fast-keys-values-entries.js new file mode 100644 index 000000000000..5be93d23042a --- /dev/null +++ b/JSTests/stress/array-iterator-fast-keys-values-entries.js @@ -0,0 +1,91 @@ +// Tests for fast iteration of JSArrayIterator (arr.keys(), arr.values(), arr.entries()). + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(array) { + var sum = 0; + for (var v of array.values()) + sum += v; + return sum; +} +noInline(values); + +function keys(array) { + var sum = 0; + for (var k of array.keys()) + sum += k; + return sum; +} +noInline(keys); + +function entries(array) { + var sum = 0; + for (var [k, v] of array.entries()) + sum += k * 1000 + v; + return sum; +} +noInline(entries); + +// Mixed kinds in one function — must coexist on the same op_iterator_open / op_iterator_next. +function mixed(array) { + var sum = 0; + for (var v of array.values()) sum += v; + for (var k of array.keys()) sum += k; + for (var [k, v] of array.entries()) sum += k + v; + for (var v of array) sum += v; // FastArray (plain) path still works. + return sum; +} +noInline(mixed); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +var expectedValues = 55; // 1+2+...+10 +var expectedKeys = 45; // 0+1+...+9 +var expectedEntries = 0; // sum k*1000 + v over (0,1)..(9,10) +for (var i = 0; i < 10; ++i) + expectedEntries += i * 1000 + (i + 1); +var expectedMixed = expectedValues + expectedKeys + (45 + 55) + expectedValues; + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(array), expectedValues); + shouldBe(keys(array), expectedKeys); + shouldBe(entries(array), expectedEntries); + shouldBe(mixed(array), expectedMixed); +} + +// Replacing Array.prototype.values does NOT invalidate arrayIteratorProtocolWatchpointSet (which +// watches Array.prototype[Symbol.iterator] and ArrayIteratorPrototype.next). The fast path should +// keep working — but on the new iterator returned by the replaced .values, which iterates [42, 42]. +function valuesAfterReplacingValues(array) { + var sum = 0; + for (var v of array.values()) + sum += v; + return sum; +} +noInline(valuesAfterReplacingValues); + +// Warm up first. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesAfterReplacingValues(array), expectedValues); + +Array.prototype.values = function () { return [42, 42][Symbol.iterator](); }; +shouldBe(valuesAfterReplacingValues(array), 84); + +// Iterating the result of arr.keys() / arr.entries() (i.e. the iterator itself, not arr) — exercises +// the FastArrayKeys/Entries open paths where iterable IS the iterator. +function valuesOfIterator(array) { + var iter = array[Symbol.iterator](); + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(valuesOfIterator); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(array), expectedValues); diff --git a/JSTests/stress/array-iterator-fast-mid-iteration.js b/JSTests/stress/array-iterator-fast-mid-iteration.js new file mode 100644 index 000000000000..3f7184478f83 --- /dev/null +++ b/JSTests/stress/array-iterator-fast-mid-iteration.js @@ -0,0 +1,78 @@ +// Mid-iteration: pause an iterator with N values consumed, then continue via for..of which calls +// next() on the partially-advanced iterator. Verify the FastArrayValues/Keys/Entries path correctly +// resumes from where the manual .next() left off. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function consumeOneAndIterateRest(iter) { + var first = iter.next(); // manually consume one + var rest = 0; + for (var v of iter) + rest += v; + return [first.value, first.done, rest]; +} +noInline(consumeOneAndIterateRest); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + var [first, done, rest] = consumeOneAndIterateRest(array.values()); + shouldBe(first, 1); + shouldBe(done, false); + shouldBe(rest, 54); // 2+3+...+10 +} + +// Same with keys. +function consumeKeysRest(iter) { + var first = iter.next(); + var rest = 0; + for (var k of iter) + rest += k; + return [first.value, rest]; +} +noInline(consumeKeysRest); + +for (var i = 0; i < testLoopCount; ++i) { + var [first, rest] = consumeKeysRest(array.keys()); + shouldBe(first, 0); + shouldBe(rest, 45); // 1+2+...+9 +} + +// Same with entries. +function consumeEntriesRest(iter) { + var first = iter.next(); + var rest = 0; + for (var [k, v] of iter) + rest += k * 1000 + v; + return [first.value[0], first.value[1], rest]; +} +noInline(consumeEntriesRest); + +var expectedRest = 0; +for (var i = 1; i < 10; ++i) + expectedRest += i * 1000 + (i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + var [k, v, rest] = consumeEntriesRest(array.entries()); + shouldBe(k, 0); + shouldBe(v, 1); + shouldBe(rest, expectedRest); +} + +// Drain to done via manual .next() then attempt iteration — should yield zero rest. +function drainThenIterate(iter) { + while (!iter.next().done) {} + var rest = 0; + for (var v of iter) + rest += v; + return rest; +} +noInline(drainThenIterate); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(drainThenIterate(array.values()), 0); diff --git a/JSTests/stress/array-iterator-fast-multi-mode-cross-realm-prototype.js b/JSTests/stress/array-iterator-fast-multi-mode-cross-realm-prototype.js new file mode 100644 index 000000000000..6499828166cb --- /dev/null +++ b/JSTests/stress/array-iterator-fast-multi-mode-cross-realm-prototype.js @@ -0,0 +1,100 @@ +// FastArrayValues / FastArrayKeys / FastArrayEntries reuse the input iterator (m_iterator = +// m_iterable) instead of constructing a fresh one. Therefore the iterator carries the +// iterable's realm, and OUR realm's arrayIteratorProtocolWatchpointSet only guards the +// iterator if it actually lives in OUR realm. +// +// In the multi-mode dispatch we used to test IsCellWithType(JSArrayIteratorType) on the +// iterable. That accepts cross-realm JSArrayIterators with the same JSType, and combined +// with an own [Symbol.iterator] override pointing at our realm's +// iteratorProtoSymbolIteratorFunction, both the type check and the symbol-iterator +// CompareEqPtr would pass — and the fast path would silently bypass the OTHER realm's +// ArrayIteratorPrototype.next (which our watchpoint does NOT cover). +// +// MatchStructure pinning the iterable to OUR arrayIteratorStructure rejects that case via +// speculation fail, so iterator_next re-executes through the generic protocol and the +// (modified) cross-realm prototype takes effect. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function sumIter(iter) { + var sum = 0; + for (var v of iter) { + if (typeof v === 'number') + sum += v; + else + sum += v[0] + v[1]; // entries [k, v] + } + return sum; +} +noInline(sumIter); + +// Train all three ArrayIterator kinds → multi-mode dispatch. +var arr = [1, 2, 3, 4, 5]; +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumIter(arr.values()), 15); + shouldBe(sumIter(arr.keys()), 10); + shouldBe(sumIter(arr.entries()), 25); +} + +var otherRealm = createGlobalObject(); +var otherRealmArray = otherRealm.Array(1, 2, 3, 4, 5); + +// Replace the OTHER realm's ArrayIteratorPrototype.next so we can detect whether the fast +// path silently bypassed it. Multiplies each yielded value by 100. +var otherArrayIteratorPrototype = Object.getPrototypeOf(otherRealmArray.values()); +otherArrayIteratorPrototype.next = function() { + if (this.__idx === undefined) this.__idx = 0; + if (this.__arr === undefined) return { value: undefined, done: true }; + if (this.__idx >= this.__arr.length) return { value: undefined, done: true }; + return { value: this.__arr[this.__idx++] * 100, done: false }; +}; + +function makeAttackIter() { + // Cross-realm ArrayIterator, but with OUR realm's Iterator.prototype[Symbol.iterator] + // installed as an own property. Without MatchStructure, IsCellWithType(JSArrayIteratorType) + // and CompareEqPtr(OUR iteratorProtoSymbolIteratorFunction) both pass — yet the iterator + // structure is the OTHER realm's, so OUR per-realm watchpoint is the wrong watchpoint. + var iter = otherRealm.Array.prototype.values.call(otherRealmArray); + iter[Symbol.iterator] = Iterator.prototype[Symbol.iterator]; + iter.__arr = otherRealmArray; + iter.__idx = 0; + return iter; +} + +// With MatchStructure pinning to OUR arrayIteratorStructure, the cross-realm iter +// speculation-fails out of the fast path → iterator_open re-executes via the generic +// protocol → iter.next dispatches through the modified cross-realm +// ArrayIteratorPrototype.next → values are multiplied by 100. +// +// (Pre-fix, with IsCellWithType, the fast path would have accepted this iterator and walked +// the underlying array directly, returning 15 and silently ignoring the modified prototype.) +for (var i = 0; i < testLoopCount; ++i) + shouldBe(sumIter(makeAttackIter()), 1500); // 100+200+300+400+500 + +// Same-realm iteration must remain unaffected. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumIter(arr.values()), 15); + shouldBe(sumIter(arr.keys()), 10); + shouldBe(sumIter(arr.entries()), 25); +} + +// Same-realm ArrayIterator with own [Symbol.iterator] override pointing to OUR realm's +// function: IsCellWithType + CompareEqPtr pass, but the own override transitions the +// iterator's structure away from arrayIteratorStructure → MatchStructure speculation-fails +// → generic protocol. Behavior must remain correct. +function values(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(values); + +for (var i = 0; i < testLoopCount; ++i) { + var v = arr.values(); + v[Symbol.iterator] = Iterator.prototype[Symbol.iterator]; + shouldBe(values(v), 15); +} diff --git a/JSTests/stress/array-iterator-fast-non-array-iterated-object.js b/JSTests/stress/array-iterator-fast-non-array-iterated-object.js new file mode 100644 index 000000000000..803e7b3b94de --- /dev/null +++ b/JSTests/stress/array-iterator-fast-non-array-iterated-object.js @@ -0,0 +1,107 @@ +// JSArrayIterator created over a non-JSArray (TypedArray) must NOT take the FastArrayValues fast +// path. The sentinel cell in op_iterator_open is set only when iteratedObject is a plain JSArray; +// for any other iteratedObject (TypedArray, arguments, plain object) we must fall through to the +// generic iteration protocol — never run the unsafe code that assumes JSArray. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function sumValues(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(sumValues); + +function sumKeys(iter) { + var sum = 0; + for (var k of iter) + sum += k; + return sum; +} +noInline(sumKeys); + +function sumEntries(iter) { + var sum = 0; + for (var [k, v] of iter) + sum += k * 1000 + v; + return sum; +} +noInline(sumEntries); + +var typed = new Uint32Array(10); +for (var i = 0; i < 10; ++i) + typed[i] = i + 1; + +var expectedValues = 55; +var expectedKeys = 45; +var expectedEntries = 0; +for (var i = 0; i < 10; ++i) + expectedEntries += i * 1000 + (i + 1); + +// Plain typed-array iterators across all three kinds. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumValues(Array.prototype.values.call(typed)), expectedValues); + shouldBe(sumKeys(Array.prototype.keys.call(typed)), expectedKeys); + shouldBe(sumEntries(Array.prototype.entries.call(typed)), expectedEntries); +} + +// Profile pollution: warm up sumValues with a plain-JSArray-backed iterator (FastArrayValues path), +// then feed it a typed-array-backed iterator. The fast path's sentinel must NOT have been set on +// the typed-array iterator (because iteratedObject is not a JSArray) — so this must hit the generic +// path and produce the right value without crashing. +function values(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(values); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +// Warm-up: FastArrayValues path on a plain JSArray-backed iterator. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(values(array.values()), 55); + +// Mix in: typed-array-backed iterator. Must fall through to generic, must not take the fast path. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(values(Array.prototype.values.call(typed)), 55); + +// Mid-iteration .next() on a typed-array iterator — also must not take the fast path. +function consumeOneAndIterateRest(iter) { + var first = iter.next(); + var rest = 0; + for (var v of iter) + rest += v; + return [first.value, first.done, rest]; +} +noInline(consumeOneAndIterateRest); + +for (var i = 0; i < testLoopCount; ++i) { + var [first, done, rest] = consumeOneAndIterateRest(Array.prototype.values.call(typed)); + shouldBe(first, 1); + shouldBe(done, false); + shouldBe(rest, 54); // 2+3+...+10 +} + +// Detached buffer: iterating an iterator whose typed array's buffer is detached must throw, not crash. +function iterateOrThrow(iter) { + try { + for (var v of iter) { /* */ } + return "no-throw"; + } catch (e) { + return e.constructor.name; + } +} +noInline(iterateOrThrow); + +var typedToDetach = new Uint32Array(new ArrayBuffer(40)); +var detachIter = Array.prototype.values.call(typedToDetach); +typedToDetach.buffer.transfer(); // detaches +shouldBe(iterateOrThrow(detachIter), "TypeError"); diff --git a/JSTests/stress/array-iterator-fast-own-symbol-iterator-on-instance.js b/JSTests/stress/array-iterator-fast-own-symbol-iterator-on-instance.js new file mode 100644 index 000000000000..d33e4a2d6d3e --- /dev/null +++ b/JSTests/stress/array-iterator-fast-own-symbol-iterator-on-instance.js @@ -0,0 +1,33 @@ +// Adding own [Symbol.iterator] to a JSArrayIterator changes its structure → CheckStructure should +// fail and the fast path bails to generic. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function sumIterator(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(sumIterator); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +// Warm up. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(sumIterator(array.values()), 55); + +// Now add own [Symbol.iterator] — structure differs from default arrayIteratorStructure. +var customIter = array.values(); +customIter[Symbol.iterator] = function () { return [777][Symbol.iterator](); }; + +shouldBe(sumIterator(customIter), 777); + +// Also run a few more times after warmup to confirm we don't crash from a stale structure speculation. +for (var i = 0; i < testLoopCount; ++i) + shouldBe(sumIterator(array.values()), 55); diff --git a/JSTests/stress/array-iterator-fast-watchpoint-invalidate-next.js b/JSTests/stress/array-iterator-fast-watchpoint-invalidate-next.js new file mode 100644 index 000000000000..3e8a7cc7feee --- /dev/null +++ b/JSTests/stress/array-iterator-fast-watchpoint-invalidate-next.js @@ -0,0 +1,52 @@ +// Replacing ArrayIteratorPrototype.next fires arrayIteratorProtocolWatchpointSet. +// Functions warmed up under the fast path must keep producing correct results. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(array) { + var sum = 0; + for (var v of array.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(array) { + var sum = 0; + for (var v of array) + sum += v; + return sum; +} +noInline(plain); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(array), 55); + shouldBe(plain(array), 55); +} + +// Replace ArrayIteratorPrototype.next — fires the watchpoint. +var arrayIteratorPrototype = Object.getPrototypeOf([].values()); +arrayIteratorPrototype.next = function () { + return { value: 7, done: this._done }; +}; +arrayIteratorPrototype._done = false; + +// One call to .next() returns 7, second sets _done=true via outer code below. +// Use a very small array so we don't infinite-loop here — set _done after one call. +var counter = 0; +arrayIteratorPrototype.next = function () { + counter++; + return counter <= 3 ? { value: 7, done: false } : { value: undefined, done: true }; +}; + +counter = 0; +shouldBe(values(array), 21); // 7 + 7 + 7 +counter = 0; +shouldBe(plain(array), 21); diff --git a/JSTests/stress/array-iterator-fast-watchpoint-invalidate-symbol-iterator.js b/JSTests/stress/array-iterator-fast-watchpoint-invalidate-symbol-iterator.js new file mode 100644 index 000000000000..650eb3e1995b --- /dev/null +++ b/JSTests/stress/array-iterator-fast-watchpoint-invalidate-symbol-iterator.js @@ -0,0 +1,51 @@ +// Replacing Array.prototype[Symbol.iterator] fires arrayIteratorProtocolWatchpointSet. +// Functions warmed up under the fast path must keep producing correct results after the +// watchpoint fires (they should bail to the generic path or OSR-exit). + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(array) { + var sum = 0; + for (var v of array.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(array) { + var sum = 0; + for (var v of array) + sum += v; + return sum; +} +noInline(plain); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +// Warm up under the fast path. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(array), 55); + shouldBe(plain(array), 55); +} + +// Now fire the watchpoint by replacing Array.prototype[Symbol.iterator]. +Array.prototype[Symbol.iterator] = function () { + var idx = 0; + var arr = this; + return { + next() { + return idx < arr.length ? { value: arr[idx++] * 10, done: false } : { value: undefined, done: true }; + } + }; +}; + +// `for (var v of array)` now uses the replaced iterator: 10+20+...+100 = 550. +shouldBe(plain(array), 550); + +// `array.values()` is unaffected — we replaced [Symbol.iterator], not .values. +shouldBe(values(array), 55); diff --git a/JSTests/stress/array-join-dfg-empty-separator.js b/JSTests/stress/array-join-dfg-empty-separator.js new file mode 100644 index 000000000000..d6288e155bf0 --- /dev/null +++ b/JSTests/stress/array-join-dfg-empty-separator.js @@ -0,0 +1,42 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function joinInt32(arr) { + return arr.join(""); +} +noInline(joinInt32); + +function joinContiguous(arr) { + return arr.join(""); +} +noInline(joinContiguous); + +function joinDouble(arr) { + return arr.join(""); +} +noInline(joinDouble); + +var int32Array = [1, 2, 3, 4, 5]; +var contiguousArray = ["a", "b", "c", "d", "e"]; +var doubleArray = [1.5, 2.5, 3.5]; +var mixedArray = [1, "x", 2, "y", 3]; + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(joinInt32(int32Array), "12345"); + shouldBe(joinContiguous(contiguousArray), "abcde"); + shouldBe(joinDouble(doubleArray), "1.52.53.5"); + shouldBe(joinContiguous(mixedArray), "1x2y3"); +} + +shouldBe(joinInt32([]), ""); +shouldBe(joinInt32([42]), "42"); +shouldBe(joinContiguous(["solo"]), "solo"); + +var withHole = [1, , 3]; +shouldBe(withHole.join(""), "13"); + +var sparseInt32 = [1, 2]; +sparseInt32.length = 4; +shouldBe(sparseInt32.join(""), "12"); diff --git a/JSTests/stress/array-join-dfg-object-separator-tostring-once.js b/JSTests/stress/array-join-dfg-object-separator-tostring-once.js new file mode 100644 index 000000000000..79766423d5e8 --- /dev/null +++ b/JSTests/stress/array-join-dfg-object-separator-tostring-once.js @@ -0,0 +1,88 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +// When the separator is an object, operationArrayJoinGeneric must not call +// ToString itself: doing so would let the side effect run, and a subsequent +// revalidation failure (e.g. mutated array length / indexing type) would +// trigger an OSR exit, after which the bytecode-level slow path would call +// ToString again. Verify ToString is invoked exactly once per join() call +// across all tiers. + +function join(arr, sep) { + return arr.join(sep); +} +noInline(join); + +// Plain object separator: counter should equal the number of calls. +{ + var arr = [1, 2, 3]; + var calls = 0; + var sep = { toString() { ++calls; return ","; } }; + for (var i = 0; i < testLoopCount; ++i) + shouldBe(join(arr, sep), "1,2,3"); + shouldBe(calls, testLoopCount); +} + +// Object separator whose ToString shrinks the array. Even when the mutation +// invalidates the fast path, ToString must run exactly once per join(). +{ + var calls = 0; + function call() { + var arr = [1, 2, 3]; + var sep = { toString() { ++calls; arr.length = 1; return ","; } }; + return arr.join(sep); + } + noInline(call); + for (var i = 0; i < testLoopCount; ++i) + shouldBe(call(), "1,,"); + shouldBe(calls, testLoopCount); +} + +// Object separator whose ToString transitions the array's indexing type +// (Int32 -> Contiguous). ToString must still run exactly once per call. +{ + var calls = 0; + function call() { + var arr = [1, 2, 3]; + var sep = { toString() { ++calls; arr[1] = "X"; return ","; } }; + return arr.join(sep); + } + noInline(call); + for (var i = 0; i < testLoopCount; ++i) + shouldBe(call(), "1,X,3"); + shouldBe(calls, testLoopCount); +} + +// Object separator with empty-string ToString that punches a hole. The +// empty-separator fast path would otherwise read the hole; ToString still +// runs exactly once per call. +{ + var calls = 0; + function call() { + var arr = [1, 2, 3]; + var sep = { toString() { ++calls; delete arr[1]; return ""; } }; + return arr.join(sep); + } + noInline(call); + for (var i = 0; i < testLoopCount; ++i) + shouldBe(call(), "13"); + shouldBe(calls, testLoopCount); +} + +// Object separator with empty-string ToString that shrinks the array. The +// empty-separator fast path would otherwise read past the new length; +// ToString still runs exactly once per call. +{ + var calls = 0; + function call() { + var arr = [1, 2, 3]; + var sep = { toString() { ++calls; arr.length = 1; return ""; } }; + return arr.join(sep); + } + noInline(call); + for (var i = 0; i < testLoopCount; ++i) + shouldBe(call(), "1"); + shouldBe(calls, testLoopCount); +} diff --git a/JSTests/stress/array-join-dfg-string-separator.js b/JSTests/stress/array-join-dfg-string-separator.js new file mode 100644 index 000000000000..b60015269b56 --- /dev/null +++ b/JSTests/stress/array-join-dfg-string-separator.js @@ -0,0 +1,39 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function joinComma(arr) { + return arr.join(","); +} +noInline(joinComma); + +function joinDash(arr) { + return arr.join("-"); +} +noInline(joinDash); + +function joinMulti(arr) { + return arr.join("--"); +} +noInline(joinMulti); + +var int32Array = [1, 2, 3, 4, 5]; +var contiguousArray = ["a", "b", "c"]; +var doubleArray = [1.5, 2.5, 3.5]; + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(joinComma(int32Array), "1,2,3,4,5"); + shouldBe(joinDash(int32Array), "1-2-3-4-5"); + shouldBe(joinMulti(int32Array), "1--2--3--4--5"); + shouldBe(joinComma(contiguousArray), "a,b,c"); + shouldBe(joinDash(contiguousArray), "a-b-c"); + shouldBe(joinComma(doubleArray), "1.5,2.5,3.5"); +} + +// Edge cases +shouldBe(joinComma([]), ""); +shouldBe(joinComma([42]), "42"); +shouldBe(joinComma([null, undefined, 1]), ",,1"); +shouldBe(joinComma([NaN, Infinity, -0]), "NaN,Infinity,0"); +shouldBe([1, , 3].join(","), "1,,3"); diff --git a/JSTests/stress/array-join-dfg-tostring-mutation.js b/JSTests/stress/array-join-dfg-tostring-mutation.js new file mode 100644 index 000000000000..287155aaf7cb --- /dev/null +++ b/JSTests/stress/array-join-dfg-tostring-mutation.js @@ -0,0 +1,86 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +// 1. ToString shrinks arr.length. Per spec (Array.prototype.join): +// Step 2 captures len BEFORE step 4 ToString(separator). The loop iterates +// over the captured len; mutated indices read as undefined and become "". +function joinShrink() { + var arr = [1, 2, 3]; + var sep = { toString() { arr.length = 1; return ","; } }; + return arr.join(sep); +} +noInline(joinShrink); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinShrink(), "1,,"); + +// 2. ToString grows arr.length. Captured len is 3, so we ignore appended items. +function joinGrow() { + var arr = [1, 2, 3]; + var sep = { toString() { arr.push(99, 100); return ","; } }; + return arr.join(sep); +} +noInline(joinGrow); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinGrow(), "1,2,3"); + +// 3. ToString causes Int32→Contiguous transition (storing a string forces the +// indexing type to widen). Post-toString must revalidate the array mode. +function joinTransition() { + var arr = [1, 2, 3]; + var sep = { toString() { arr[1] = "X"; return ","; } }; + return arr.join(sep); +} +noInline(joinTransition); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinTransition(), "1,X,3"); + +// 4. ToString punches a hole in the array and reads it via the empty-separator +// fast path. The joiner must see the hole and fall back; result is "13". +function joinHolePunch() { + var arr = [1, 2, 3]; + var sep = { toString() { delete arr[1]; return ""; } }; + return arr.join(sep); +} +noInline(joinHolePunch); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinHolePunch(), "13"); + +// 5. ToString replaces an Int32 element with a non-string/non-int32 value +// (object). The empty-separator JSOnlyStringsAndInt32sJoiner must bail out +// of its fast path and the slow path must still produce spec-correct output. +function joinNonStringElement() { + var arr = [1, 2, 3]; + var obj = { toString() { return "OBJ"; } }; + var sep = { toString() { arr[1] = obj; return ""; } }; + return arr.join(sep); +} +noInline(joinNonStringElement); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinNonStringElement(), "1OBJ3"); + +// 6. ToString shrinks the array AND uses the empty-separator fast path. The +// fast path reads butterfly[0, capturedLength); after shrink, slots beyond +// the new length are conceptually undefined, so reading them via the joiner +// is incorrect. The needsRevalidation path must detect length mismatch and +// fall through to fastArrayJoin which handles it. Expected: "1". +function joinShrinkEmpty() { + var arr = [1, 2, 3]; + var sep = { toString() { arr.length = 1; return ""; } }; + return arr.join(sep); +} +noInline(joinShrinkEmpty); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinShrinkEmpty(), "1"); + +// 7. ToString grows the array with empty separator. Captured length is 3, so +// appended elements are ignored. Expected: "123". +function joinGrowEmpty() { + var arr = [1, 2, 3]; + var sep = { toString() { arr.push(99, 100); return ""; } }; + return arr.join(sep); +} +noInline(joinGrowEmpty); +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinGrowEmpty(), "123"); diff --git a/JSTests/stress/array-join-dfg-undefined-separator.js b/JSTests/stress/array-join-dfg-undefined-separator.js new file mode 100644 index 000000000000..fb7a84564845 --- /dev/null +++ b/JSTests/stress/array-join-dfg-undefined-separator.js @@ -0,0 +1,53 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +// Parser-level fold: arr.join(undefined) where undefined is a static JSConstant +function joinUndefinedLiteral(arr) { + return arr.join(undefined); +} +noInline(joinUndefinedLiteral); + +// Parser-level fold: arr.join() with no argument (separator is implicit undefined) +function joinNoArg(arr) { + return arr.join(); +} +noInline(joinNoArg); + +// Strength-reduction case: separator is a variable that resolves to undefined +// after constant propagation. The bytecode parser sees a non-constant Get, +// but later phases fold it. +function joinViaVar(arr) { + var sep; + return arr.join(sep); +} +noInline(joinViaVar); + +// Inlined: callee passes through a parameter that the caller leaves undefined. +function inner(arr, sep) { + return arr.join(sep); +} +function outer(arr) { + return inner(arr); +} +noInline(outer); + +var int32Array = [1, 2, 3, 4, 5]; +var contiguousArray = ["a", "b", "c"]; +var doubleArray = [1.5, 2.5, 3.5]; + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(joinUndefinedLiteral(int32Array), "1,2,3,4,5"); + shouldBe(joinUndefinedLiteral(contiguousArray), "a,b,c"); + shouldBe(joinUndefinedLiteral(doubleArray), "1.5,2.5,3.5"); + + shouldBe(joinNoArg(int32Array), "1,2,3,4,5"); + shouldBe(joinNoArg(contiguousArray), "a,b,c"); + + shouldBe(joinViaVar(int32Array), "1,2,3,4,5"); + shouldBe(joinViaVar(contiguousArray), "a,b,c"); + + shouldBe(outer(int32Array), "1,2,3,4,5"); + shouldBe(outer(contiguousArray), "a,b,c"); +} diff --git a/JSTests/stress/array-join-dfg-untyped-separator.js b/JSTests/stress/array-join-dfg-untyped-separator.js new file mode 100644 index 000000000000..6f03b34c3382 --- /dev/null +++ b/JSTests/stress/array-join-dfg-untyped-separator.js @@ -0,0 +1,80 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function shouldThrow(fn, errorType) { + var threw = false; + try { + fn(); + } catch (e) { + threw = true; + if (!(e instanceof errorType)) + throw new Error('Expected ' + errorType.name + ', got ' + e); + } + if (!threw) + throw new Error('Expected throw'); +} + +function join(arr, sep) { + return arr.join(sep); +} +noInline(join); + +var array = [1, 2, 3]; + +// Number separator -> ToString -> "1" +for (var i = 0; i < testLoopCount; ++i) + shouldBe(join(array, 1), "11213"); + +// Boolean separator -> "true" +for (var i = 0; i < testLoopCount; ++i) + shouldBe(join(array, true), "1true2true3"); + +// Null separator -> "null" +for (var i = 0; i < testLoopCount; ++i) + shouldBe(join(array, null), "1null2null3"); + +// Object with custom toString +var customSep = { toString() { return "<>"; } }; +for (var i = 0; i < testLoopCount; ++i) + shouldBe(join(array, customSep), "1<>2<>3"); + +// Toggling separator types in the same compiled function (forces UntypedUse) +function pick(i) { + if (i & 1) + return ","; + return 1; +} +function joinPicked(arr, i) { + return arr.join(pick(i)); +} +noInline(joinPicked); +for (var i = 0; i < testLoopCount; ++i) { + if (i & 1) + shouldBe(joinPicked(array, i), "1,2,3"); + else + shouldBe(joinPicked(array, i), "11213"); +} + +// Symbol separator throws TypeError +for (var i = 0; i < 1000; ++i) { + shouldThrow(() => join(array, Symbol("s")), TypeError); +} + +// toString that throws propagates the error +function throwingSep() { + return { toString() { throw new Error("boom"); } }; +} +for (var i = 0; i < 1000; ++i) { + var threw = false; + try { + join(array, throwingSep()); + } catch (e) { + threw = true; + if (e.message !== "boom") + throw new Error('Wrong error: ' + e.message); + } + if (!threw) + throw new Error('Expected throw'); +} diff --git a/JSTests/stress/array-join-tostring-adds-indexed-prototype-property.js b/JSTests/stress/array-join-tostring-adds-indexed-prototype-property.js new file mode 100644 index 000000000000..71b61949290c --- /dev/null +++ b/JSTests/stress/array-join-tostring-adds-indexed-prototype-property.js @@ -0,0 +1,76 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +// An element's toString adds an indexed property to Array.prototype. Holes visited +// after that point must forward to the prototype instead of being treated as empty. +{ + let calls = 0; + const obj = { + toString() { + calls++; + Array.prototype[2] = "P"; + return "X"; + } + }; + const arr = [, obj, , ]; + arr.length = 3; + shouldBe(arr.join(","), ",X,P"); + shouldBe(calls, 1); + delete Array.prototype[2]; +} + +// Multiple holes after the mutation point. +{ + const obj = { + toString() { + Array.prototype[1] = "P1"; + Array.prototype[2] = "P2"; + return "X"; + } + }; + const arr = [obj, , , ]; + arr.length = 3; + shouldBe(arr.join(","), "X,P1,P2"); + delete Array.prototype[1]; + delete Array.prototype[2]; +} + +// The added prototype property is an accessor; it must be invoked exactly once. +{ + let getterCalls = 0; + const obj = { + toString() { + Object.defineProperty(Array.prototype, 1, { + get() { + getterCalls++; + return "G"; + }, + configurable: true + }); + return "X"; + } + }; + const arr = [obj, , ]; + arr.length = 2; + shouldBe(arr.join(","), "X,G"); + shouldBe(getterCalls, 1); + delete Array.prototype[1]; +} + +// Holes visited before the mutation must still read as empty. +{ + const obj = { + toString() { + Array.prototype[0] = "P0"; + Array.prototype[2] = "P2"; + return "X"; + } + }; + const arr = [, obj, , ]; + arr.length = 3; + shouldBe(arr.join(","), ",X,P2"); + delete Array.prototype[0]; + delete Array.prototype[2]; +} diff --git a/JSTests/stress/array-prototype-valueOf-override-should-not-break-toPrimitive.js b/JSTests/stress/array-prototype-valueOf-override-should-not-break-toPrimitive.js new file mode 100644 index 000000000000..f8100e5824fe --- /dev/null +++ b/JSTests/stress/array-prototype-valueOf-override-should-not-break-toPrimitive.js @@ -0,0 +1,11 @@ +Array.prototype.valueOf = function() { return 99; }; + +const arr = [1, 2, 3]; +const slowArr = [1, 2, 3]; +slowArr.__proto__ = Object.create(Array.prototype); + +if ("" + arr !== "99") + throw `Expected "99" for arr, got "${"" + arr}"`; + +if ("" + slowArr !== "99") + throw `Expected "99" for slowArr, got "${"" + slowArr}"`; \ No newline at end of file diff --git a/JSTests/stress/b3cppi-ssa-dominance.js b/JSTests/stress/b3cppi-ssa-dominance.js new file mode 100644 index 000000000000..898cc5bb242e --- /dev/null +++ b/JSTests/stress/b3cppi-ssa-dominance.js @@ -0,0 +1,24 @@ +//@ requireOptions("--useConcurrentJIT=0", "--useB3CanonicalizePrePostIncrements=1") + +const arr1 = new Int32Array(256); +arr1.fill(0x1337) +const arr2 = new Int32Array(256); +arr2.fill(0x1337) + +function trigger(arr, cond) { + if (arr.length !== 256) return 0; // Eliminate bounds check side-exits + + let res = 0; + for (let j = 0; j < 2; j++) { + if (cond) { + Atomics.add(arr, 1, 1337); + } + + res = arr[1]; + } + return res; +} + +for (let i = 0; i < 100000; i++) { + let ret = trigger(i % 2 === 0 ? arr1 : arr2, i % 2 === 0); +} diff --git a/JSTests/stress/baseline-op-del-by-id-write-barrier.js b/JSTests/stress/baseline-op-del-by-id-write-barrier.js new file mode 100644 index 000000000000..f15ddc1e69c3 --- /dev/null +++ b/JSTests/stress/baseline-op-del-by-id-write-barrier.js @@ -0,0 +1,29 @@ +//@ requireOptions("--verifyHeap=1", "--useConcurrentJIT=0") + +function main() { + globalThis.dummy = { + x: 1 + }; + + globalThis.dummy.y = 2; + + for (let i = 0; i < 10; i++) { + const target = {x: 1}; + fullGC(); + + let opt = new Function('o', 'o = delete o.x;'); + + for (let j = 0; j < 10; j++) { + opt({ + x: 1 + }); + } + + opt(target); + opt = null; + + edenGC(); + } +} + +main(); diff --git a/JSTests/stress/baseline-op-del-by-val-write-barrier.js b/JSTests/stress/baseline-op-del-by-val-write-barrier.js new file mode 100644 index 000000000000..e22d0c6d1db7 --- /dev/null +++ b/JSTests/stress/baseline-op-del-by-val-write-barrier.js @@ -0,0 +1,24 @@ +//@ requireOptions("--verifyHeap=1", "--useConcurrentJIT=0") + +function main() { + globalThis.dummy = {x: 1}; + globalThis.dummy.y = 2; + + for (let i = 0; i < 100; i++) { + const target = {x: 1}; + fullGC(); + + let opt = new Function('o', 'o = delete o["x"];'); + + for (let j = 0; j < 10; j++) { + opt({x: 1}); + } + + opt(target); + opt = null; + + edenGC(); + } +} + +main(); diff --git a/JSTests/stress/bigint-in-place-thresholds.js b/JSTests/stress/bigint-in-place-thresholds.js new file mode 100644 index 000000000000..25291f7aebe3 --- /dev/null +++ b/JSTests/stress/bigint-in-place-thresholds.js @@ -0,0 +1,113 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`Expected ${expected} but got ${actual}`); +} + +// Exercise both sides of maxInPlaceSubSize = 16 (absoluteSub) and +// maxInPlaceCachedModSize = 8 (cachedMod) so that a future tweak to either +// constant can't silently bypass the in-place fast path on the hot path. + +// absoluteSub: x and y are positive, |x| > |y|, x.length() in {15, 16, 17, 18} digits (64-bit). +// length L means 2^((L-1)*64) <= |x| < 2^(L*64). +{ + const oneDigitBits = 64n; + function pow2(n) { return 1n << n; } + function topDigitBit(L) { return BigInt(L) * oneDigitBits - 1n; } + + for (const L of [15, 16, 17, 18, 32, 64]) { + // Force x to have exactly L digits and y to have L-1 digits. + const x = pow2(topDigitBit(L)) | 12345n; + const y = pow2(topDigitBit(L - 1)) | 7n; + const expected = x - y; + let actual = 0n; + for (let i = 0; i < 200; i++) + actual = x - y; + shouldBe(actual, expected); + // Negation path (resultSign flipped). + let actualNeg = 0n; + for (let i = 0; i < 200; i++) + actualNeg = y - x; + shouldBe(actualNeg, -expected); + } +} + +// absoluteSub: result normalizes to zero (|x| - |y| with all leading digits cancelling). +{ + for (const L of [4, 8, 16, 17, 32]) { + const x = (1n << BigInt(L * 64)) - 1n; + const y = (1n << BigInt(L * 64)) - 1n; + let actual = -1n; + for (let i = 0; i < 200; i++) + actual = x - y; + shouldBe(actual, 0n); + } +} + +// absoluteAdd: in-place path is always taken below maxLength; verify various sizes. +{ + for (const L of [1, 2, 8, 16, 17, 32, 100]) { + const x = (1n << BigInt(L * 64 - 1)) | 3n; + const y = (1n << BigInt(L * 64 - 1)) | 5n; + const expected = x + y; + let actual = 0n; + for (let i = 0; i < 200; i++) + actual = x + y; + shouldBe(actual, expected); + // Carry that grows the length by one. + const xMax = (1n << BigInt(L * 64)) - 1n; + const yOne = 1n; + let actualCarry = 0n; + for (let i = 0; i < 200; i++) + actualCarry = xMax + yOne; + shouldBe(actualCarry, 1n << BigInt(L * 64)); + } +} + +// cachedMod: install divisor in cache (>= 100 iters with same y), then run past +// the threshold. ySpan.size() in {7, 8, 9, 10, 16, 32} digits. +{ + function divisorWithLength(L) { + // Top digit non-zero, low digit non-zero — canonicalised to exactly L digits. + return (1n << BigInt(L * 64 - 1)) | 19n; + } + for (const L of [7, 8, 9, 10, 16, 32]) { + const p = divisorWithLength(L); + // Dividend roughly 2x divisor size — falls under the xSpan <= 2*ySpan guard. + let x = (1n << BigInt(L * 64 + L * 32)) | 0xdeadbeefn; + const seed = x; + let actual = x; + for (let i = 0; i < 250; i++) + actual = (actual * 3n + 1n) % p; + // Recompute with a fresh divisor object so we exit the cached path; results must match. + const pCopy = (p + 0n); // identity, but JIT/runtime treats as same value + let expected = seed; + for (let i = 0; i < 250; i++) + expected = (expected * 3n + 1n) % pCopy; + shouldBe(actual, expected); + // Dividend exact multiple: cached-mod yields zero (canonical zero return path). + let zero = -1n; + for (let i = 0; i < 200; i++) + zero = (p * 7n) % p; + shouldBe(zero, 0n); + // Negative dividend: sign handling with cached mod. + let neg = 0n; + for (let i = 0; i < 200; i++) + neg = (-(seed * 5n + 3n)) % p; + shouldBe(neg <= 0n, true); + if (neg !== 0n) + shouldBe(-neg < p, true); + } +} + +// cachedMod: divisor swap mid-loop — cache must invalidate cleanly. +{ + const p1 = (1n << 511n) | 19n; // 8 digits + const p2 = (1n << 575n) | 23n; // 9 digits — crosses the maxInPlaceCachedModSize boundary + let x = (1n << 600n) | 1n; + for (let i = 0; i < 150; i++) + x = (x * x + 1n) % p1; + let y = x; + for (let i = 0; i < 150; i++) + y = (y * y + 1n) % p2; + shouldBe(y >= 0n && y < p2, true); +} diff --git a/JSTests/stress/bigint-inc-dec-in-place.js b/JSTests/stress/bigint-inc-dec-in-place.js new file mode 100644 index 000000000000..25f25775ade6 --- /dev/null +++ b/JSTests/stress/bigint-inc-dec-in-place.js @@ -0,0 +1,124 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`Expected ${expected} but got ${actual}`); +} + +function inc(n) { return ++n; } +function dec(n) { return --n; } +noInline(inc); +noInline(dec); + +const oneDigitBits = 64n; +function pow2(n) { return 1n << n; } + +// Zero crossing. +shouldBe(inc(0n), 1n); +shouldBe(dec(0n), -1n); +shouldBe(inc(-1n), 0n); +shouldBe(dec(1n), 0n); +shouldBe(inc(-2n), -1n); +shouldBe(dec(-1n), -2n); + +// BigInt32 boundaries (under USE(BIGINT32) these transition to/from heap BigInt). +shouldBe(inc(2147483647n), 2147483648n); +shouldBe(dec(2147483648n), 2147483647n); +shouldBe(inc(-2147483649n), -2147483648n); +shouldBe(dec(-2147483648n), -2147483649n); + +// Carry propagation across digit boundaries: length grows by one digit. +for (const L of [1, 2, 3, 4, 16, 17, 64]) { + const allOnes = pow2(BigInt(L) * oneDigitBits) - 1n; // L digits of all-ones + shouldBe(inc(allOnes), pow2(BigInt(L) * oneDigitBits)); + shouldBe(dec(-allOnes), -pow2(BigInt(L) * oneDigitBits)); +} + +// Borrow propagation: length shrinks by one digit. +for (const L of [2, 3, 4, 16, 17, 64]) { + const powerOfDigit = pow2(BigInt(L - 1) * oneDigitBits); // L digits: [0, ..., 0, 1] + shouldBe(dec(powerOfDigit), powerOfDigit - 1n); + shouldBe(inc(-powerOfDigit), -(powerOfDigit - 1n)); +} + +// No carry/borrow out of the top digit: length stays the same. +for (const L of [1, 2, 3, 16, 64]) { + const x = pow2(BigInt(L) * oneDigitBits - 1n) | 12345n; + shouldBe(inc(x), x + 1n); + shouldBe(dec(x), x - 1n); + shouldBe(inc(-x), -(x - 1n)); + shouldBe(dec(-x), -(x + 1n)); +} + +// Carry stops in the middle: low digit all-ones, higher digits not. +for (const L of [2, 3, 16]) { + const x = (pow2(BigInt(L) * oneDigitBits - 1n)) | (pow2(oneDigitBits) - 1n); + shouldBe(inc(x), x + 1n); + shouldBe(dec(x + 1n), x); + shouldBe(dec(-x), -(x + 1n)); + shouldBe(inc(-(x + 1n)), -x); +} + +// Repeated inc/dec walking across a digit boundary, cross-checked against +/-. +{ + let n = pow2(oneDigitBits) - 5n; + let m = n; + for (let i = 0; i < 10; i++) { + n = inc(n); + m = m + 1n; + shouldBe(n, m); + } + for (let i = 0; i < 20; i++) { + n = dec(n); + m = m - 1n; + shouldBe(n, m); + } + shouldBe(n, pow2(oneDigitBits) - 15n); +} + +// Operands must not be mutated (results are fresh cells). +{ + const x = pow2(130n) - 1n; + const before = x.toString(); + inc(x); + dec(x); + shouldBe(x.toString(), before); +} + +// maxLength boundary: maxLengthBits = 1 << 20. +{ + const maxLengthBits = 1048576n; + // 2^maxLengthBits - 1 (exactly maxLength digits, all-ones), built without + // materializing 2^maxLengthBits itself. + const max = ((pow2(maxLengthBits - 1n) - 1n) << 1n) | 1n; + shouldBe(dec(max), max - 1n); + shouldBe(inc(max - 1n), max); + shouldBe(inc(-max), -(max - 1n)); + let caught = null; + try { + inc(max); // would need maxLength + 1 digits + } catch (error) { + caught = error; + } + shouldBe(caught instanceof RangeError, true); + caught = null; + try { + dec(-max); + } catch (error) { + caught = error; + } + shouldBe(caught instanceof RangeError, true); + // No overflow when the carry does not propagate to a new digit. + const nearMax = max - pow2(maxLengthBits - 1n); // still maxLength digits + shouldBe(inc(nearMax), nearMax + 1n); +} + +// Stress with tiering: keep inc/dec hot on multi-digit values. +{ + const base = pow2(192n) - 2n; + let n = base; + for (let i = 0; i < 1e4; i++) + n = inc(n); + shouldBe(n, base + 10000n); + for (let i = 0; i < 1e4; i++) + n = dec(n); + shouldBe(n, base); +} diff --git a/JSTests/stress/checkpoint-exception-handler-during-osr-exit.js b/JSTests/stress/checkpoint-exception-handler-during-osr-exit.js new file mode 100644 index 000000000000..8fb72e0cdf8d --- /dev/null +++ b/JSTests/stress/checkpoint-exception-handler-during-osr-exit.js @@ -0,0 +1,38 @@ +//@ requireOptions("--poisonDeadOSRExitVariables=1") + +const b = () => {}; + +function inlinee() { + const a = {}; + const c = a instanceof b; + try { + + } catch { + return c; + } +} + +function opt() { + return inlinee(); +} + +function main() { + for (let i = 0; i < 1000; i++) { + b.prototype = {}; + opt(); + } + + b.prototype = null; + + opt().foo(); +} + +let exn; +try { + main(); +} catch (e) { + exn = e; +} +if (exn?.constructor !== TypeError && exn?.message.indexOf("instanceof") < 0) { + throw new Error("expected TypeError in instanceof"); +} diff --git a/JSTests/stress/create-many-realms.js b/JSTests/stress/create-many-realms.js index 1a161f390d5b..4d8e121393a6 100644 --- a/JSTests/stress/create-many-realms.js +++ b/JSTests/stress/create-many-realms.js @@ -1,4 +1,4 @@ - //@ runDefault("--collectContinuously=1", "--collectContinuouslyPeriodMS=20", "--useGenerationalGC=0", "--useStochasticMutatorScheduler=0", "--useDFGJIT=0", "--useFTLJIT=0", "--maxPerThreadStackUsage=1000000") +//@ runDefault("--collectContinuously=1", "--collectContinuouslyPeriodMS=20", "--useGenerationalGC=0", "--useStochasticMutatorScheduler=0", "--useDFGJIT=0", "--useFTLJIT=0", "--maxPerThreadStackUsage=1000000") function foo(count) { const x = createGlobalObject(); diff --git a/JSTests/stress/cross-realm-await-thenable-resolve-realm.js b/JSTests/stress/cross-realm-await-thenable-resolve-realm.js new file mode 100644 index 000000000000..9caccca105aa --- /dev/null +++ b/JSTests/stress/cross-realm-await-thenable-resolve-realm.js @@ -0,0 +1,115 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ', expected ' + expected); +} + +const results = {}; + +function setup(label, makePromise) { + const other = createGlobalObject(); + other.MainFunction = Function; + other.results = results; + other.label = label; + const { promise, settle } = makePromise(); + other.subject = promise; + new other.Function(` + (async () => { + await subject; + await { then(f) { + results[label] = f.constructor === Function ? "own-realm" + : f.constructor === MainFunction ? "main-realm" + : "unknown"; + f(0); + } }; + results[label + "-done"] = true; + })(); + `)(); + return settle; +} + +// An async function awaiting a pending cross-realm vanilla promise must not have +// its continuation realm poisoned: the resolving functions of a subsequently +// awaited thenable must belong to the async function's realm. +const settlePending = setup("pending-vanilla", () => { + let resolve; + const promise = new Promise((r) => { resolve = r; }); + return { promise, settle: () => { resolve(1); } }; +}); + +setup("fulfilled-vanilla", () => ({ promise: Promise.resolve(1), settle: () => {} })); + +class SubPromise extends Promise {} +const settleSubclass = setup("pending-subclass", () => { + let resolve; + const promise = new SubPromise((r) => { resolve = r; }); + return { promise, settle: () => { resolve(1); } }; +}); + +// Adopting a cross-realm promise through a resolving function must not leak the +// foreign realm into a same-realm promise that an async function is awaiting. +let settleMainForAdoption; +{ + const other = createGlobalObject(); + other.MainFunction = Function; + other.results = results; + const mainPending = new Promise((r) => { settleMainForAdoption = () => { r(2); }; }); + other.subject = mainPending; + new other.Function(` + let resolveLocal; + const local = new Promise((r) => { resolveLocal = r; }); + (async () => { + await local; + await { then(f) { + results["resolving-function-adoption"] = f.constructor === Function ? "own-realm" + : f.constructor === MainFunction ? "main-realm" + : "unknown"; + f(0); + } }; + results["resolving-function-adoption-done"] = true; + })(); + resolveLocal(subject); + `)(); +} + +// Async generators drive awaited values through the same adoption path. +let settleMainForGenerator; +{ + const other = createGlobalObject(); + other.MainFunction = Function; + other.results = results; + const mainPending = new Promise((r) => { settleMainForGenerator = () => { r(3); }; }); + other.subject = mainPending; + new other.Function(` + async function* generate() { + await subject; + yield { then(f) { + results["async-generator"] = f.constructor === Function ? "own-realm" + : f.constructor === MainFunction ? "main-realm" + : "unknown"; + f(0); + } }; + } + (async () => { + for await (const value of generate()) { } + results["async-generator-done"] = true; + })(); + `)(); +} + +drainMicrotasks(); +settlePending(); +settleSubclass(); +settleMainForAdoption(); +settleMainForGenerator(); +drainMicrotasks(); + +shouldBe(results["pending-vanilla"], "own-realm"); +shouldBe(results["pending-vanilla-done"], true); +shouldBe(results["fulfilled-vanilla"], "own-realm"); +shouldBe(results["fulfilled-vanilla-done"], true); +shouldBe(results["pending-subclass"], "own-realm"); +shouldBe(results["pending-subclass-done"], true); +shouldBe(results["resolving-function-adoption"], "own-realm"); +shouldBe(results["resolving-function-adoption-done"], true); +shouldBe(results["async-generator"], "own-realm"); +shouldBe(results["async-generator-done"], true); diff --git a/JSTests/stress/cross-realm-promise-internal-reaction-realm.js b/JSTests/stress/cross-realm-promise-internal-reaction-realm.js new file mode 100644 index 000000000000..2417669d311b --- /dev/null +++ b/JSTests/stress/cross-realm-promise-internal-reaction-realm.js @@ -0,0 +1,163 @@ +function shouldBe(actual, expected, label) { + if (actual !== expected) + throw new Error('bad value for ' + label + ': ' + actual + ', expected ' + expected); +} + +const results = {}; + +// Each case primes an own-realm async function through a promise that is +// settled by an internal microtask carrying the main realm's globalObject. +// The realm of the resolving function passed to a subsequently awaited +// thenable must remain the async function's realm. +function setup(label, body, makeSubject) { + const other = createGlobalObject(); + other.MainFunction = Function; + other.MainObject = Object; + other.MainAggregateError = AggregateError; + other.results = results; + other.label = label; + const { subject, settle } = makeSubject(); + other.subject = subject; + new other.Function(` + const realmOf = (value) => { + const c = value.constructor; + return c === Function || c === Object || c === AggregateError ? "own-realm" + : c === MainFunction || c === MainObject || c === MainAggregateError ? "main-realm" + : "unknown"; + }; + const observe = async (promise) => { + await promise; + await { then(f) { results[label] = realmOf(f); f(0); } }; + results[label + "-done"] = true; + }; + ${body} + `)(); + return settle; +} + +function makePending() { + let resolve; + const promise = new Promise((r) => { resolve = r; }); + return { subject: promise, settle: () => { resolve(1); } }; +} + +function makePendingRejection() { + let reject; + const promise = new Promise((unused, r) => { reject = r; }); + return { subject: promise, settle: () => { reject(new Error("rejected")); } }; +} + +const settles = []; + +// PromiseReactionJob: result promise of then() must not be settled with the +// foreign settle-time realm. +settles.push(setup("then-fn", ` + observe(Promise.prototype.then.call(subject, (x) => x)); +`, makePending)); + +settles.push(setup("then-no-handler", ` + observe(Promise.prototype.then.call(subject)); +`, makePending)); + +settles.push(setup("catch-fn", ` + observe(Promise.prototype.catch.call(subject, () => {})); +`, makePending)); + +// PromiseFinallyReactionJob / PromiseFinallyAwaitJob. +settles.push(setup("finally", ` + observe(Promise.prototype.finally.call(subject, () => {})); +`, makePending)); + +settles.push(setup("finally-promise-result", ` + observe(Promise.prototype.finally.call(subject, () => Promise.resolve(0))); +`, makePending)); + +// Combinator jobs, primed through a then()-poisoned own-realm promise. +settles.push(setup("all", ` + observe(Promise.all([Promise.prototype.then.call(subject)])); +`, makePending)); + +settles.push(setup("race", ` + observe(Promise.race([Promise.prototype.then.call(subject)])); +`, makePending)); + +settles.push(setup("all-settled", ` + observe(Promise.allSettled([Promise.prototype.then.call(subject)])); +`, makePending)); + +// PromiseAllSettledResolveJob creates the result objects: their realm is +// directly observable. +settles.push(setup("all-settled-result-object", ` + (async () => { + const entries = await Promise.allSettled([Promise.prototype.then.call(subject)]); + results[label] = realmOf(entries[0]); + results[label + "-done"] = true; + })(); +`, makePending)); + +// PromiseAnyResolveJob creates the AggregateError: its realm is directly +// observable. +settles.push(setup("any-aggregate-error", ` + (async () => { + try { + await Promise.any([Promise.prototype.then.call(subject)]); + } catch (error) { + results[label] = realmOf(error); + } + results[label + "-done"] = true; + })(); +`, makePendingRejection)); + +// AsyncFromSyncIteratorContinue: for-await over a sync iterable of a +// poisoned own-realm promise. +settles.push(setup("async-from-sync", ` + (async () => { + for await (const value of [Promise.prototype.then.call(subject)]) { } + await { then(f) { results[label] = realmOf(f); f(0); } }; + results[label + "-done"] = true; + })(); +`, makePending)); + +// Async generator driver primed through a poisoned own-realm promise. +settles.push(setup("async-generator-driver", ` + async function* generate() { + await Promise.prototype.then.call(subject); + yield { then(f) { results[label] = realmOf(f); f(0); } }; + } + (async () => { + for await (const value of generate()) { } + results[label + "-done"] = true; + })(); +`, makePending)); + +// Control: a fully own-realm chain stays own-realm. +settles.push(setup("own-realm-control", ` + let resolveLocal; + const local = new Promise((r) => { resolveLocal = r; }); + observe(Promise.prototype.then.call(local, (x) => x)); + resolveLocal(1); +`, () => ({ subject: null, settle: () => {} }))); + +drainMicrotasks(); +for (const settle of settles) + settle(); +drainMicrotasks(); + +for (const label of [ + "then-fn", + "then-no-handler", + "catch-fn", + "finally", + "finally-promise-result", + "all", + "race", + "all-settled", + "all-settled-result-object", + "any-aggregate-error", + "async-from-sync", + "async-generator-driver", + "own-realm-control", +]) { + shouldBe(results[label], "own-realm", label); + shouldBe(results[label + "-done"], true, label + "-done"); +} diff --git a/JSTests/stress/cross-realm-promise-microtask-ordering.js b/JSTests/stress/cross-realm-promise-microtask-ordering.js new file mode 100644 index 000000000000..dc3cd3cf96c2 --- /dev/null +++ b/JSTests/stress/cross-realm-promise-microtask-ordering.js @@ -0,0 +1,54 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ', expected ' + expected); +} + +function ticksOf(body, makeSubject) { + const log = []; + const other = createGlobalObject(); + other.log = (s) => log.push(s); + const { subject, settle } = makeSubject(other); + other.subject = subject; + new other.Function(body)(); + drainMicrotasks(); + settle(); + let p = Promise.resolve(); + for (let i = 0; i < 3; i++) { + const j = i; + p = p.then(() => log.push("c" + j)); + } + drainMicrotasks(); + return log.join(" "); +} + +function crossRealmPending() { + let resolve; + const promise = new Promise((r) => { resolve = r; }); + return { subject: promise, settle: () => { resolve(7); } }; +} + +function sameRealmPending(other) { + new other.Function(` + let r; + globalThis.s = new Promise((res) => { r = res; }); + globalThis.doSettle = () => { r(7); }; + `)(); + return { subject: other.s, settle: () => { other.doSettle(); } }; +} + +const awaitBody = `(async () => { await subject; log("resumed"); })()`; + +// Await performs PromiseResolve, whose SameValue(Get(x, "constructor"), C) +// check fails for a cross-realm promise: it must be re-wrapped through the +// thenable path, costing exactly one extra microtask compared to same-realm. +shouldBe(ticksOf(awaitBody, crossRealmPending), "c0 resumed c1 c2"); +shouldBe(ticksOf(awaitBody, sameRealmPending), "resumed c0 c1 c2"); + +// Promise Resolve Functions have no such check: adopting a vanilla promise +// takes the same number of microtasks regardless of its realm. +const resolveBody = ` + const outer = new Promise((res) => { res(subject); }); + outer.then((v) => log("outer:" + v)); +`; +shouldBe(ticksOf(resolveBody, crossRealmPending), "c0 outer:7 c1 c2"); +shouldBe(ticksOf(resolveBody, sameRealmPending), "c0 outer:7 c1 c2"); diff --git a/JSTests/stress/dataview-bytelength-ic-stub-stack-desync.js b/JSTests/stress/dataview-bytelength-ic-stub-stack-desync.js new file mode 100644 index 000000000000..e5284097440c --- /dev/null +++ b/JSTests/stress/dataview-bytelength-ic-stub-stack-desync.js @@ -0,0 +1,44 @@ +let ab = new ArrayBuffer(64, { maxByteLength: 1024 }); +let dv = new DataView(ab); +let decoy = { byteLength: 7 }; +let decoy2 = { byteLength: 7, x: 1 }; +let decoy3 = { byteLength: 7, y: 1 }; + +let objs = []; +for (let i = 0; i < 64; i++) objs.push({marker: 0x1337 + i}); + +function hot(o, a, b) { + let p0=b[0], p1=b[1], p2=b[2], p3=b[3], p4=b[4], p5=b[5], p6=b[6], p7=b[7], + p8=b[8], p9=b[9], p10=b[10], p11=b[11], p12=b[12], p13=b[13], p14=b[14], p15=b[15], + p16=b[16], p17=b[17], p18=b[18], p19=b[19], p20=b[20], p21=b[21], p22=b[22], p23=b[23], + p24=b[24], p25=b[25], p26=b[26], p27=b[27], p28=b[28], p29=b[29], p30=b[30], p31=b[31]; + let len; + try { + len = o.byteLength; + } catch (e) { + len = -1; + } + return [len, p0.marker, p1.marker, p2.marker, p3.marker, p4.marker, p5.marker, p6.marker, p7.marker, + p8.marker, p9.marker, p10.marker, p11.marker, p12.marker, p13.marker, p14.marker, p15.marker, + p16.marker, p17.marker, p18.marker, p19.marker, p20.marker, p21.marker, p22.marker, p23.marker, + p24.marker, p25.marker, p26.marker, p27.marker, p28.marker, p29.marker, p30.marker, p31.marker]; +} +noInline(hot); + +let A = new Int32Array(64); +for (let i = 0; i < 64; i++) A[i] = i + 1; + +for (let i = 0; i < 200000; i++) { + hot(decoy, A, objs); + hot(decoy2, A, objs); + hot(decoy3, A, objs); + hot(dv, A, objs); +} + +for (let i = 0; i < 100; i++) { + hot(dv, A, objs); +} + +ab.transfer(); + +let r = hot(dv, A, objs); diff --git a/JSTests/stress/decouple-calllinkinfo-from-access-case.js b/JSTests/stress/decouple-calllinkinfo-from-access-case.js index a7fd1f75b1ab..a497dcf835f9 100644 --- a/JSTests/stress/decouple-calllinkinfo-from-access-case.js +++ b/JSTests/stress/decouple-calllinkinfo-from-access-case.js @@ -1,4 +1,4 @@ -// runDefault("--validateOptions=true", "--thresholdForJITSoon=10", "--thresholdForJITAfterWarmUp=10", "--thresholdForOptimizeAfterWarmUp=100", "--thresholdForOptimizeAfterLongWarmUp=100", "--thresholdForOptimizeSoon=100", "--thresholdForFTLOptimizeAfterWarmUp=1000", "--thresholdForFTLOptimizeSoon=1000", "--validateBCE=true") +//@ runDefault("--validateOptions=true", "--thresholdForJITSoon=10", "--thresholdForJITAfterWarmUp=10", "--thresholdForOptimizeAfterWarmUp=100", "--thresholdForOptimizeAfterLongWarmUp=100", "--thresholdForOptimizeSoon=100", "--thresholdForFTLOptimizeAfterWarmUp=1000", "--thresholdForFTLOptimizeSoon=1000", "--validateBCE=true") const ProxyConstructor = Proxy; const getPrototypeOf = Object.getPrototypeOf; diff --git a/JSTests/stress/dfg-boolean-to-number-known-boolean-use-via-iterator-fast-path.js b/JSTests/stress/dfg-boolean-to-number-known-boolean-use-via-iterator-fast-path.js new file mode 100644 index 000000000000..26ba77dbf233 --- /dev/null +++ b/JSTests/stress/dfg-boolean-to-number-known-boolean-use-via-iterator-fast-path.js @@ -0,0 +1,71 @@ +// Regression test for SpeculativeJIT and FTL's BooleanToNumber: the switch on child1's UseKind +// previously only handled BooleanUse and UntypedUse, crashing with "Bad use kind" when fixup +// upgraded BooleanUse to KnownBooleanUse (e.g., when the input was a CompareStrictEq on Int32 +// inputs and flowed through an immediate SetLocal at a non-exitOK position). +// +// The iterator-fast-path open emits exactly that pattern when seenModes contains both a Fast* +// kind and Generic — recompilation after OSR exit hits the multi-mode dispatch. This test +// forces that recompilation by mutating an iterator's structure mid-iteration. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function sumValuesIterator(iter) { + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(sumValuesIterator); + +function sumKeysIterator(iter) { + var sum = 0; + for (var k of iter) + sum += k; + return sum; +} +noInline(sumKeysIterator); + +function sumEntriesIterator(iter) { + var sum = 0; + for (var [k, v] of iter) + sum += k + v; + return sum; +} +noInline(sumEntriesIterator); + +var array = []; +for (var i = 0; i < 10; ++i) + array.push(i + 1); + +// Warm up under FastArrayValues/Keys/Entries. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumValuesIterator(array.values()), 55); + shouldBe(sumKeysIterator(array.keys()), 45); + shouldBe(sumEntriesIterator(array.entries()), 100); // (0+1)+(1+2)+...+(9+10) +} + +// Mutate to invalidate CheckStructure in the FastArrayValues path → OSR exit → recompile with +// both FastArrayValues and Generic in seenModes. +var customValues = array.values(); +customValues[Symbol.iterator] = function () { return [777][Symbol.iterator](); }; +shouldBe(sumValuesIterator(customValues), 777); + +var customKeys = array.keys(); +customKeys[Symbol.iterator] = function () { return [111][Symbol.iterator](); }; +shouldBe(sumKeysIterator(customKeys), 111); + +var customEntries = array.entries(); +customEntries[Symbol.iterator] = function () { return [[0, 222]][Symbol.iterator](); }; +shouldBe(sumEntriesIterator(customEntries), 222); + +// More iterations after recompilation. Without the SpeculativeJIT/FTL fix for KnownBooleanUse on +// BooleanToNumber, the recompile crashes with "Bad use kind" while compiling the dispatch +// ArithBitAnd in the multi-mode iterator-open path. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumValuesIterator(array.values()), 55); + shouldBe(sumKeysIterator(array.keys()), 45); + shouldBe(sumEntriesIterator(array.entries()), 100); +} diff --git a/JSTests/stress/dfg-ensure-absence-dictionary-then-property.js b/JSTests/stress/dfg-ensure-absence-dictionary-then-property.js new file mode 100644 index 000000000000..40e7f5cb17aa --- /dev/null +++ b/JSTests/stress/dfg-ensure-absence-dictionary-then-property.js @@ -0,0 +1,45 @@ +// Adding a property to an object with a (cacheable) dictionary structure does not +// transition the structure. So, the DFG must not prove the absence of 'then' based on +// a dictionary structure: neither CheckStructure nor a structure transition watchpoint +// can detect a 'then' property added after compilation. + +function createDictionaryObject() { + const object = { x: 42 }; + // Adding enough properties forces a transition to a cacheable dictionary structure. + for (let i = 0; i < 1000; i++) + object['p' + i] = i; + return object; +} + +let getterCalled = false; + +function opt(object) { + object.x; + return Promise.resolve(object); +} +noInline(opt); + +function main() { + const object = createDictionaryObject(); + + for (let i = 0; i < testLoopCount; i++) + opt(object); + + // With concurrent JIT, the optimized code may not be installed yet. Keep running + // until it is. numberOfDFGCompiles() returns a huge number when the DFG is + // disabled, so this loop terminates in every configuration. + for (let i = 0; i < 1e6 && numberOfDFGCompiles(opt) < 1; i++) + opt(object); + + // This does not change object's structure because it is a dictionary structure. + object.__defineGetter__('then', function () { + getterCalled = true; + }); + + opt(object); + + if (!getterCalled) + throw new Error("Promise.resolve() must observe the 'then' getter added after compilation"); +} + +main(); diff --git a/JSTests/stress/dfg-ensure-absence-own-then-property.js b/JSTests/stress/dfg-ensure-absence-own-then-property.js new file mode 100644 index 000000000000..8ea4c47269b3 --- /dev/null +++ b/JSTests/stress/dfg-ensure-absence-own-then-property.js @@ -0,0 +1,88 @@ +function createObject1() { + const tmp = { + toJSON: 1, + a: 1, + }; + + Object.create(tmp); + + return tmp; +} + +function createObject2() { + const tmp = { + b: 1, + toJSON: {} + }; + + Object.create(tmp); + + return tmp; +} + +function opt(container1, object2, array, thenable, flags) { + const promise = new Promise(() => {}); + + container1.x; + thenable.x; + + const object1 = Object.getPrototypeOf(container1); + + let tmp = object1; + object1.a; + + if (flags & 1) { + tmp = object2; + tmp.b; + + 0[0]; + } + + +tmp.toJSON; + +tmp.toJSON; + + array[0]; + Promise.resolve(+tmp.toJSON === 1 ? thenable : promise); + + array[0] = 2.3023e-320; +} + +function main() { + noDFG(main); + + const object1 = createObject1(); + const object2 = createObject2(); + + createObject1().z = 1; + + const container1 = Object.create(object1); + + const thenable = { + x: 1 + }; + + const array = { + 0: 1.1 + }; + + let trigger = false; + + thenable.__defineGetter__('then', () => { + if (trigger) { + array[0] = {}; + } + }); + + JSON.stringify(container1); + + for (let i = 0; i < 200; i++) { + opt(container1, object2, array, thenable, i); + } + + trigger = true; + opt(container1, object2, array, thenable, 0); + + array[0].x; +} + +main(); diff --git a/JSTests/stress/dfg-new-typed-array-with-size-zero-fill.js b/JSTests/stress/dfg-new-typed-array-with-size-zero-fill.js new file mode 100644 index 000000000000..dacfcb0dd8dc --- /dev/null +++ b/JSTests/stress/dfg-new-typed-array-with-size-zero-fill.js @@ -0,0 +1,39 @@ +function makeUint8(length) { return new Uint8Array(length); } +noInline(makeUint8); +function makeInt16(length) { return new Int16Array(length); } +noInline(makeInt16); +function makeInt32(length) { return new Int32Array(length); } +noInline(makeInt32); +function makeFloat32(length) { return new Float32Array(length); } +noInline(makeFloat32); +function makeFloat64(length) { return new Float64Array(length); } +noInline(makeFloat64); +function makeBigInt64(length) { return new BigInt64Array(length); } +noInline(makeBigInt64); +function makeConstantSizes() { return [new Float64Array(16), new Float64Array(17), new Uint8Array(128), new Uint8Array(129), new Int32Array(512), new Float64Array(1000)]; } +noInline(makeConstantSizes); + +function check(array, length, zero) { + if (array.length !== length) + throw new Error("bad length " + array.length + ", expected " + length); + for (let i = 0; i < length; ++i) { + if (array[i] !== zero) + throw new Error("non-zero element " + array[i] + " at index " + i + " of length " + length); + } +} + +const lengths = [0, 1, 2, 3, 5, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 127, 128, 129, 255, 256, 257, 511, 512, 513, 999, 1000, 1001]; +const constantLengths = [16, 17, 128, 129, 512, 1000]; + +for (let i = 0; i < testLoopCount; ++i) { + let length = lengths[i % lengths.length]; + check(makeUint8(length), length, 0); + check(makeInt16(length), length, 0); + check(makeInt32(length), length, 0); + check(makeFloat32(length), length, 0); + check(makeFloat64(length), length, 0); + check(makeBigInt64(length), length, 0n); + let constants = makeConstantSizes(); + for (let j = 0; j < constants.length; ++j) + check(constants[j], constantLengths[j], 0); +} diff --git a/JSTests/stress/direct-eval-cache-rope.js b/JSTests/stress/direct-eval-cache-rope.js new file mode 100644 index 000000000000..d552f495e9c9 --- /dev/null +++ b/JSTests/stress/direct-eval-cache-rope.js @@ -0,0 +1,29 @@ +// @requireOptions("--slowPathAllocsBetweenGCs=10") + +function getRope(index) { + const a = "[" + index + ',[]'.repeat(0x100) + "]"; + const b = "()"; + + [][a]; + + return a + b; +} + +function main() { + for (let i = 0; i < 1000; i++) { + const s = getRope(i); + getRope(0); + + gc(); + + try { + eval(s); + + } catch { + + } + } + +} + +main(); diff --git a/JSTests/stress/fixobviousspills-earlydefs.js b/JSTests/stress/fixobviousspills-earlydefs.js new file mode 100644 index 000000000000..e066e52aca0d --- /dev/null +++ b/JSTests/stress/fixobviousspills-earlydefs.js @@ -0,0 +1,43 @@ +const L = 100; +const M = 200; +const S = 0; +const E = 256; +const T = (E - S) - 5; + +for (let i = 0; i < 2; i++) { + let g = (a) => a.size; + let d = []; + + for (let c = 0; c < 16; c++) { + g(d); + + try { + const g = (a) => a.byteLength; + const b = new ArrayBuffer(M, { maxByteLength: M }); + const d = new DataView(b, 0, L); + + for (let c = S; c < E + 11; c++) { + g(1); + + if (c != E) { + for (let c = S; c < E; c++) { + try { if (c == E - T) { g(1); } else { g(d); } } catch(e) { } + } + + if (c != E) { + for (let c = S; c < E; c++) { + try { if (c == E - T) { g(1); } else { g(d); } } catch(e) { } + } + if (c != E) { + for (let c = S; c < E; c++) { + try { if (c == E - T) { g(1); } else { g(d); } } catch(e) { } + } + } + } + } + + if (c == E) { b.resize(L - 5); } else { g(d); } + } + } catch (e) { } + } +} diff --git a/JSTests/stress/ftl-materialize-new-array-with-butterfly.js b/JSTests/stress/ftl-materialize-new-array-with-butterfly.js new file mode 100644 index 000000000000..aedf676569a0 --- /dev/null +++ b/JSTests/stress/ftl-materialize-new-array-with-butterfly.js @@ -0,0 +1,35 @@ +//@ runDefault("--useConcurrentJIT=false", "--jitPolicyScale=0.1", "--slowPathAllocsBetweenGCs=3") + +function opt(escape) { + const arr = new Array(2); + + arr[0] = {}; + arr[1] = {}; + + if (escape) { + return arr; + } + + return 0; +} + +function main() { + noInline(opt); + + for (let i = 0; i < 1000; i++) { + opt(!(i % 10)); + } + + for (let i = 0; i < 100; i++) { + const arr = opt(true); + + for (let j = 0; j < 5; j++) { + const object = {}; + if (arr[0] === object) { + throw new Error("bad"); + } + } + } +} + +main(); diff --git a/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-double-hole.js b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-double-hole.js new file mode 100644 index 000000000000..b3b7531b5c56 --- /dev/null +++ b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-double-hole.js @@ -0,0 +1,70 @@ +//@ runDefault("--jitPolicyScale=0.1") + +let trigger = false; +let getterCalls = 0; +let setterCalls = 0; + +function cb() { + if (trigger) { + Object.defineProperty(Array.prototype, 3, { + get() { getterCalls++; return 42; }, + set(value) { setterCalls++; }, + configurable: true + }); + } +} +noInline(cb); + +function collect() { gc(); } +noInline(collect); + +function opt(escape) { + let a = new Array(5); + a[0] = 1.1; + a[1] = 2.2; + a[2] = 3.3; + a[4] = 5.5; + cb(); + collect(); + // Index 3 is written only after the cb() call so that the OSR exit triggered by having a bad + // time during cb() rematerializes the sunk double Array while index 3 still holds the hole + // default (PNaN). + a[3] = 4.4; + if (escape) + return a; + return 0; +} +noInline(opt); + +for (let i = 0; i < 1000; i++) + opt(!(i % 10)); + +trigger = true; +let a = opt(true); + +// After having a bad time, the rematerialized Array uses SlowPutArrayStorage and index 3 must be +// a hole at the OSR exit. The subsequent a[3] = 4.4 store in baseline code must therefore be +// forwarded to the Array.prototype setter instead of creating an own property. +if (a.hasOwnProperty(3)) + throw new Error("index 3 should not be an own property, got value: " + a[3]); +if (a[3] !== 42) + throw new Error("a[3] should return 42 from the prototype getter, got: " + a[3]); +if (setterCalls !== 1) + throw new Error("Array.prototype setter should have been called once, got: " + setterCalls); +if (a[0] !== 1.1 || a[1] !== 2.2 || a[2] !== 3.3 || a[4] !== 5.5) + throw new Error("other elements corrupted: " + a[0] + "," + a[1] + "," + a[2] + "," + a[4]); + +// The rematerialized ArrayStorage must also have an accurate m_numValuesInVector so that +// hasHoles() is true. Otherwise Array.prototype.reverse takes a fast path that moves the raw +// hole around without consulting the prototype accessors. +let getterCallsBeforeReverse = getterCalls; +let setterCallsBeforeReverse = setterCalls; +a.reverse(); +if (getterCalls === getterCallsBeforeReverse || setterCalls === setterCallsBeforeReverse) + throw new Error("reverse should have consulted the prototype accessors (getter calls: " + + (getterCalls - getterCallsBeforeReverse) + ", setter calls: " + (setterCalls - setterCallsBeforeReverse) + ")"); +if (a[0] !== 5.5 || a[1] !== 42 || a[2] !== 3.3 || a[4] !== 1.1) + throw new Error("reverse produced wrong elements: " + a[0] + "," + a[1] + "," + a[2] + "," + a[4]); +if (a.hasOwnProperty(3) || a[3] !== 42) + throw new Error("after reverse, index 3 should still be a hole reading 42 from the getter, got: " + a[3]); +gc(); diff --git a/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-int32-hole.js b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-int32-hole.js new file mode 100644 index 000000000000..0d58659df81e --- /dev/null +++ b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time-int32-hole.js @@ -0,0 +1,70 @@ +//@ runDefault("--jitPolicyScale=0.1") + +let trigger = false; +let getterCalls = 0; +let setterCalls = 0; + +function cb() { + if (trigger) { + Object.defineProperty(Array.prototype, 3, { + get() { getterCalls++; return 42; }, + set(value) { setterCalls++; }, + configurable: true + }); + } +} +noInline(cb); + +function collect() { gc(); } +noInline(collect); + +function opt(escape) { + let a = new Array(5); + a[0] = 1; + a[1] = 2; + a[2] = 3; + a[4] = 5; + cb(); + collect(); + // Index 3 is written only after the cb() call so that the OSR exit triggered by having a bad + // time during cb() rematerializes the sunk Int32 Array while index 3 still holds the hole + // default (the empty JSValue). + a[3] = 4; + if (escape) + return a; + return 0; +} +noInline(opt); + +for (let i = 0; i < 1000; i++) + opt(!(i % 10)); + +trigger = true; +let a = opt(true); + +// After having a bad time, the rematerialized Array uses SlowPutArrayStorage and index 3 must be +// a hole at the OSR exit. The subsequent a[3] = 4 store in baseline code must therefore be +// forwarded to the Array.prototype setter instead of creating an own property. +if (a.hasOwnProperty(3)) + throw new Error("index 3 should not be an own property, got value: " + a[3]); +if (a[3] !== 42) + throw new Error("a[3] should return 42 from the prototype getter, got: " + a[3]); +if (setterCalls !== 1) + throw new Error("Array.prototype setter should have been called once, got: " + setterCalls); +if (a[0] !== 1 || a[1] !== 2 || a[2] !== 3 || a[4] !== 5) + throw new Error("other elements corrupted: " + a[0] + "," + a[1] + "," + a[2] + "," + a[4]); + +// The rematerialized ArrayStorage must also have an accurate m_numValuesInVector so that +// hasHoles() is true. Otherwise Array.prototype.reverse takes a fast path that moves the raw +// hole around without consulting the prototype accessors. +let getterCallsBeforeReverse = getterCalls; +let setterCallsBeforeReverse = setterCalls; +a.reverse(); +if (getterCalls === getterCallsBeforeReverse || setterCalls === setterCallsBeforeReverse) + throw new Error("reverse should have consulted the prototype accessors (getter calls: " + + (getterCalls - getterCallsBeforeReverse) + ", setter calls: " + (setterCalls - setterCallsBeforeReverse) + ")"); +if (a[0] !== 5 || a[1] !== 42 || a[2] !== 3 || a[4] !== 1) + throw new Error("reverse produced wrong elements: " + a[0] + "," + a[1] + "," + a[2] + "," + a[4]); +if (a.hasOwnProperty(3) || a[3] !== 42) + throw new Error("after reverse, index 3 should still be a hole reading 42 from the getter, got: " + a[3]); +gc(); diff --git a/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time.js b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time.js new file mode 100644 index 000000000000..2611454cf304 --- /dev/null +++ b/JSTests/stress/ftl-osr-exit-phantom-new-array-with-butterfly-having-a-bad-time.js @@ -0,0 +1,35 @@ +//@ runDefault("--jitPolicyScale=0.1") + +let trigger = false; + +function cb() { + if (trigger) { + Object.defineProperty(Array.prototype, 0, { + get() { return 42; }, configurable: true + }); + } +} +noInline(cb); + +function collect() { gc(); } +noInline(collect); + +function opt() { + let a = new Array(5); + a[0] = 1.1; + a[1] = 2.2; + a[2] = 3.3; + a[3] = 4.4; + a[4] = 5.5; + cb(); + collect(); + return a[0] + a[1] + a[2] + a[3] + a[4]; +} +noInline(opt); + +for (let i = 0; i < 1000; i++) + opt(); + +trigger = true; +opt(); +gc(); diff --git a/JSTests/stress/generator-expression-info-multiwide-remap.js b/JSTests/stress/generator-expression-info-multiwide-remap.js new file mode 100644 index 000000000000..268a288353fe --- /dev/null +++ b/JSTests/stress/generator-expression-info-multiwide-remap.js @@ -0,0 +1,21 @@ +let code = ` +function* gen(a) { + a.b; + a.b; + a.b; + a.b; + a.b; + yield 1; + ` + " ".repeat(9000000) + `a.b; +} +let it = gen({}); +it.next(); +it.next(); +`; + +try { + eval(code); + print("Done"); +} catch(e) { + print("Error: " + e); +} diff --git a/JSTests/stress/get-by-id-constant-fold-dictionary-head-shadow-property.js b/JSTests/stress/get-by-id-constant-fold-dictionary-head-shadow-property.js new file mode 100644 index 000000000000..62ee17c22047 --- /dev/null +++ b/JSTests/stress/get-by-id-constant-fold-dictionary-head-shadow-property.js @@ -0,0 +1,48 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected: ' + expected); +} + +let proto = { protoProperty: "PROTO_VALUE" }; + +// Create the property-replacement watchpoint set for proto.protoProperty via a self IC on proto. +function warmProto(p) { + return p.protoProperty; +} +noInline(warmProto); +for (let i = 0; i < 1e4; ++i) + shouldBe(warmProto(proto), "PROTO_VALUE"); + +let o = Object.create(proto); +o.x = 42; + +// Transition-count overflow turns the structure into a cacheable dictionary. +for (let i = 0; i < 200; ++i) + o["p" + i] = i; + +// A prototype access through an IC flattens the dictionary and sets hasBeenFlattenedBefore. +for (let i = 0; i < 1e3; ++i) + shouldBe(warmProto(o), "PROTO_VALUE"); + +// Overflow again to get a cacheable dictionary that inherits hasBeenFlattenedBefore, +// so prototype-access ICs on o give up instead of flattening. +for (let i = 200; i < 400; ++i) + o["p" + i] = i; + +function opt(o) { + let a = o.x; + let b = o.protoProperty; + return [a, b]; +} +noInline(opt); + +for (let i = 0; i < 1e5; ++i) { + let [a, b] = opt(o); + shouldBe(a, 42); + shouldBe(b, "PROTO_VALUE"); +} + +// Adding a shadowing own property to a dictionary object does not transition the structure. +o.protoProperty = "OWN_VALUE"; +shouldBe(o.protoProperty, "OWN_VALUE"); +shouldBe(opt(o)[1], "OWN_VALUE"); diff --git a/JSTests/stress/get-by-val-double-subscript-out-of-uint32-range.js b/JSTests/stress/get-by-val-double-subscript-out-of-uint32-range.js new file mode 100644 index 000000000000..b14fca87adfa --- /dev/null +++ b/JSTests/stress/get-by-val-double-subscript-out-of-uint32-range.js @@ -0,0 +1,33 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected ${expected}`); +} + +function get(object, key) { + return object[key]; +} +noInline(get); + +function put(object, key, value) { + object[key] = value; +} +noInline(put); + +const object = {}; +object["4294967295"] = "max-uint32"; +object["4294967296"] = "two-to-the-32"; +object["-1"] = "minus-one"; + +for (let i = 0; i < testLoopCount; ++i) { + shouldBe(get(object, 4294967296), "two-to-the-32"); + shouldBe(get(object, 4294967295), "max-uint32"); + shouldBe(get(object, -1), "minus-one"); + shouldBe(get(object, 4294967296.5), undefined); + shouldBe(get(object, -0.5), undefined); +} + +const array = []; +for (let i = 0; i < testLoopCount; ++i) + put(array, 4294967296, i); +shouldBe(array.length, 0); +shouldBe(array["4294967296"], testLoopCount - 1); diff --git a/JSTests/stress/growable-sharedarraybuffer-parallel-grow-during-prototype-methods.js b/JSTests/stress/growable-sharedarraybuffer-parallel-grow-during-prototype-methods.js index 77e099108dbb..8e172483f870 100644 --- a/JSTests/stress/growable-sharedarraybuffer-parallel-grow-during-prototype-methods.js +++ b/JSTests/stress/growable-sharedarraybuffer-parallel-grow-during-prototype-methods.js @@ -28,6 +28,7 @@ for (let round = 0; round < ROUNDS; round++) { ta.with(0, 0x41414141); ta.toReversed(); ta.toSorted(); + ta.sort((a, b) => a - b); } catch (e) {} } diff --git a/JSTests/stress/intl-canonical-iana-time-zone.js b/JSTests/stress/intl-canonical-iana-time-zone.js index 86bb291a8519..5591278f7a9a 100644 --- a/JSTests/stress/intl-canonical-iana-time-zone.js +++ b/JSTests/stress/intl-canonical-iana-time-zone.js @@ -5,7 +5,7 @@ // [[Identifier]] (case-normalized accepted form) — not [[PrimaryIdentifier]]. // The canonicalization to the IANA primary still happens internally for ICU // formatting (so legacy aliases produce the same formatted output as their -// primary), and it is observable through Temporal.TimeZone.id. +// primary), and it is observable through Temporal.ZonedDateTime.prototype.equals(). function shouldBe(actual, expected) { if (actual !== expected) @@ -87,24 +87,24 @@ for (const tz of legacy) { new Date(0).toLocaleString("en", { timeZone: tz }); } -// Temporal.TimeZone uses the same hashmap-backed TimeZoneID lookup as Intl, so -// legacy aliases must also be accepted there. Unlike Intl.DateTimeFormat, -// Temporal.TimeZone.id surfaces the canonicalized primary identifier. -if (typeof Temporal !== "undefined") { - const pairs = [ - ["Asia/Calcutta", "Asia/Kolkata"], - ["America/Buenos_Aires", "America/Argentina/Buenos_Aires"], - ["Europe/Kiev", "Europe/Kyiv"], - ["Asia/Katmandu", "Asia/Kathmandu"], - ["US/Pacific", "America/Los_Angeles"], - ["GB", "Europe/London"], - ["Brazil/East", "America/Sao_Paulo"], - ["UCT", "UTC"], - ["Etc/UTC", "UTC"], - ["Zulu", "UTC"], - ]; - for (const [legacy, primary] of pairs) { - shouldBe(new Temporal.TimeZone(legacy).id, primary); - shouldBe(Temporal.TimeZone.from(legacy).id, primary); - } -} +// Temporal.ZonedDateTime uses the same hashmap-backed TimeZoneID lookup as Intl, so +// legacy aliases must also be accepted there. ZonedDateTime.prototype.equals() uses +// TimeZoneEquals internally, which recognises legacy ↔ primary as the same timezone. +// FIXME: ZonedDateTime — test via Temporal.ZonedDateTime once implemented. +// if (typeof Temporal !== "undefined") { +// const pairs = [ +// ["Asia/Calcutta", "Asia/Kolkata"], +// ["America/Buenos_Aires", "America/Argentina/Buenos_Aires"], +// ["Europe/Kiev", "Europe/Kyiv"], +// ["Asia/Katmandu", "Asia/Kathmandu"], +// ["US/Pacific", "America/Los_Angeles"], +// ["GB", "Europe/London"], +// ["Brazil/East", "America/Sao_Paulo"], +// ["UCT", "UTC"], +// ["Etc/UTC", "UTC"], +// ["Zulu", "UTC"], +// ]; +// for (const [legacy, primary] of pairs) { +// shouldBeTrue(new Temporal.ZonedDateTime(0n, legacy).equals(new Temporal.ZonedDateTime(0n, primary))); +// } +// } diff --git a/JSTests/stress/intl-datetimeformat-temporal-formatter-cache.js b/JSTests/stress/intl-datetimeformat-temporal-formatter-cache.js new file mode 100644 index 000000000000..e0de7561e915 --- /dev/null +++ b/JSTests/stress/intl-datetimeformat-temporal-formatter-cache.js @@ -0,0 +1,121 @@ +//@ requireOptions("--useTemporal=1") +// Stress test for createTemporalFormatter caching: +// The formatter for each TemporalFieldKind is computed once and cached. +// Verify that repeated calls and mixed-kind calls produce correct, consistent output. + +function shouldBe(actual, expected, msg) { + if (actual !== expected) + throw new Error(`${msg}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`); +} + +// Fixed epoch for deterministic output regardless of timezone. +const t = new Date(Date.UTC(2024, 0, 15, 10, 30, 45)); // 2024-01-15T10:30:45Z + +const plainDate = new Temporal.PlainDate(2024, 1, 15); +const plainTime = new Temporal.PlainTime(10, 30, 45); +const plainDateTime = new Temporal.PlainDateTime(2024, 1, 15, 10, 30, 45); +const plainYM = new Temporal.PlainYearMonth(2024, 1); +const plainMD = new Temporal.PlainMonthDay(1, 15); +const instant = new Temporal.Instant(BigInt(t.getTime()) * 1_000_000n); + +const fmt = new Intl.DateTimeFormat("en-US", { + year: "numeric", month: "short", day: "numeric", + hour: "numeric", minute: "2-digit", second: "2-digit", + timeZone: "UTC", + calendar: "iso8601" +}); + +// 1. Repeated calls on same kind must produce identical output. +{ + const N = 100; + const first = fmt.format(plainDate); + for (let i = 0; i < N; i++) + shouldBe(fmt.format(plainDate), first, `plainDate iteration ${i}`); + + const firstTime = fmt.format(plainTime); + for (let i = 0; i < N; i++) + shouldBe(fmt.format(plainTime), firstTime, `plainTime iteration ${i}`); + + const firstDT = fmt.format(plainDateTime); + for (let i = 0; i < N; i++) + shouldBe(fmt.format(plainDateTime), firstDT, `plainDateTime iteration ${i}`); +} + +// 2. Different kinds on same formatter don't interfere — interleave them. +{ + const r1 = fmt.format(plainDate); + const r2 = fmt.format(plainTime); + const r3 = fmt.format(plainDateTime); + const r4 = fmt.format(plainYM); + const r5 = fmt.format(plainMD); + + for (let i = 0; i < 50; i++) { + shouldBe(fmt.format(plainDate), r1, `interleaved plainDate ${i}`); + shouldBe(fmt.format(plainTime), r2, `interleaved plainTime ${i}`); + shouldBe(fmt.format(plainDateTime), r3, `interleaved plainDateTime ${i}`); + shouldBe(fmt.format(plainYM), r4, `interleaved plainYearMonth ${i}`); + shouldBe(fmt.format(plainMD), r5, `interleaved plainMonthDay ${i}`); + } +} + +// 3. Plain types must use GMT (not the formatter's timezone), so the date +// fields come from the Temporal value itself, not from epoch conversion. +{ + // A formatter with a non-UTC timezone — plain types must still show the + // Temporal value's fields unchanged (they don't do timezone conversion). + const fmtLA = new Intl.DateTimeFormat("en-US", { + year: "numeric", month: "numeric", day: "numeric", + hour: "numeric", minute: "2-digit", + timeZone: "America/Los_Angeles" + }); + // PlainDate 2024-01-15 must format as Jan 15, regardless of LA offset. + const pdResult = fmtLA.format(plainDate); + shouldBe(pdResult.includes("1/15/2024") || pdResult.includes("15"), true, + "PlainDate should show Jan 15 regardless of LA timezone"); + + // Instant uses the formatter's timezone (LA), so it could shift the day. + const instResult = fmtLA.format(instant); // 10:30 UTC = 02:30 LA → Jan 15 still + // Just verify it formats without throwing and is consistent. + shouldBe(fmtLA.format(instant), instResult, "Instant result stable"); + + // Repeated calls still match. + for (let i = 0; i < 20; i++) { + shouldBe(fmtLA.format(plainDate), pdResult, `LA plainDate ${i}`); + shouldBe(fmtLA.format(instant), instResult, `LA instant ${i}`); + } +} + +// 4. formatToParts and format share the same cache — verify consistency. +{ + const partsDate = fmt.formatToParts(plainDate); + const fmtDate = fmt.format(plainDate); + const reconstructed = partsDate.map(p => p.value).join(""); + shouldBe(reconstructed, fmtDate, "formatToParts reconstructs same string as format"); + + for (let i = 0; i < 30; i++) { + shouldBe(fmt.format(plainDate), fmtDate, `format after formatToParts ${i}`); + shouldBe(fmt.formatToParts(plainDate).map(p => p.value).join(""), fmtDate, + `formatToParts after format ${i}`); + } +} + +// 5. dateStyle/timeStyle formatters cache correctly. +{ + const fmtDS = new Intl.DateTimeFormat("en-US", { dateStyle: "short", timeZone: "UTC" }); + const fmtTS = new Intl.DateTimeFormat("en-US", { timeStyle: "short", timeZone: "UTC" }); + + const dsDate = fmtDS.format(plainDate); + const tsTime = fmtTS.format(plainTime); + const tsDT = fmtTS.format(plainDateTime); + + for (let i = 0; i < 50; i++) { + shouldBe(fmtDS.format(plainDate), dsDate, `dateStyle plainDate ${i}`); + shouldBe(fmtTS.format(plainTime), tsTime, `timeStyle plainTime ${i}`); + shouldBe(fmtTS.format(plainDateTime), tsDT, `timeStyle plainDateTime ${i}`); + } + + // dateStyle + PlainTime must throw (no overlap). + let threw = false; + try { fmtDS.format(plainTime); } catch (e) { threw = true; } + shouldBe(threw, true, "dateStyle + PlainTime must throw TypeError"); +} diff --git a/JSTests/stress/iterator-fast-path-mode-mixing.js b/JSTests/stress/iterator-fast-path-mode-mixing.js new file mode 100644 index 000000000000..908821c1646d --- /dev/null +++ b/JSTests/stress/iterator-fast-path-mode-mixing.js @@ -0,0 +1,50 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function countValues(iterable) { + var count = 0; + for (var value of iterable) + count++; + return count; +} +noInline(countValues); + +function sumValues(iterable) { + var result = 0; + for (var value of iterable) + result += typeof value === 'string' ? value.length : 1; + return result; +} +noInline(sumValues); + +function* generatorValues() { + yield 1; + yield 2; +} + +var array = [1, 2, 3]; +var map = new Map([[1, 2], [3, 4]]); +var set = new Set([1, 2, 3, 4]); +var ascii = "abcde"; +var unicode = "a\u{20BB7}b"; + +// Mixing more iterable types at one for-of site than the fast iteration mode limit must keep +// working correctly (the types over the limit fall back to generic iteration). +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(countValues(array), 3); + shouldBe(countValues(map), 2); + shouldBe(countValues(set), 4); + shouldBe(countValues(ascii), 5); + shouldBe(countValues(unicode), 3); + shouldBe(countValues(generatorValues()), 2); +} + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumValues(ascii), 5); + shouldBe(sumValues(unicode), 4); + shouldBe(sumValues(set), 4); + shouldBe(sumValues(array), 3); + shouldBe(sumValues(map), 2); +} diff --git a/JSTests/stress/iterator-helpers-fast-path-drain-and-reentrancy.js b/JSTests/stress/iterator-helpers-fast-path-drain-and-reentrancy.js new file mode 100644 index 000000000000..56205dd4807c --- /dev/null +++ b/JSTests/stress/iterator-helpers-fast-path-drain-and-reentrancy.js @@ -0,0 +1,183 @@ +// Regression tests for the Iterator.prototype.toArray / forEach / etc. fast path +// in forEachInIteratorProtocol, and Array.from(map.keys() / .values()) fast path +// in tryCreateArrayFromMapIterator. Requirements: +// 1. Seed iteration from the iterator's stored storage (not the map's current), +// so transit() can shift entry indices across rehashes/clears. +// 2. Leave the iterator drained when iteration completes. +// 3. The fast path and the user-visible callback share the iterator's cursor: +// a reentrant iter.next() inside the callback must advance the iterator, +// consuming the next element so the helper does not see it again. +// Closing the iterator inside the callback (iter.return-equivalent) must +// stop the helper. + +function shouldEq(actual, expected, msg) { + const a = JSON.stringify(actual); + const e = JSON.stringify(expected); + if (a !== e) + throw new Error("FAIL " + msg + ": got " + a + ", expected " + e); +} + +// --- Iterator.prototype.toArray on Map/Set iterators --- + +// Partial-consume returns the remaining elements. +{ + const s = new Set([1, 2, 3]); + const it = s.values(); + it.next(); + shouldEq(it.toArray(), [2, 3], "set toArray after partial consume"); +} + +// Iterator must be drained after toArray. +{ + const s = new Set([1, 2, 3]); + const it = s.values(); + it.toArray(); + shouldEq(it.next(), { value: undefined, done: true }, "set: next() after toArray must be done"); +} +{ + const s = new Set([1, 2, 3]); + const it = s.values(); + it.next(); + it.toArray(); + shouldEq(it.next(), { value: undefined, done: true }, "set: next() after partial+toArray must be done"); +} +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const it = m.entries(); + it.toArray(); + shouldEq(it.next(), { value: undefined, done: true }, "map: next() after toArray must be done"); +} + +// Rehash with deletions during partial consume. +{ + const s = new Set(); + s.add("a"); s.add("b"); s.add("c"); s.add("d"); + const it = s.values(); + it.next(); it.next(); + s.delete("a"); s.delete("b"); + s.add("e"); + shouldEq(it.toArray(), ["c", "d", "e"], "set toArray after rehash with deletions"); +} + +// Drained iterator across clear(). +{ + const s = new Set(); + for (let i = 0; i < 1000; i++) s.add(i); + const it = s.values(); + while (!it.next().done) {} + s.clear(); + shouldEq(it.toArray(), [], "set toArray after drain+clear"); +} + +// --- Reentrancy: callback advances the iterator, helper picks up after it --- + +// Set: callback calls iter.next() once per element, "stealing" alternate entries. +// Helper should see the rest. Total elements distributed between helper & callback +// must equal the iterator contents in spec order. +{ + const s = new Set([10, 20, 30, 40, 50]); + const it = s.values(); + const helperSaw = []; + const userTook = []; + it.forEach(v => { + helperSaw.push(v); + const n = it.next(); + if (!n.done) + userTook.push(n.value); + }); + shouldEq(helperSaw, [10, 30, 50], "set forEach: helper sees alternate elements when callback steals one each step"); + shouldEq(userTook, [20, 40], "set forEach: callback's iter.next() takes interleaved elements"); + shouldEq(it.next(), { value: undefined, done: true }, "set: drained after forEach"); +} + +// Map: same shape. +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"], [4, "d"], [5, "e"]]); + const it = m.values(); + const helperSaw = []; + const userTook = []; + it.forEach(v => { + helperSaw.push(v); + const n = it.next(); + if (!n.done) + userTook.push(n.value); + }); + shouldEq(helperSaw, ["a", "c", "e"], "map forEach: helper sees alternate elements"); + shouldEq(userTook, ["b", "d"], "map forEach: callback gets the rest"); + shouldEq(it.next(), { value: undefined, done: true }, "map: drained after forEach"); +} + +// Callback drains the iterator entirely via repeated iter.next() — helper must +// then see no more elements. +{ + const s = new Set([1, 2, 3, 4, 5]); + const it = s.values(); + const helperSaw = []; + const userTook = []; + it.forEach(v => { + helperSaw.push(v); + if (v === 1) { + while (true) { + const n = it.next(); + if (n.done) break; + userTook.push(n.value); + } + } + }); + shouldEq(helperSaw, [1], "set forEach: helper stops after callback drains rest"); + shouldEq(userTook, [2, 3, 4, 5], "set forEach: callback drained the rest"); + shouldEq(it.next(), { value: undefined, done: true }, "set: drained"); +} + +// --- Array.from(map.keys()) / Array.from(map.values()) --- + +// Partial-consume returns remaining elements. +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const it = m.keys(); + it.next(); + shouldEq(Array.from(it), [2, 3], "Array.from(map.keys()) after partial consume"); +} + +// Iterator drained after Array.from. +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const it = m.keys(); + Array.from(it); + shouldEq(it.next(), { value: undefined, done: true }, "map: next() after Array.from must be done"); +} +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const it = m.values(); + it.next(); + Array.from(it); + shouldEq(it.next(), { value: undefined, done: true }, "map: next() after partial+Array.from must be done"); +} + +// Fresh iterator on a map with deletions — fast path skips empties. +{ + const m = new Map([[1, "a"], [2, "b"], [3, "c"], [4, "d"]]); + m.delete(2); + m.delete(3); + shouldEq(Array.from(m.keys()), [1, 4], "Array.from(map.keys()) fresh, with deletions"); +} + +// Partial consume across a rehash with deletions. +{ + const m = new Map(); + m.set("a", 1); m.set("b", 2); m.set("c", 3); m.set("d", 4); + const it = m.keys(); + it.next(); it.next(); + m.delete("a"); m.delete("b"); + m.set("e", 5); + shouldEq(Array.from(it), ["c", "d", "e"], "Array.from(map.keys()) after rehash with deletions"); +} + +// Repeat under JIT tiers. +for (let i = 0; i < 1000; i++) { + const m = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const it = m.keys(); + it.next(); + shouldEq(Array.from(it), [2, 3], "Array.from(map.keys()) loop"); + shouldEq(it.next(), { value: undefined, done: true }, "iterator drained loop"); +} diff --git a/JSTests/stress/iterator-helpers-set-entries-exception-check.js b/JSTests/stress/iterator-helpers-set-entries-exception-check.js new file mode 100644 index 000000000000..f9154bfd3a90 --- /dev/null +++ b/JSTests/stress/iterator-helpers-set-entries-exception-check.js @@ -0,0 +1,59 @@ +//@ runDefault("--validateExceptionChecks=1") + +// Regression test for the Set-iterator fast path in forEachInIteratorProtocol. +// JSSetIterator::next() can throw (constructArrayPair can OOM when kind is +// Entries), so the fast path must check for an exception after next() before +// invoking the user callback. With --validateExceptionChecks=1, a missing +// check fires an "exception check validation failed" assertion on debug/ASan +// builds when the callback (a JS function) is called. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected: ${expected}`); +} + +// Set entries iterator + Iterator.prototype.forEach (JS callback). +{ + const set = new Set([1, 2, 3]); + const seen = []; + set.entries().forEach((entry) => { + seen.push(entry[0], entry[1]); + }); + shouldBe(seen.join(","), "1,1,2,2,3,3"); +} + +// Same, with a non-JS (bound) callback to cover the non-CachedCall path. +{ + const set = new Set(["a", "b"]); + const seen = []; + const callback = function (entry) { seen.push(this.prefix + entry[0] + entry[1]); }.bind({ prefix: "x" }); + set.entries().forEach(callback); + shouldBe(seen.join(","), "xaa,xbb"); +} + +// Set entries iterator + Iterator.prototype.toArray. +{ + const set = new Set([1, 2, 3]); + const result = set.entries().toArray(); + shouldBe(JSON.stringify(result), "[[1,1],[2,2],[3,3]]"); +} + +// Map entries iterator for symmetry (this path already had the check). +{ + const map = new Map([[1, "a"], [2, "b"]]); + const seen = []; + map.entries().forEach((entry) => { + seen.push(entry[0], entry[1]); + }); + shouldBe(seen.join(","), "1,a,2,b"); +} + +// Repeat to make sure JIT tiers behave the same. +for (let i = 0; i < 1e3; ++i) { + const set = new Set([i, i + 1]); + const seen = []; + set.entries().forEach((entry) => { + seen.push(entry[0], entry[1]); + }); + shouldBe(seen.join(","), `${i},${i},${i + 1},${i + 1}`); +} diff --git a/JSTests/stress/iterator-prototype-forEach-map-set-iterator-close.js b/JSTests/stress/iterator-prototype-forEach-map-set-iterator-close.js new file mode 100644 index 000000000000..07e1be6ff603 --- /dev/null +++ b/JSTests/stress/iterator-prototype-forEach-map-set-iterator-close.js @@ -0,0 +1,228 @@ +// Regression test for the Map/Set iterator fast path in forEachInIteratorProtocol. +// When the callback passed to Iterator.prototype.forEach throws, the iterator's +// "return" method (IteratorClose) must be invoked, even for Map/Set iterators +// that have an own "return" property. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected: ${expected}`); +} + +function shouldThrow(func, errorMessage) { + let error; + try { + func(); + } catch (e) { + error = e; + } + if (!error) + throw new Error("not thrown"); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}, expected: ${errorMessage}`); +} + +// Map values iterator with own "return": callback throws -> return must be called. +{ + const map = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const iterator = map.values(); + let returnCalled = 0; + let returnThisValue = null; + iterator.return = function () { + ++returnCalled; + returnThisValue = this; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); + shouldBe(returnThisValue, iterator); +} + +// Map keys iterator with own "return". +{ + const map = new Map([[1, "a"], [2, "b"]]); + const iterator = map.keys(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); +} + +// Map entries iterator with own "return". +{ + const map = new Map([[1, "a"], [2, "b"]]); + const iterator = map.entries(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); +} + +// Set values iterator with own "return": callback throws -> return must be called. +{ + const set = new Set([1, 2, 3]); + const iterator = set.values(); + let returnCalled = 0; + let returnThisValue = null; + iterator.return = function () { + ++returnCalled; + returnThisValue = this; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); + shouldBe(returnThisValue, iterator); +} + +// Set keys iterator with own "return". +{ + const set = new Set([1, 2]); + const iterator = set.keys(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); +} + +// Set entries iterator with own "return". +{ + const set = new Set([1, 2]); + const iterator = set.entries(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); +} + +// The callback throws after consuming some elements: return is called once, +// and iteration stops at the throwing element. +{ + const map = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const iterator = map.keys(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + const seen = []; + shouldThrow(() => { + iterator.forEach((key) => { + seen.push(key); + if (key === 2) + throw new Error("stop"); + }); + }, "Error: stop"); + shouldBe(seen.join(","), "1,2"); + shouldBe(returnCalled, 1); +} + +// When both the callback and "return" throw, the callback's exception wins. +{ + const set = new Set([1, 2, 3]); + const iterator = set.values(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + throw new Error("return error"); + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("callback error"); }); + }, "Error: callback error"); + shouldBe(returnCalled, 1); +} + +// "return" is not called when iteration completes normally. +{ + const map = new Map([[1, "a"], [2, "b"]]); + const iterator = map.values(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + const seen = []; + iterator.forEach((value) => { seen.push(value); }); + shouldBe(seen.join(","), "a,b"); + shouldBe(returnCalled, 0); +} + +// Non-JS (bound) callback to cover the non-CachedCall path. +{ + const map = new Map([[1, "a"], [2, "b"]]); + const iterator = map.values(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + const callback = function () { throw new Error(this.message); }.bind({ message: "bound callback error" }); + shouldThrow(() => { + iterator.forEach(callback); + }, "Error: bound callback error"); + shouldBe(returnCalled, 1); +} + +// Fast path without own "return" still works (no regression). +{ + const map = new Map([[1, "a"], [2, "b"], [3, "c"]]); + const seen = []; + map.values().forEach((value) => { seen.push(value); }); + shouldBe(seen.join(","), "a,b,c"); + + const set = new Set([1, 2, 3]); + let sum = 0; + set.values().forEach((value) => { sum += value; }); + shouldBe(sum, 6); +} + +// Fast path without own "return": callback exceptions still propagate. +{ + const set = new Set([1, 2, 3]); + const seen = []; + shouldThrow(() => { + set.values().forEach((value) => { + seen.push(value); + if (value === 2) + throw new Error("no return"); + }); + }, "Error: no return"); + shouldBe(seen.join(","), "1,2"); +} + +// Repeat to make sure JIT tiers behave the same. +for (let i = 0; i < 1e3; ++i) { + const map = new Map([[i, i * 10], [i + 1, (i + 1) * 10]]); + const iterator = map.values(); + let returnCalled = 0; + iterator.return = function () { + ++returnCalled; + return { done: true, value: undefined }; + }; + shouldThrow(() => { + iterator.forEach(() => { throw new Error("loop error"); }); + }, "Error: loop error"); + shouldBe(returnCalled, 1); +} diff --git a/JSTests/stress/iterator-prototype-includes.js b/JSTests/stress/iterator-prototype-includes.js index 5d4421a1564f..c82207f8d17a 100644 --- a/JSTests/stress/iterator-prototype-includes.js +++ b/JSTests/stress/iterator-prototype-includes.js @@ -1,5 +1,10 @@ //@ requireOptions("--useIteratorIncludes=1") +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + function sameValue(a, b, testname) { if (a !== b) throw new Error(`${testname}: Expected ${b} but got ${a}`); @@ -21,12 +26,24 @@ function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { } } +function shouldNotThrow(fn, caseName) { + if (!caseName) + throw new Error(`must specify message`); + + try { + fn(); + } catch (e) { + const actual = `${e.name}(${e.message})`; + throw new Error(`${caseName}: Expected not thrown but got ${actual}`); + } +} + function callTestTargetFunction(iterator, searchElement, skippedElements) { return Iterator.prototype.includes.call(iterator, searchElement, skippedElements); } class TestIterator extends Iterator { - value = 0; + begin = 0; isClosed = false; isDone = false; constructor(max) { @@ -37,7 +54,7 @@ class TestIterator extends Iterator { this.max = max; } next() { - const value = this.value; + const value = this.begin; if (value > this.max) { this.isDone = true; return { @@ -46,7 +63,7 @@ class TestIterator extends Iterator { }; } - this.value += 1; + this.begin += 1; return { done: false, value, @@ -444,22 +461,55 @@ class TestIterator extends Iterator { } { - const valid2ndArgument = [ + const greaterThanIteratorSize = [ [Number.POSITIVE_INFINITY, `+Infinity`], [Number.MAX_SAFE_INTEGER, `Number.MAX_SAFE_INTEGER`], - [Number.MAX_SAFE_INTEGER + 1, `(Number.MAX_SAFE_INTEGER + 1)`], - [Number.MAX_VALUE, `Number.MAX_VALUE`], + [Number.MAX_SAFE_INTEGER - 1, `Number.MAX_SAFE_INTEGER - 1`], + [1, ''], ]; - for (const [skippedElements, label] of valid2ndArgument) { - const testName = `call on short iterator with 2nd arg (large number): ${label}`; + for (const [skippedElements, name] of greaterThanIteratorSize) { + const label = name ?? String(skippedElements); + const testName = `call on short iterator with 2nd arg (large number > the iterator): ${label}`; const iter = new TestIterator(0); + assert(iter.max < skippedElements, `${testName}: to avoid test stucking`); sameValue(callTestTargetFunction(iter, 0, skippedElements), false, `${testName}: calling .includes()`); sameValue(iter.isDone, true, `${testName}: iterator should be done`); sameValue(iter.isClosed, false, `${testName}: iterator should not be closed`); } } +{ + const valid2ndArgumentAsLowerBound = [ + [0, ], + [0.0, '0.0'], + ]; + + for (const [skippedElements, name] of valid2ndArgumentAsLowerBound) { + const label = name ?? String(skippedElements); + const testName = `call on iterator with args (1st should **not** found, 2nd is lower bound): ${label}`; + const iter = new TestIterator(0); + const searchElement = -1; + assert(searchElement < iter.begin, 'must not be found in the iterator'); + shouldNotThrow(() => { + callTestTargetFunction(iter, searchElement, skippedElements); + }, `${testName}: calling .includes()`); + sameValue(iter.isDone, true, `${testName}: iterator should be done`); + sameValue(iter.isClosed, false, `${testName}: iterator should not be closed`); + } + + for (const [skippedElements, name] of valid2ndArgumentAsLowerBound) { + const label = name ?? String(skippedElements); + const testName = `call on iterator with args (1st should be found, 2nd is lower bound): ${label}`; + const iter = new TestIterator(0); + const searchElement = 0; + assert(iter.begin <= searchElement && searchElement <= iter.max, `${testName}: must be found in the iterator's range`); + sameValue(callTestTargetFunction(iter, searchElement, skippedElements), true, `${testName}: calling .includes()`); + sameValue(iter.isDone, false, `${testName}: iterator should be done`); + sameValue(iter.isClosed, true, `${testName}: iterator should not be closed`); + } +} + // invalid { @@ -481,7 +531,7 @@ class TestIterator extends Iterator { } { - const invalidSkippedElements = [ + const invalidSkippedElementsAsTypeError = [ ['', ], ['1', `'1'`], [true, ], @@ -497,28 +547,30 @@ class TestIterator extends Iterator { [Number.MIN_VALUE, `Number.MIN_VALUE`], ]; - for (const [skip, label] of invalidSkippedElements) { + for (const [skip, label] of invalidSkippedElementsAsTypeError) { const testName = label ?? String(skip); const validIter = new TestIterator(3); shouldThrow(`the 2nd arg is invalid: ${testName}`, function () { callTestTargetFunction(validIter, null, skip); - }, TypeError, "Iterator.prototype.includes requires that the second argument is a non-negative integral Number or Infinity."); + }, TypeError, "Iterator.prototype.includes requires that the second argument is a non-negative safe integral Number or Infinity."); sameValue(validIter.isClosed, true, 'the given iterator should be closed.'); } } { - const invalidSkippedElements = [ + const invalidSkippedElementsAsRangeError = [ + [Number.MAX_VALUE, `Number.MAX_VALUE`], + [Number.MAX_SAFE_INTEGER + 1, `(Number.MAX_SAFE_INTEGER + 1)`], [-1, ], [Number.NEGATIVE_INFINITY, ], [Number.MIN_SAFE_INTEGER, `Number.MIN_SAFE_INTEGER`], ]; - for (const [skip, label] of invalidSkippedElements) { + for (const [skip, label] of invalidSkippedElementsAsRangeError) { const testName = label ?? String(skip); const validIter = new TestIterator(3); shouldThrow(`the 2nd arg is not positive integer: ${String(testName)}`, function () { callTestTargetFunction(validIter, null, skip); - }, RangeError, "Iterator.prototype.includes requires that the second argument is a non-negative integral Number or Infinity."); + }, RangeError, "Iterator.prototype.includes requires that the second argument is a non-negative safe integral Number or Infinity."); sameValue(validIter.isClosed, true, 'the given iterator should be closed.'); } } \ No newline at end of file diff --git a/JSTests/stress/jsonp-large-array-index.js b/JSTests/stress/jsonp-large-array-index.js new file mode 100644 index 000000000000..4fe7e991ab3c --- /dev/null +++ b/JSTests/stress/jsonp-large-array-index.js @@ -0,0 +1,20 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected ${expected}`); +} + +globalThis.foo = {}; +loadString('foo[4294967296]={"a":1};'); +shouldBe(JSON.stringify(foo["4294967296"]), '{"a":1}'); +shouldBe(foo[0], undefined); + +globalThis.bar = {}; +loadString('bar[2147483648]=5;'); +shouldBe(bar["2147483648"], 5); +shouldBe(bar[0], undefined); + +globalThis.baz = []; +loadString('baz[0]=1;baz[1]=2;'); +shouldBe(baz[0], 1); +shouldBe(baz[1], 2); +shouldBe(baz.length, 2); diff --git a/JSTests/stress/map-iterator-fast-cross-realm.js b/JSTests/stress/map-iterator-fast-cross-realm.js new file mode 100644 index 000000000000..5c4e11b5a67b --- /dev/null +++ b/JSTests/stress/map-iterator-fast-cross-realm.js @@ -0,0 +1,57 @@ +// Cross-realm: iterating a Map / MapIterator from another realm. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +var otherRealm = createGlobalObject(); + +function valuesOfMap(map) { + var sum = 0; + for (var v of map.values()) sum += v; + return sum; +} +noInline(valuesOfMap); + +function keysOfMap(map) { + var sum = 0; + for (var k of map.keys()) sum += k; + return sum; +} +noInline(keysOfMap); + +function entriesOfMap(map) { + var sum = 0; + for (var [k, v] of map.entries()) sum += k * 1000 + v; + return sum; +} +noInline(entriesOfMap); + +function plainOfMap(map) { + var sum = 0; + for (var [k, v] of map) sum += k * 1000 + v; + return sum; +} +noInline(plainOfMap); + +var otherMakeMap = otherRealm.Function('m = new m.Map();' + + 'for (var i = 0; i < 10; ++i) m.set(i, i + 1);' + + 'return m;'.replace('m =', 'var m =').replace(/m\./g, 'this.')); +// Simpler: create the cross-realm map manually. +var otherMap = otherRealm.eval('var m = new Map(); for (var i = 0; i < 10; ++i) m.set(i, i + 1); m'); + +var expectedValues = 55; +var expectedKeys = 45; +var expectedEntries = 0; +for (var i = 0; i < 10; ++i) expectedEntries += i * 1000 + (i + 1); + +// Cross-realm fast path — when we iterate a foreign-realm Map directly, getIterationMode bails to +// Generic because the structure check against this realm's mapIteratorStructure fails. The for-of +// still works, just via the slow path. Verify correctness. +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(valuesOfMap(otherMap), expectedValues); + shouldBe(keysOfMap(otherMap), expectedKeys); + shouldBe(entriesOfMap(otherMap), expectedEntries); + shouldBe(plainOfMap(otherMap), expectedEntries); +} diff --git a/JSTests/stress/map-iterator-fast-ftl.js b/JSTests/stress/map-iterator-fast-ftl.js new file mode 100644 index 000000000000..dd017c0405b7 --- /dev/null +++ b/JSTests/stress/map-iterator-fast-ftl.js @@ -0,0 +1,38 @@ +// FTL fast path for map.keys()/values()/entries() iteration. +//@ runFTLNoCJIT + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(map) { + var sum = 0; + for (var v of map.values()) sum += v; + return sum; +} + +function keys(map) { + var sum = 0; + for (var k of map.keys()) sum += k; + return sum; +} + +function entries(map) { + var sum = 0; + for (var [k, v] of map.entries()) sum += k * 1000 + v; + return sum; +} + +var map = new Map(); +for (var i = 0; i < 10; ++i) + map.set(i, i + 1); + +var expectedEntries = 0; +for (var i = 0; i < 10; ++i) expectedEntries += i * 1000 + (i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(map), 55); + shouldBe(keys(map), 45); + shouldBe(entries(map), expectedEntries); +} diff --git a/JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js b/JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js new file mode 100644 index 000000000000..c90e84b5849b --- /dev/null +++ b/JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js @@ -0,0 +1,44 @@ +// Replacing %IteratorPrototype%[Symbol.iterator] (which the JSMapIterator inherits) should +// invalidate the fast path for map iterator reuse via for-of. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function valuesOfIterator(map) { + var iter = map.values(); + var sum = 0; + for (var v of iter) sum += v; + return sum; +} +noInline(valuesOfIterator); + +var map = new Map(); +for (var i = 0; i < 10; ++i) + map.set(i, i + 1); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(map), 55); + +// %IteratorPrototype% is the prototype of MapIteratorPrototype. +var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf((new Map()).values())); +iteratorPrototype[Symbol.iterator] = function () { + var arr = []; + var src = this; + var nextResult; + while (true) { + nextResult = src.next(); + if (nextResult.done) break; + arr.push(nextResult.value * 10); + } + var idx = 0; + return { + next() { + return idx < arr.length ? { value: arr[idx++], done: false } : { value: undefined, done: true }; + } + }; +}; + +// `for (var v of iter)` now goes through the replaced [Symbol.iterator]. +shouldBe(valuesOfIterator(map), 550); diff --git a/JSTests/stress/map-iterator-fast-keys-values-entries.js b/JSTests/stress/map-iterator-fast-keys-values-entries.js new file mode 100644 index 000000000000..f9b5a5bfbe95 --- /dev/null +++ b/JSTests/stress/map-iterator-fast-keys-values-entries.js @@ -0,0 +1,91 @@ +// Tests for fast iteration of JSMapIterator (map.keys(), map.values(), map.entries()). + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(map) { + var sum = 0; + for (var v of map.values()) + sum += v; + return sum; +} +noInline(values); + +function keys(map) { + var sum = 0; + for (var k of map.keys()) + sum += k; + return sum; +} +noInline(keys); + +function entries(map) { + var sum = 0; + for (var [k, v] of map.entries()) + sum += k * 1000 + v; + return sum; +} +noInline(entries); + +// for (...of map) uses Map.prototype[Symbol.iterator] === Map.prototype.entries (FastMap path, +// fresh JSMapIterator(Entries)). +function plain(map) { + var sum = 0; + for (var [k, v] of map) + sum += k * 1000 + v; + return sum; +} +noInline(plain); + +var map = new Map(); +for (var i = 0; i < 10; ++i) + map.set(i, i + 1); + +var expectedValues = 55; // 1+2+...+10 +var expectedKeys = 45; // 0+1+...+9 +var expectedEntries = 0; // sum k*1000 + v for k in [0,9], v=k+1 +for (var i = 0; i < 10; ++i) + expectedEntries += i * 1000 + (i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(map), expectedValues); + shouldBe(keys(map), expectedKeys); + shouldBe(entries(map), expectedEntries); + shouldBe(plain(map), expectedEntries); +} + +// Iterating the iterator object directly (the iterable is already a JSMapIterator). +function valuesOfIterator(map) { + var iter = map.values(); + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(valuesOfIterator); + +function keysOfIterator(map) { + var iter = map.keys(); + var sum = 0; + for (var k of iter) + sum += k; + return sum; +} +noInline(keysOfIterator); + +function entriesOfIterator(map) { + var iter = map.entries(); + var sum = 0; + for (var [k, v] of iter) + sum += k * 1000 + v; + return sum; +} +noInline(entriesOfIterator); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(valuesOfIterator(map), expectedValues); + shouldBe(keysOfIterator(map), expectedKeys); + shouldBe(entriesOfIterator(map), expectedEntries); +} diff --git a/JSTests/stress/map-iterator-fast-mid-iteration.js b/JSTests/stress/map-iterator-fast-mid-iteration.js new file mode 100644 index 000000000000..d6202a81efc4 --- /dev/null +++ b/JSTests/stress/map-iterator-fast-mid-iteration.js @@ -0,0 +1,63 @@ +// Mid-iteration mutation of the underlying Map. Per spec, entries added or removed during +// iteration must be visible / skipped consistently — JSC's transitAndNext handles this. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function consumeOneAndIterateRest(map) { + var iter = map.values(); + var first = iter.next(); + var rest = []; + for (var v of iter) rest.push(v); + return { first: first.value, rest }; +} +noInline(consumeOneAndIterateRest); + +function consumeKeysRest(map) { + var iter = map.keys(); + iter.next(); + var rest = []; + for (var k of iter) rest.push(k); + return rest; +} +noInline(consumeKeysRest); + +function consumeEntriesRest(map) { + var iter = map.entries(); + iter.next(); + var rest = []; + for (var e of iter) rest.push(e[0] + ':' + e[1]); + return rest; +} +noInline(consumeEntriesRest); + +for (var i = 0; i < testLoopCount; ++i) { + var map = new Map(); + for (var j = 0; j < 5; ++j) map.set(j, j * 10); + + var r = consumeOneAndIterateRest(map); + shouldBe(r.first, 0); + shouldBe(r.rest.join(','), '10,20,30,40'); + + shouldBe(consumeKeysRest(map).join(','), '1,2,3,4'); + shouldBe(consumeEntriesRest(map).join(','), '1:10,2:20,3:30,4:40'); +} + +// Mutate during iteration: add an entry while iterating; the new entry should be visible. +function drainThenIterate() { + var map = new Map(); + for (var i = 0; i < 3; ++i) map.set(i, i + 100); + var collected = []; + for (var [k, v] of map) { + collected.push(k + ':' + v); + if (k === 1) map.set(99, 999); + if (k === 99) map.set(100, 1000); + } + return collected.join(','); +} +noInline(drainThenIterate); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(drainThenIterate(), '0:100,1:101,2:102,99:999,100:1000'); diff --git a/JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js b/JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js new file mode 100644 index 000000000000..462a4b20d21a --- /dev/null +++ b/JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js @@ -0,0 +1,54 @@ +// Replacing MapIterator.prototype.next fires mapIteratorProtocolWatchpointSet. +// Functions warmed up under the fast path must keep producing correct results. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(map) { + var sum = 0; + for (var v of map.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(map) { + var sum = 0; + for (var [k, v] of map) + sum += k * 1000 + v; + return sum; +} +noInline(plain); + +var map = new Map(); +for (var i = 0; i < 10; ++i) + map.set(i, i + 1); + +var expectedValues = 55; +var expectedPlain = 0; +for (var i = 0; i < 10; ++i) + expectedPlain += i * 1000 + (i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(map), expectedValues); + shouldBe(plain(map), expectedPlain); +} + +// Replace MapIterator.prototype.next — fires the watchpoint. +var mapIteratorPrototype = Object.getPrototypeOf((new Map()).values()); +var counter = 0; +mapIteratorPrototype.next = function () { + counter++; + return counter <= 3 ? { value: 7, done: false } : { value: undefined, done: true }; +}; + +counter = 0; +shouldBe(values(map), 21); // 7 + 7 + 7 +// `for (var [k, v] of map)` after the override iterates over scalar 7s; destructuring 7 as [k, v] +// invokes 7[Symbol.iterator]() which throws TypeError. +counter = 0; +var threw = false; +try { plain(map); } catch (e) { threw = e instanceof TypeError; } +shouldBe(threw, true); diff --git a/JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js b/JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js new file mode 100644 index 000000000000..f88566373cca --- /dev/null +++ b/JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js @@ -0,0 +1,57 @@ +// Replacing Map.prototype[Symbol.iterator] fires mapIteratorProtocolWatchpointSet. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(map) { + var sum = 0; + for (var v of map.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(map) { + var sum = 0; + for (var [k, v] of map) + sum += k * 1000 + v; + return sum; +} +noInline(plain); + +var map = new Map(); +for (var i = 0; i < 10; ++i) + map.set(i, i + 1); + +var expectedValues = 55; +var expectedPlain = 0; +for (var i = 0; i < 10; ++i) + expectedPlain += i * 1000 + (i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(map), expectedValues); + shouldBe(plain(map), expectedPlain); +} + +// Replace Map.prototype[Symbol.iterator]; for-of map now goes through this. +Map.prototype[Symbol.iterator] = function () { + var arr = []; + for (var k of this.keys()) arr.push([k, k * 10]); + var idx = 0; + return { + next() { + return idx < arr.length ? { value: arr[idx++], done: false } : { value: undefined, done: true }; + } + }; +}; + +// `for (var [k, v] of map)` now: v=k*10, expected sum k*1000 + k*10 = k*1010. +var expectedAfter = 0; +for (var i = 0; i < 10; ++i) + expectedAfter += i * 1010; +shouldBe(plain(map), expectedAfter); + +// `map.values()` is unaffected — we replaced [Symbol.iterator], not .values. +shouldBe(values(map), expectedValues); diff --git a/JSTests/stress/map-iterator-fully-packed-table.js b/JSTests/stress/map-iterator-fully-packed-table.js new file mode 100644 index 000000000000..816a7deb096b --- /dev/null +++ b/JSTests/stress/map-iterator-fully-packed-table.js @@ -0,0 +1,104 @@ +// Regression test for the JIT-inlined MapIteratorNext / SetIteratorNext path +// and the C++ helper transitAndNext. +// +// JSOrderedHashTable's DataTable is sized to its load-factor cap (DataCapacity) +// rather than the bucket count, so a Map/Set populated to exactly DataCapacity +// has no spare zero-initialized slot inside the DataTable past the last entry. +// The iterator (both the JIT-inlined fast path and the C++ helper) terminates +// when it loads an empty JSValue from the slot one past the last alive entry; +// without a trailing IterationSentinel slot, that load would run off the end +// of the storage and read whatever happens to be in adjacent memory, which can +// either yield bogus extra entries, loop forever on a stray deleted-marker, or +// crash. ASan reliably catches the OOB read; in normal release builds the bug +// surfaces only when adjacent memory happens to hold a non-zero value, so this +// test exercises the path but is not a deterministic detector on its own. +// +// The sizes packed below are exactly DataCapacity at the small-capacity +// regime, where DataCapacity = capacity / 2. If the dataCapacity formula in +// JSOrderedHashTableHelper ever changes, regenerate these values. +// capacity 8 -> DataCapacity 4 +// capacity 32 -> DataCapacity 16 +// capacity 128 -> DataCapacity 64 + +function assert(b, msg) { + if (!b) + throw new Error("FAIL: " + msg); +} +noInline(assert); + +const fullSizes = [4, 16, 64]; + +function buildMap(n) { + const m = new Map(); + for (let i = 0; i < n; ++i) + m.set(i, i * 2); + return m; +} + +function buildSet(n) { + const s = new Set(); + for (let i = 0; i < n; ++i) + s.add(i); + return s; +} + +function drainMap(m) { + const it = m[Symbol.iterator](); + let count = 0; + let sumK = 0; + let sumV = 0; + while (true) { + const { value, done } = it.next(); + if (done) { + assert(value === undefined, "done iterator value"); + break; + } + sumK += value[0]; + sumV += value[1]; + ++count; + } + // One additional next() after done must keep returning done with no error. + const after = it.next(); + assert(after.done === true, "post-done iterator"); + return [count, sumK, sumV]; +} +noInline(drainMap); + +function drainSet(s) { + const it = s[Symbol.iterator](); + let count = 0; + let sum = 0; + while (true) { + const { value, done } = it.next(); + if (done) { + assert(value === undefined, "done iterator value"); + break; + } + sum += value; + ++count; + } + const after = it.next(); + assert(after.done === true, "post-done iterator"); + return [count, sum]; +} +noInline(drainSet); + +for (const n of fullSizes) { + const map = buildMap(n); + const set = buildSet(n); + + const expectedSumK = (n * (n - 1)) / 2; + const expectedSumV = expectedSumK * 2; + const expectedSetSum = expectedSumK; + + for (let i = 0; i < testLoopCount; ++i) { + const [c, sk, sv] = drainMap(map); + assert(c === n, "map count " + n); + assert(sk === expectedSumK, "map sumK " + n); + assert(sv === expectedSumV, "map sumV " + n); + + const [sc, ss] = drainSet(set); + assert(sc === n, "set count " + n); + assert(ss === expectedSetSum, "set sum " + n); + } +} diff --git a/JSTests/stress/map-set-clone-large-table.js b/JSTests/stress/map-set-clone-large-table.js new file mode 100644 index 000000000000..93d9c042dcd1 --- /dev/null +++ b/JSTests/stress/map-set-clone-large-table.js @@ -0,0 +1,96 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected: ' + expected); +} + +// 600 entries grow the backing table to capacity 2048, which is large enough for the bulk table copy. +const count = 600; + +// Set cloning via new Set(set). +{ + const source = new Set(); + for (let i = 0; i < count; ++i) + source.add(i); + + const clone = new Set(source); + shouldBe(clone.size, count); + let expected = 0; + for (const value of clone) + shouldBe(value, expected++); + shouldBe(expected, count); + + // The clone is independent from the source. + clone.add(count); + clone.delete(0); + shouldBe(source.size, count); + shouldBe(source.has(0), true); + shouldBe(source.has(count), false); + + // The clone keeps working as a Set (lookup, add, delete, rehash, GC). + gc(); + for (let i = 0; i < count; ++i) + shouldBe(clone.has(i), i !== 0); + for (let i = 0; i < 2000; ++i) + clone.add('extra' + i); + shouldBe(clone.size, count + 2000); + for (let i = 0; i < 2000; ++i) + shouldBe(clone.delete('extra' + i), true); + gc(); + shouldBe(clone.size, count); + + // Cloning a table with deleted entries takes the entry-by-entry path. + source.delete(1); + source.delete(599); + const compacted = new Set(source); + shouldBe(compacted.size, count - 2); + shouldBe(compacted.has(1), false); + shouldBe(compacted.has(599), false); + shouldBe(compacted.has(2), true); +} + +// Set cloning via Set.prototype.union with an empty-ish other set. +{ + const source = new Set(); + for (let i = 0; i < count; ++i) + source.add('key' + i); + + const result = source.union(new Set([ 'key0' ])); + shouldBe(result.size, count); + let index = 0; + for (const value of result) + shouldBe(value, 'key' + index++); + gc(); + shouldBe(result.has('key599'), true); +} + +// Map cloning via new Map(map). +{ + const source = new Map(); + for (let i = 0; i < count; ++i) + source.set('k' + i, i * 2); + + const clone = new Map(source); + shouldBe(clone.size, count); + let expected = 0; + for (const [key, value] of clone) { + shouldBe(key, 'k' + expected); + shouldBe(value, expected * 2); + ++expected; + } + shouldBe(expected, count); + + clone.set('k0', -1); + clone.delete('k1'); + shouldBe(source.get('k0'), 0); + shouldBe(source.has('k1'), true); + + gc(); + for (let i = 2; i < count; ++i) + shouldBe(clone.get('k' + i), i * 2); + + source.delete('k0'); + const compacted = new Map(source); + shouldBe(compacted.size, count - 1); + shouldBe(compacted.has('k0'), false); + shouldBe(compacted.get('k599'), 1198); +} diff --git a/JSTests/stress/map-set-for-of-fast-iterator-storage.js b/JSTests/stress/map-set-for-of-fast-iterator-storage.js new file mode 100644 index 000000000000..aa6ba571d1aa --- /dev/null +++ b/JSTests/stress/map-set-for-of-fast-iterator-storage.js @@ -0,0 +1,164 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected: ' + expected); +} +noInline(shouldBe); + +function forOfMap(map) { + let sumKeys = 0; + let sumValues = 0; + let count = 0; + for (const [k, v] of map) { + sumKeys += k; + sumValues += v; + count++; + } + return [sumKeys, sumValues, count]; +} +noInline(forOfMap); + +function forOfSet(set) { + let sum = 0; + let count = 0; + for (const v of set) { + sum += v; + count++; + } + return [sum, count]; +} +noInline(forOfSet); + +function testEmptyMap() { + const m = new Map(); + const [k, v, c] = forOfMap(m); + shouldBe(k, 0); + shouldBe(v, 0); + shouldBe(c, 0); +} + +function testNonEmptyMap() { + const m = new Map(); + let expectedK = 0; + let expectedV = 0; + for (let i = 0; i < 16; i++) { + m.set(i, i * 2); + expectedK += i; + expectedV += i * 2; + } + const [k, v, c] = forOfMap(m); + shouldBe(k, expectedK); + shouldBe(v, expectedV); + shouldBe(c, 16); +} + +function testMapWithDeletions() { + const m = new Map(); + for (let i = 0; i < 32; i++) + m.set(i, i); + for (let i = 0; i < 32; i += 2) + m.delete(i); + let expected = 0; + for (let i = 1; i < 32; i += 2) + expected += i; + const [k, v, c] = forOfMap(m); + shouldBe(k, expected); + shouldBe(v, expected); + shouldBe(c, 16); +} + +function testEmptySet() { + const s = new Set(); + const [sum, c] = forOfSet(s); + shouldBe(sum, 0); + shouldBe(c, 0); +} + +function testNonEmptySet() { + const s = new Set(); + let expected = 0; + for (let i = 0; i < 16; i++) { + s.add(i); + expected += i; + } + const [sum, c] = forOfSet(s); + shouldBe(sum, expected); + shouldBe(c, 16); +} + +function testSetWithDeletions() { + const s = new Set(); + for (let i = 0; i < 32; i++) + s.add(i); + for (let i = 0; i < 32; i += 2) + s.delete(i); + let expected = 0; + for (let i = 1; i < 32; i += 2) + expected += i; + const [sum, c] = forOfSet(s); + shouldBe(sum, expected); + shouldBe(c, 16); +} + +function testMapMutationDuringIteration() { + const m = new Map(); + m.set(1, 10); + m.set(2, 20); + let count = 0; + for (const [k, v] of m) { + count++; + if (k === 1) + m.set(3, 30); + if (count > 10) + break; + } + shouldBe(count, 3); +} +noInline(testMapMutationDuringIteration); + +function testSetMutationDuringIteration() { + const s = new Set(); + s.add(1); + s.add(2); + let count = 0; + for (const v of s) { + count++; + if (v === 1) + s.add(3); + if (count > 10) + break; + } + shouldBe(count, 3); +} +noInline(testSetMutationDuringIteration); + +function testReusedEmptyMap() { + const m = new Map(); + let total = 0; + for (const [k, v] of m) + total++; + shouldBe(total, 0); +} + +function testReusedEmptySet() { + const s = new Set(); + let total = 0; + for (const v of s) + total++; + shouldBe(total, 0); +} + +for (let i = 0; i < 5000; i++) { + testEmptyMap(); + testNonEmptyMap(); + testMapWithDeletions(); + testEmptySet(); + testNonEmptySet(); + testSetWithDeletions(); + testReusedEmptyMap(); + testReusedEmptySet(); +} + +for (let i = 0; i < 1000; i++) { + testMapMutationDuringIteration(); + testSetMutationDuringIteration(); +} diff --git a/JSTests/stress/new-weak-map-weak-set-dfg.js b/JSTests/stress/new-weak-map-weak-set-dfg.js new file mode 100644 index 000000000000..da945f26c969 --- /dev/null +++ b/JSTests/stress/new-weak-map-weak-set-dfg.js @@ -0,0 +1,76 @@ +function assert(b) { + if (!b) + throw new Error("bad assertion"); +} + +function createWeakMap() { + return new WeakMap(); +} +noInline(createWeakMap); + +function createWeakSet() { + return new WeakSet(); +} +noInline(createWeakSet); + +var key = {}; +for (var i = 0; i < 1e5; ++i) { + var map = createWeakMap(); + assert(map instanceof WeakMap); + assert(Object.getPrototypeOf(map) === WeakMap.prototype); + assert(map.get(key) === undefined); + assert(!map.has(key)); + map.set(key, i); + assert(map.get(key) === i); + assert(map.has(key)); + + var set = createWeakSet(); + assert(set instanceof WeakSet); + assert(Object.getPrototypeOf(set) === WeakSet.prototype); + assert(!set.has(key)); + set.add(key); + assert(set.has(key)); +} + +// Constructor with an iterable argument should keep working. +function createWeakMapWithEntries(k, v) { + return new WeakMap([[k, v]]); +} +noInline(createWeakMapWithEntries); + +function createWeakSetWithEntries(k) { + return new WeakSet([k]); +} +noInline(createWeakSetWithEntries); + +for (var i = 0; i < 1e4; ++i) { + var k = {}; + var map = createWeakMapWithEntries(k, i); + assert(map.get(k) === i); + var set = createWeakSetWithEntries(k); + assert(set.has(k)); +} + +// Subclassing (new.target !== WeakMap/WeakSet) should keep working. +class MyWeakMap extends WeakMap {} +class MyWeakSet extends WeakSet {} + +function createSubclassed() { + return [new MyWeakMap(), new MyWeakSet()]; +} +noInline(createSubclassed); + +for (var i = 0; i < 1e4; ++i) { + var [map, set] = createSubclassed(); + assert(map instanceof MyWeakMap); + assert(map instanceof WeakMap); + assert(Object.getPrototypeOf(map) === MyWeakMap.prototype); + map.set(key, i); + assert(map.get(key) === i); + + assert(set instanceof MyWeakSet); + assert(set instanceof WeakSet); + assert(Object.getPrototypeOf(set) === MyWeakSet.prototype); + set.add(key); + assert(set.has(key)); +} diff --git a/JSTests/stress/number-tostring-methods-out-of-range-arguments.js b/JSTests/stress/number-tostring-methods-out-of-range-arguments.js new file mode 100644 index 000000000000..1ea402a3acad --- /dev/null +++ b/JSTests/stress/number-tostring-methods-out-of-range-arguments.js @@ -0,0 +1,39 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected ${expected}`); +} + +function shouldThrowRangeError(func) { + let threw = false; + try { + func(); + } catch (error) { + threw = true; + if (!(error instanceof RangeError)) + throw new Error(`bad error: ${error}`); + } + if (!threw) + throw new Error("did not throw"); +} + +const outOfRangeArguments = [Infinity, -Infinity, 1e100, -1e100, 2147483648, -2147483648, 4294967296, 1e21, 101, -1]; +for (const argument of outOfRangeArguments) { + shouldThrowRangeError(() => (1.5).toExponential(argument)); + shouldThrowRangeError(() => (1.5).toFixed(argument)); + shouldThrowRangeError(() => (1.5).toPrecision(argument)); +} +shouldThrowRangeError(() => (1.5).toPrecision(0)); + +shouldBe((1.5).toExponential(100), "1.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0"); +shouldBe((1.5).toFixed(100), "1.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); +shouldBe((1.5).toPrecision(100), "1.500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); +shouldBe((1.5).toPrecision(1), "2"); + +// NaN/Infinity receivers are handled before the range check for toExponential/toPrecision, after it for toFixed. +shouldBe((NaN).toExponential(Infinity), "NaN"); +shouldBe((Infinity).toExponential(1e100), "Infinity"); +shouldBe((-Infinity).toExponential(-Infinity), "-Infinity"); +shouldBe((NaN).toPrecision(Infinity), "NaN"); +shouldBe((Infinity).toPrecision(1e100), "Infinity"); +shouldThrowRangeError(() => (NaN).toFixed(Infinity)); +shouldThrowRangeError(() => (Infinity).toFixed(1e100)); diff --git a/JSTests/stress/osr-exit-scratch-buffer-gc.js b/JSTests/stress/osr-exit-scratch-buffer-gc.js new file mode 100644 index 000000000000..774bd6367381 --- /dev/null +++ b/JSTests/stress/osr-exit-scratch-buffer-gc.js @@ -0,0 +1,30 @@ +//@ memoryHog! +//@ requireOptions("--useConcurrentJIT=0", "--useZombieMode=1", "--slowPathAllocsBetweenGCs=16") + +function opt(s) { + const o = {}; + + try { + return s + s; + } catch { + return o; + } +} + +function main() { + noDFG(main); + noFTL(main); + + for (let i = 0; i < 100; i++) { + opt("hello"); + } + + const s = 's'.repeat(0x40000000); + const a = [opt(s), opt(s), opt(s), opt(s), opt(s), opt(s), opt(s), opt(s)]; + + setTimeout(() => { + a.toString(); + }, 100); +} + +main(); diff --git a/JSTests/stress/out-of-memory-while-creating-undefined-variable-error.js b/JSTests/stress/out-of-memory-while-creating-undefined-variable-error.js new file mode 100644 index 000000000000..9df2f833f62c --- /dev/null +++ b/JSTests/stress/out-of-memory-while-creating-undefined-variable-error.js @@ -0,0 +1,14 @@ +//@ memoryHog! + +let exception; +try { + eval("a".repeat(2147483640)); +} catch (e) { + exception = e; +} + +if (!(exception instanceof ReferenceError)) + throw "FAILED: expected ReferenceError, got " + exception; + +if (exception.message != "Can't find variable") + throw "FAILED: " + exception.message; diff --git a/JSTests/stress/parseint-large-result-int32-boxing.js b/JSTests/stress/parseint-large-result-int32-boxing.js new file mode 100644 index 000000000000..fb6a6a8ae3c3 --- /dev/null +++ b/JSTests/stress/parseint-large-result-int32-boxing.js @@ -0,0 +1,30 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected ${expected}`); +} + +function parseIntHex(string) { + return parseInt(string, 16); +} +noInline(parseIntHex); + +function parseIntNoRadix(string) { + return parseInt(string); +} +noInline(parseIntNoRadix); + +for (let i = 0; i < testLoopCount; ++i) { + shouldBe(parseIntHex("7fffffff"), 0x7fffffff); + shouldBe(parseIntNoRadix("123"), 123); +} + +shouldBe(parseIntHex("80000000"), 2147483648); +shouldBe(parseIntHex("ffffffff"), 4294967295); +shouldBe(parseIntHex("100000000"), 4294967296); +shouldBe(parseIntHex("-80000000"), -2147483648); +shouldBe(parseIntHex("-80000001"), -2147483649); +shouldBe(parseIntNoRadix("2147483648"), 2147483648); +shouldBe(parseIntNoRadix("4294967296"), 4294967296); +shouldBe(parseIntNoRadix("-2147483649"), -2147483649); +shouldBe(1 / parseIntNoRadix("-0"), -Infinity); +shouldBe(1 / parseIntHex("-0"), -Infinity); diff --git a/JSTests/stress/proxy-revoke.js b/JSTests/stress/proxy-revoke.js index 03a3f0a4eafc..79c6860b8cae 100644 --- a/JSTests/stress/proxy-revoke.js +++ b/JSTests/stress/proxy-revoke.js @@ -139,7 +139,6 @@ function allHandlersShouldThrow(proxy) { shouldThrowNullHandler(() => Reflect.deleteProperty(proxy, "x")); shouldThrowNullHandler(() => Reflect.defineProperty(proxy, "x", {value: 40, enumerable: true, configurable: true})); shouldThrowNullHandler(() => Reflect.ownKeys(proxy)); - shouldThrowNullHandler(() => Reflect.apply(proxy, this, [])); shouldThrowNullHandler(() => Reflect.construct(proxy, [])); } diff --git a/JSTests/stress/regexp-alternative-heavy.js b/JSTests/stress/regexp-alternative-heavy.js new file mode 100644 index 000000000000..67fafb77ac15 --- /dev/null +++ b/JSTests/stress/regexp-alternative-heavy.js @@ -0,0 +1,41 @@ +//@ runDefault + +function tryCompileAndRun(label, buildPattern, testInput) { + // print(`\n[*] ${label}`); + let pattern; + try { + pattern = buildPattern(); + // print(` Pattern length: ${pattern.length} chars`); + } catch(e) { + print(` BUILD ERROR: ${e.message}`); + return; + } + + let re; + try { + re = new RegExp(pattern, 'g'); + // print(` RegExp constructed OK`); + } catch(e) { + print(` REGEXP CONSTRUCTION ERROR (likely limit hit): ${e.message}`); + return; + } + + // Warm the JIT — JSC typically tiered-compiles after ~6 invocations + try { + for (let i = 0; i < 8; i++) { + re.lastIndex = 0; + re.exec(testInput); + } + // print(` exec() completed without crash — check for SP corruption artifacts`); + } catch(e) { + print(` RUNTIME ERROR: ${e.message}`); + } +} + +for (const n of [1000]) { + tryCompileAndRun( + `Approach C: ${n} alternation groups (a|b)*`, + () => '(a|b)*'.repeat(n), + 'ab'.repeat(50) + ); +} diff --git a/JSTests/stress/regexp-bol-optimize-out-of-stack.js b/JSTests/stress/regexp-bol-optimize-out-of-stack.js index 7b99447a6b32..91ee1390ed5b 100644 --- a/JSTests/stress/regexp-bol-optimize-out-of-stack.js +++ b/JSTests/stress/regexp-bol-optimize-out-of-stack.js @@ -4,7 +4,7 @@ arrayLength = typeof(arrayLength) === 'undefined' ? 50000 : arrayLength; -let expectedException = "SyntaxError: Invalid regular expression: regular expression too large"; +let expectedException = "SyntaxError: Invalid regular expression: too many captures"; function test() { diff --git a/JSTests/stress/regexp-character-class-latin1-boundary.js b/JSTests/stress/regexp-character-class-latin1-boundary.js new file mode 100644 index 000000000000..d19f40d458e5 --- /dev/null +++ b/JSTests/stress/regexp-character-class-latin1-boundary.js @@ -0,0 +1,126 @@ +function shouldBe(actual, expected, message) { + if (actual !== expected) + throw new Error(message + ": expected " + JSON.stringify(expected) + " but got " + JSON.stringify(actual)); +} + +function repeat(fn) { + for (let i = 0; i < testLoopCount; ++i) + fn(); +} + +repeat(() => { + shouldBe(/abc/i.test("ABC"), true, "ASCII /i positive"); + shouldBe(/abc/i.test("abd"), false, "ASCII /i negative"); +}); + +repeat(() => { + shouldBe(/à/i.test("À"), true, "à/i matches À"); + shouldBe(/À/i.test("à"), true, "À/i matches à"); + shouldBe(/[À-Þ]/i.test("é"), true, "[À-Þ]/i matches é"); + shouldBe(/[À-Þ]/.test("é"), false, "[À-Þ] does not match é"); +}); + +repeat(() => { + shouldBe(/[þÿ]/.test("þ"), true, "0xFE in [0xFE,0xFF]"); + shouldBe(/[þÿ]/.test("ÿ"), true, "0xFF in [0xFE,0xFF]"); + shouldBe(/[þÿ]/.test("Ā"), false, "0x100 not in [0xFE,0xFF]"); + shouldBe(/Ā/.test("Ā"), true, "literal 0x100"); + shouldBe(/[Ā-ſ]/.test("ŝ"), true, "non-Latin-1 range matches"); + shouldBe(/[Ā-ſ]/.test("ÿ"), false, "non-Latin-1 range excludes 0xFF"); + shouldBe(/[ð-Đ]/.test("ÿ"), true, "boundary-crossing range, Latin-1 side"); + shouldBe(/[ð-Đ]/.test("Ā"), true, "boundary-crossing range, non-Latin-1 side"); + shouldBe(/[ð-Đ]/.test(""), false, "boundary-crossing range below"); + shouldBe(/[ð-Đ]/.test("đ"), false, "boundary-crossing range above"); +}); + +repeat(() => { + shouldBe(/ÿ/i.test("ÿ"), true, "ÿ/i matches ÿ"); + shouldBe(/ÿ/i.test("Ÿ"), true, "ÿ/i matches Ÿ"); + shouldBe(/Ÿ/i.test("ÿ"), true, "Ÿ/i matches ÿ"); + shouldBe(/Ÿ/iu.test("ÿ"), true, "Ÿ/iu matches ÿ"); +}); + +repeat(() => { + shouldBe(/µ/i.test("µ"), true, "µ/i matches µ"); + shouldBe(/µ/i.test("Μ"), true, "µ/i matches Μ"); + shouldBe(/µ/i.test("μ"), true, "µ/i matches μ"); + shouldBe(/Μ/i.test("µ"), true, "Μ/i matches µ"); +}); + +repeat(() => { + shouldBe(/ß/i.test("ß"), true, "ß/i matches ß"); + shouldBe(/ß/i.test("S"), false, "ß/i does not match S in UCS2"); + shouldBe(/ß/i.test("s"), false, "ß/i does not match s in UCS2"); + shouldBe(/ß/iu.test("ẞ"), true, "ß/iu matches U+1E9E"); +}); + +repeat(() => { + shouldBe(/abcd|wxyz/i.test("AbCd"), true, "masked /i alt 1"); + shouldBe(/abcd|wxyz/i.test("WxYz"), true, "masked /i alt 2"); + shouldBe(/abcd|wxyz/i.test("abce"), false, "masked /i no match"); + shouldBe(/abcd|wxyz/i.test("ééAbCdé"), true, "masked /i with Latin-1 surrounding"); +}); + +repeat(() => { + shouldBe(/./.test("a"), true, ". matches a"); + shouldBe(/./.test("é"), true, ". matches é"); + shouldBe(/./.test("ÿ"), true, ". matches ÿ"); + shouldBe(/./.test("Ā"), true, ". matches 0x100"); + shouldBe(/./.test("\n"), false, ". does not match newline"); +}); + +repeat(() => { + shouldBe(/[^a]/.test("é"), true, "[^a] matches é"); + shouldBe(/[^abc]/.test("a"), false, "[^abc] does not match a"); + shouldBe(/[^a-z]/.test("é"), true, "[^a-z] matches é"); + shouldBe(/[^Ā-ſ]/.test("é"), true, "inverted non-Latin-1 range"); + shouldBe(/[^à-ÿ]/.test("ÿ"), false, "inverted Latin-1 range rejects ÿ"); + shouldBe(/[^à-ÿ]/.test("Ā"), true, "inverted Latin-1 range accepts 0x100"); +}); + +repeat(() => { + shouldBe(/\w/.test("é"), false, "\\w legacy"); + shouldBe(/\W/.test("é"), true, "\\W legacy"); + shouldBe(/\s/.test(" "), true, "\\s NBSP"); + shouldBe(/\d/.test("5"), true, "\\d"); + shouldBe(/\D/.test("é"), true, "\\D"); +}); + +repeat(() => { + shouldBe(/\p{L}/u.test("é"), true, "/u \\p{L} é"); + shouldBe(/\p{L}/u.test("a"), true, "/u \\p{L} a"); + shouldBe(/\p{L}/u.test("5"), false, "/u \\p{L} digit"); + shouldBe(/\p{L}/u.test("Ā"), true, "/u \\p{L} 0x100"); +}); + +repeat(() => { + shouldBe(/[\p{L}--\p{ASCII}]/v.test("é"), true, "/v [L--ASCII] é"); + shouldBe(/[\p{L}--\p{ASCII}]/v.test("a"), false, "/v [L--ASCII] a"); + shouldBe(/[\p{L}--\p{ASCII}]/v.test("Ā"), true, "/v [L--ASCII] non-Latin-1"); + shouldBe(/[\p{L}&&\p{ASCII}]/v.test("a"), true, "/v [L&&ASCII] a"); + shouldBe(/[\p{L}&&\p{ASCII}]/v.test("é"), false, "/v [L&&ASCII] é"); +}); + +repeat(() => { + shouldBe(/[éŸ]/.test("é"), true, "mixed class Char16 Latin-1 hit"); + shouldBe(/[éŸ]/.test("Ÿ"), true, "mixed class Char16 non-Latin-1 hit"); + shouldBe(/[éŸ]/.test("e"), false, "mixed class miss"); +}); + +repeat(() => { + shouldBe(/[éŸ]/.test("abcé"), true, "Char8 input hits Latin-1 entry"); + shouldBe(/[éŸ]/.test("abcdef"), false, "Char8 input misses"); +}); + +repeat(() => { + let m = /[À-Þ]+/i.exec("aAbBÀàÁxy"); + shouldBe(m !== null, true, "Latin-1 alpha range exec exists"); + shouldBe(m[0], "ÀàÁ", "Latin-1 alpha range match"); + shouldBe(m.index, 4, "Latin-1 alpha range index"); +}); + +repeat(() => { + shouldBe(/[^\p{ASCII}]/u.test("a"), false, "/u [^ASCII] a"); + shouldBe(/[^\p{ASCII}]/u.test("é"), true, "/u [^ASCII] é"); + shouldBe(/[^\p{ASCII}]/u.test("Ā"), true, "/u [^ASCII] 0x100"); +}); diff --git a/JSTests/stress/regexp-combined-large.js b/JSTests/stress/regexp-combined-large.js new file mode 100644 index 000000000000..605736beddc1 --- /dev/null +++ b/JSTests/stress/regexp-combined-large.js @@ -0,0 +1,48 @@ +//@ runDefault + +function tryCompileAndRun(label, buildPattern, testInput) { + // print(`\n[*] ${label}`); + let pattern; + try { + pattern = buildPattern(); + // print(` Pattern length: ${pattern.length} chars`); + } catch(e) { + print(` BUILD ERROR: ${e.message}`); + return; + } + + let re; + try { + re = new RegExp(pattern, 'g'); + // print(` RegExp constructed OK`); + } catch(e) { + print(` REGEXP CONSTRUCTION ERROR (likely limit hit): ${e.message}`); + return; + } + + // Warm the JIT — JSC typically tiered-compiles after ~6 invocations + try { + for (let i = 0; i < 8; i++) { + re.lastIndex = 0; + re.exec(testInput); + } + // print(` exec() completed without crash — check for SP corruption artifacts`); + } catch(e) { + print(` RUNTIME ERROR: ${e.message}`); + } +} + +const LARGE_N = 12_500_000; +tryCompileAndRun( + `Approach F: ${LARGE_N} flat groups (maximum feasible)`, + () => { + // Build in chunks to avoid single large string concat + let parts = []; + const chunk = '(a)*'.repeat(10000); // 40KB per chunk + for (let i = 0; i < LARGE_N / 10000; i++) { + parts.push(chunk); + } + return parts.join(''); + }, + 'a' +); diff --git a/JSTests/stress/regexp-deep-nested.js b/JSTests/stress/regexp-deep-nested.js new file mode 100644 index 000000000000..d6a80563d9ee --- /dev/null +++ b/JSTests/stress/regexp-deep-nested.js @@ -0,0 +1,41 @@ +//@ runDefault + +function tryCompileAndRun(label, buildPattern, testInput) { + // print(`\n[*] ${label}`); + let pattern; + try { + pattern = buildPattern(); + // print(` Pattern length: ${pattern.length} chars`); + } catch(e) { + print(` BUILD ERROR: ${e.message}`); + return; + } + + let re; + try { + re = new RegExp(pattern, 'g'); + // print(` RegExp constructed OK`); + } catch(e) { + print(` REGEXP CONSTRUCTION ERROR (likely limit hit): ${e.message}`); + return; + } + + // Warm the JIT — JSC typically tiered-compiles after ~6 invocations + try { + for (let i = 0; i < 8; i++) { + re.lastIndex = 0; + re.exec(testInput); + } + // print(` exec() completed without crash — check for SP corruption artifacts`); + } catch(e) { + print(` RUNTIME ERROR: ${e.message}`); + } +} + +for (const depth of [100, 500, 1000, 5000, 10000, 50000]) { + tryCompileAndRun( + `Approach B: nested depth ${depth} — ((((a)*)*...)*)*`, + () => '('.repeat(depth) + 'a' + ')*'.repeat(depth), + 'a'.repeat(20) + ); +} diff --git a/JSTests/stress/regexp-duplicate-named-captures-indices.js b/JSTests/stress/regexp-duplicate-named-captures-indices.js new file mode 100644 index 000000000000..f70bcd991920 --- /dev/null +++ b/JSTests/stress/regexp-duplicate-named-captures-indices.js @@ -0,0 +1,5 @@ +//@ runDefault("--useRegExpJIT=0") + +const m = /(?a){2}z|(?b){2}y|c/d.exec("aac"); +if (!("x" in m.indices.groups)) + throw "Expected \"x\" in m.indices.groups"; diff --git a/JSTests/stress/regexp-fixedcount-zero-length-content-backtrack.js b/JSTests/stress/regexp-fixedcount-zero-length-content-backtrack.js new file mode 100644 index 000000000000..36a9a02519b6 --- /dev/null +++ b/JSTests/stress/regexp-fixedcount-zero-length-content-backtrack.js @@ -0,0 +1,24 @@ +// Test that FixedCount patterns with empty alternatives and content backtracking work correctly. +// Regression test for zero-length match detection in FixedCount content backtracking. + +// Pattern from slow.js that was hanging: +// (?:[^(?!)]||){23}z - FixedCount with 3 alternatives, 2 empty +if (/(?:[^(?!)]||){23}z/.test("/(?:[^(?!)]||){23}z/")) + throw new Error("Should not match"); + +// FixedCount with empty alternatives - should allow zero-length iterations +if (!/(?:a||){5}z/.test("aaaz")) + throw new Error("Should match: 3 iterations of 'a', 2 of empty, then 'z'"); + +// Content backtracking should still work for non-empty alternatives +var result = /(?:a|b){3}c/.exec("abbc"); +if (!result || result[0] !== "abbc") + throw new Error("Expected 'abbc', got " + result); + +// FixedCount with all empty alternatives followed by required match +if (!/(?:||){10}z/.test("z")) + throw new Error("Should match 'z' after 10 empty iterations"); + +// Another test: empty alternative should work +if (!/(?:a|){2}b/.test("b")) + throw new Error("Should match: 2 empty iterations then 'b'"); diff --git a/JSTests/stress/regexp-greedy-nested-quantifier-backtrack.js b/JSTests/stress/regexp-greedy-nested-quantifier-backtrack.js new file mode 100644 index 000000000000..8fdfe5e94582 --- /dev/null +++ b/JSTests/stress/regexp-greedy-nested-quantifier-backtrack.js @@ -0,0 +1,46 @@ +// Regression test for interpreter bug with nested greedy quantifiers and content backtracking. +// https://bugs.webkit.org/show_bug.cgi?id=307145 +// +// The bug occurred in the interpreter when a greedy quantified parentheses dropped below +// its minimum count during backtracking. Instead of trying content backtracking within +// earlier iterations (to redistribute characters), it would immediately fail. +// +// @runDefault +// @runNoJIT + +function test(pattern, input, expected) { + let result = pattern.exec(input); + let got = result ? result[0] : null; + if (got !== expected) + throw new Error("FAIL: pattern " + pattern + " on '" + input + "': expected '" + expected + "', got '" + got + "'"); +} + +// These patterns require content backtracking within nested quantifiers. +// The inner greedy a+ initially consumes too many characters, preventing the +// outer quantifier from reaching its minimum. Backtracking must redistribute +// characters across iterations. + +// Inner min=2, variable count - the original failing case +test(/((a+){2,3}){2,3}$/, "aaaaaa", "aaaaaa"); + +// Similar patterns with different counts +test(/((a+){2,4}){2,3}$/, "aaaaaa", "aaaaaa"); +test(/((a+){2,3}){2,4}$/, "aaaaaa", "aaaaaa"); + +// Non-capturing inner group +test(/((?:a+){2,3}){2,3}$/, "aaaaaa", "aaaaaa"); + +// Fixed outer, variable inner +test(/((a+){2,3}){2,2}$/, "aaaaaa", "aaaaaa"); + +// Three levels of nesting +test(/(((a+){2}){2}){1,2}$/, "aaaa", "aaaa"); + +// Ensure normal cases still work +test(/((a+){1,3}){2,3}$/, "aaaaaa", "aaaaaa"); // inner min=1 (simpler case) +test(/((a){2,3}){2,3}$/, "aaaaaa", "aaaaaa"); // non-greedy inner content + +// Test no-match cases still correctly fail +test(/((a+){2,3}){2,3}$/, "aaa", null); // not enough characters + +print("PASS: All nested quantifier backtracking tests passed"); diff --git a/JSTests/stress/regexp-greedy-varcount-minfail.js b/JSTests/stress/regexp-greedy-varcount-minfail.js new file mode 100644 index 000000000000..3b27f72c1945 --- /dev/null +++ b/JSTests/stress/regexp-greedy-varcount-minfail.js @@ -0,0 +1,49 @@ +//@ runDefault + +// Exercises Greedy variable-count parens with min > 0 in heavy-backtracking +// scenarios that drive Begin.bt's failure exit (where the new op.m_jumps.link +// lives) and the "decrement and try fewer iterations" success paths. Validates +// that the JIT codegen for ParenthesesSubpatternBegin.backtrack matches the +// reference engine. + +function shouldBe(actual, expected, label) { + let a = JSON.stringify(actual); + let e = JSON.stringify(expected); + if (a !== e) + throw new Error("FAIL " + label + ": expected " + e + " got " + a); +} + +// 1. Min not reachable: pure failure path through Begin.bt. +shouldBe(/(a+){3,}/.exec("aa"), null, "fail: 2 a's, need 3 iters of a+"); +shouldBe(/(a+){3,5}b/.exec("aab"), null, "fail: 2 a's then b, need 3 iters"); +shouldBe(/(a+){5,}/.exec("aaaa"), null, "fail: 4 a's, need 5 iters"); + +// 2. Heavy content backtracking driven by post-parens literal mismatch. +shouldBe(/(a+){2,5}b/.exec("aaaaaab"), ["aaaaaab", "a"], "6 a's + b, min=2 max=5"); +shouldBe(/(a+){3,5}b/.exec("aaaaaab"), ["aaaaaab", "a"], "6 a's + b, min=3 max=5"); +shouldBe(/(a+){3,5}b/.exec("aaaaaaab"), ["aaaaaaab", "a"], "7 a's + b, min=3 max=5"); + +// 3. Post-parens that requires backtracking down to exactly min. +shouldBe(/(a+){2,5}aab/.exec("aaaaaab"), ["aaaaaab", "a"], "post-parens consumes aab"); + +// 4. Multi-alternative inner with min > 0. +shouldBe(/(a+|b+){2,4}c/.exec("aabbc"), ["aabbc", "bb"], "multi-alt: aa then bb then c"); +shouldBe(/(a+|b+){2,4}c/.exec("aabbbbc"), ["aabbbbc", "bbbb"], "multi-alt: aa then bbbb then c"); +shouldBe(/(a+|b+){3,}/.exec("ab"), null, "multi-alt fail: only 1 alternation"); + +// 5. Nested greedy with min > 0 at multiple levels. +shouldBe(/((a+){2,3}){2,3}b/.exec("aaaaaab"), ["aaaaaab", "aa", "a"], "nested {2,3} of {2,3}"); +shouldBe(/((a+){2,4}){2,3}/.exec("aaaaaa"), ["aaaaaa", "aa", "a"], "nested {2,3} inner {2,4}"); +shouldBe(/((a+){2,3}){3,}b/.exec("aab"), null, "nested fail: outer needs 3 iters"); + +// 6. Greedy with min > 0 followed by another greedy. +shouldBe(/(a+){2,4}(a+)/.exec("aaaaa"), ["aaaaa", "a", "a"], "two greedies"); +shouldBe(/(a+){2,3}(a*)b/.exec("aaaab"), ["aaaab", "a", ""], "first eats most, second rest"); + +// 7. Quantified that itself is inside another greedy. +shouldBe(/((?:a){2,3}b)+c/.exec("aabaaabc"), ["aabaaabc", "aaab"], "outer + over inner {2,3}b"); +shouldBe(/((?:a){2,3}b)+c/.exec("ab"), null, "outer + fail"); + +// 8. min == max for variable-count form. +shouldBe(/(a+){3,3}b/.exec("aaab"), ["aaab", "a"], "min == max success"); +shouldBe(/(a+){3,3}b/.exec("aab"), null, "min == max fail"); diff --git a/JSTests/stress/regexp-greedy-varcount-multialt.js b/JSTests/stress/regexp-greedy-varcount-multialt.js new file mode 100644 index 000000000000..609493b491ff --- /dev/null +++ b/JSTests/stress/regexp-greedy-varcount-multialt.js @@ -0,0 +1,39 @@ +// Multi-alt variable-count tests that exercise content-backtracking with +// alternative dispatch. If endOp.m_contentBacktrackEntryLabel were wrong for +// multi-alt, these would mismatch V8. + +function check(re, input, expected, label) { + const got = re.exec(input); + const a = JSON.stringify(got); + const e = JSON.stringify(expected); + if (a !== e) + throw new Error("FAIL " + label + ": expected " + e + " got " + a); +} + +// Multi-alt with min > 0, content backtrack across alternatives. +// Iter k may have chosen alt A or alt B; content-bt must visit the correct one. + +check(/(?:(?:aa|a)){3,4}b/, "aaab", ["aaab"], "multi-alt: aa|a x 3 then b"); +check(/(?:(?:aa|a)){3,4}b/, "aaaab", ["aaaab"], "multi-alt: needs to mix aa and a"); +check(/(?:(?:aa|a)){2,3}c/, "aaac", ["aaac"], "multi-alt success: aa+a+c or a+aa+c"); + +// Content-bt within alt forced by post-parens needing more chars. +check(/(?:(a+|b+)){2,4}xy/, "aabbxy", ["aabbxy", "bb"], "multi-alt: aa, bb, xy"); +check(/(?:(a+|b+)){2,4}xy/, "aaaabbxy", ["aaaabbxy", "bb"], "multi-alt: aaaa, bb, xy"); +check(/(?:(a+|b+)){2,4}bx/, "aaabx", ["aaabx", "a"], "post-parens 'bx' forces a+ to back off"); + +// Min > max-of-input — pure failure with multi-alt +check(/(?:(?:aa|a)){5,}b/, "aab", null, "multi-alt fail"); +check(/(?:(a+|b+)){4,}c/, "abc", null, "multi-alt fail with mixed input"); + +// 3-way alternatives +check(/(?:(?:abc|ab|a)){2,3}/, "abcab", ["abcab"], "3-way alts"); +check(/(?:(?:abc|ab|a)){2,3}x/, "abcabx", ["abcabx"], "3-way alts with anchor"); + +// Heavy multi-alt content-bt +check(/(?:(a|b)){2,4}c/, "abc", ["abc", "b"], "single-char alts, min=2"); +check(/(?:(a|b)){3,5}c/, "ababc", ["ababc", "b"], "single-char alts, min=3"); +check(/(?:(a|b)){4,6}c/, "ababc", ["ababc", "b"], "single-char alts (need 4)"); + +// Nested multi-alt with min > 0 outer and inner +check(/((?:a+|b+)){2,3}((?:c+|d+)){2,3}/, "aabbccdd", ["aabbccdd", "bb", "dd"], "nested multi-alt"); diff --git a/JSTests/stress/regexp-heavy-mixed.js b/JSTests/stress/regexp-heavy-mixed.js new file mode 100644 index 000000000000..71bc1776c1f6 --- /dev/null +++ b/JSTests/stress/regexp-heavy-mixed.js @@ -0,0 +1,46 @@ +//@ runDefault + +function tryCompileAndRun(label, buildPattern, testInput) { + // print(`\n[*] ${label}`); + let pattern; + try { + pattern = buildPattern(); + // print(` Pattern length: ${pattern.length} chars`); + } catch(e) { + print(` BUILD ERROR: ${e.message}`); + return; + } + + let re; + try { + re = new RegExp(pattern, 'g'); + // print(` RegExp constructed OK`); + } catch(e) { + print(` REGEXP CONSTRUCTION ERROR (likely limit hit): ${e.message}`); + return; + } + + // Warm the JIT — JSC typically tiered-compiles after ~6 invocations + try { + for (let i = 0; i < 8; i++) { + re.lastIndex = 0; + re.exec(testInput); + } + // print(` exec() completed without crash — check for SP corruption artifacts`); + } catch(e) { + print(` RUNTIME ERROR: ${e.message}`); + } +} + +tryCompileAndRun( + `Approach E: mixed named/quantified/lookahead (10k groups)`, + () => { + // Each unit: (?a)* — named capture with quantifier + // Duplicate named captures in alternation arms force numDuplicateNamedCaptures > 0 + const unit = '(?a(?b)*)'; + const repeated = unit.repeat(5000); + // Wrap in alternation to trigger duplicate-named-capture counting + return `(?:${repeated}|${unit.repeat(100)})+`; + }, + 'ab'.repeat(30) +); diff --git a/JSTests/stress/regexp-large-quantifier.js b/JSTests/stress/regexp-large-quantifier.js index 1dc9823f172a..d574fc47a3fb 100644 --- a/JSTests/stress/regexp-large-quantifier.js +++ b/JSTests/stress/regexp-large-quantifier.js @@ -24,4 +24,4 @@ testRegExp("a{0,4294967295}", "a", undefined, "a"); testRegExp("a{0,4294967296}", "a", undefined, "a"); testRegExp("^a{0,4294967296}$", "a{0,4294967296}", undefined, undefined); testRegExp("(?:a{0,340282366920}?){0,1}a", "aa", undefined, "aa"); -testRegExp("((.{100000000})*.{2100000000})+", "x", "SyntaxError: Invalid regular expression: pattern exceeds string length limits", undefined); +testRegExp("((.{100000000})*.{2100000000})+", "x", undefined, undefined); diff --git a/JSTests/stress/regexp-lookahead-heavy.js b/JSTests/stress/regexp-lookahead-heavy.js new file mode 100644 index 000000000000..820a5e2917ff --- /dev/null +++ b/JSTests/stress/regexp-lookahead-heavy.js @@ -0,0 +1,41 @@ +//@ runDefault + +function tryCompileAndRun(label, buildPattern, testInput) { + // print(`\n[*] ${label}`); + let pattern; + try { + pattern = buildPattern(); + // print(` Pattern length: ${pattern.length} chars`); + } catch(e) { + print(` BUILD ERROR: ${e.message}`); + return; + } + + let re; + try { + re = new RegExp(pattern, 'g'); + // print(` RegExp constructed OK`); + } catch(e) { + print(` REGEXP CONSTRUCTION ERROR (likely limit hit): ${e.message}`); + return; + } + + // Warm the JIT — JSC typically tiered-compiles after ~6 invocations + try { + for (let i = 0; i < 8; i++) { + re.lastIndex = 0; + re.exec(testInput); + } + // print(` exec() completed without crash — check for SP corruption artifacts`); + } catch(e) { + print(` RUNTIME ERROR: ${e.message}`); + } +} + +for (const n of [500, 5000, 20000]) { + tryCompileAndRun( + `Approach D: ${n} lookaheads (?=(a))*`, + () => '(?=(a))'.repeat(n) + 'a*', + 'a'.repeat(50) + ); +} diff --git a/JSTests/stress/regexp-multialt-content-backtracking.js b/JSTests/stress/regexp-multialt-content-backtracking.js new file mode 100644 index 000000000000..b2b3192fdaaf --- /dev/null +++ b/JSTests/stress/regexp-multialt-content-backtracking.js @@ -0,0 +1,56 @@ +// Tests for multi-alternative content backtracking in YarrJIT. +// This tests the interaction between multi-alt NestedAlternative groups +// and content backtracking for Greedy, NonGreedy, and FixedCount quantifiers. + +function shouldBe(actual, expected) { + var actualStr = actual === null ? "null" : actual.toString(); + var expectedStr = expected === null ? "null" : expected.toString(); + if (actualStr !== expectedStr) + throw new Error("Expected " + expectedStr + " but got " + actualStr); +} + +// FixedCount multi-alt content backtracking +shouldBe(/(?:a+|b){2}c/.exec("abc"), "abc"); +shouldBe(/(?:a+|b){2}c/.exec("aac"), "aac"); +shouldBe(/(?:a+|b){2}c/.exec("aabc"), "aabc"); +shouldBe(/(?:a+|b){2}c/.exec("abbc"), "bbc"); +shouldBe(/(?:a+|b){3}d/.exec("aabd"), "aabd"); +shouldBe(/(?:a+|b+){2}c/.exec("aabbc"), "aabbc"); +shouldBe(/(?:b+|a+){2}c/.exec("aabbac"), "bbac"); + +// Greedy multi-alt content backtracking +shouldBe(/(?:a+|b)+c/.exec("abc"), "abc"); +shouldBe(/(?:a+|b)+c/.exec("aac"), "aac"); +shouldBe(/(?:a+|b)+c/.exec("abd"), null); +shouldBe(/(?:a+|b+)+c/.exec("abd"), null); +shouldBe(/(?:a+|b)+c/.exec("aabbc"), "aabbc"); + +// NonGreedy multi-alt content backtracking +shouldBe(/(?:a+|b){2,4}?c/.exec("abbbbc"), "bbbbc"); +shouldBe(/(?:a+|b){2,4}?c/.exec("abc"), "abc"); +shouldBe(/(?:a+|b){2,4}?c/.exec("aabc"), "aabc"); +shouldBe(/(?:a+|b){1,3}?c/.exec("abc"), "abc"); +shouldBe(/(?:a+|b){1,3}?c/.exec("aac"), "aac"); + +// Capturing multi-alt content backtracking +shouldBe(/(a+|b){2}c/.exec("abc"), "abc,b"); +shouldBe(/(a+|b){2}c/.exec("aabc"), "aabc,b"); +shouldBe(/(a+|b){2}c/.exec("aac"), "aac,a"); +shouldBe(/(a+|b+){2}c/.exec("aabbc"), "aabbc,bb"); +shouldBe(/(a+|b){2,4}?c/.exec("abc"), "abc,b"); +shouldBe(/(a+|b){1,3}?c/.exec("abc"), "abc,b"); + +// 3-alternative groups +shouldBe(/(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+/.exec("a b (c) d"), "a b (c) d"); +shouldBe(/(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+/.exec("abc"), "abc"); + +// Complex pattern from prismjs (the one that was crashing) +var re = /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/; +shouldBe(re.exec("x(y)"), null); +shouldBe(re.exec("x(y) {"), "x(y,x("); +shouldBe(re.exec("foo(a, b) {"), "foo(a, b,foo("); +shouldBe(re.exec("foo(a, (b,c)) {"), "foo(a, (b,c),foo("); + +// Test with substrings (the crash was triggered by specific substrings) +shouldBe(re.exec("push({})"), null); +shouldBe(re.exec("push({id: i})"), null); diff --git a/JSTests/stress/regexp-nongreedy-varcount-content-backtrack.js b/JSTests/stress/regexp-nongreedy-varcount-content-backtrack.js new file mode 100644 index 000000000000..e69aae232c92 --- /dev/null +++ b/JSTests/stress/regexp-nongreedy-varcount-content-backtrack.js @@ -0,0 +1,121 @@ +// Regression test for NonGreedy {m,n}? parentheses backtracking in the YarrJIT. +// +// The JIT drives NonGreedy expansion (adding iterations) from END.bt, but when +// expansion and the latest iteration's content retries are exhausted it must undo +// the latest iteration and content-backtrack the PREVIOUS iteration, then let +// forward execution re-expand. Three bugs in that area: +// +// 1. min > 0, count >= min: took the Greedy "accept fewer" path instead of +// content-retrying earlier iterations -> non-leftmost / missed matches. +// 2. min > 0 content retry: restoreParenContext clobbered frame.beginIndex with +// the popped iteration's begin, so END.bt's progress check refused to +// re-expand after shrinking an earlier iteration. +// 3. min == 0: the NonGreedy backtrack was an empty break, so completed +// iterations were never content-backtracked at all. +// +// All three produced a wrong result (null or a non-leftmost match) in the JIT +// while the interpreter and V8 are correct. We run each pattern enough times to +// tier up so the JIT result is what gets checked. + +function run(re, str) { + var m = null; + for (var i = 0; i < 200; ++i) { + re.lastIndex = 0; + m = re.exec(str); + } + return m ? JSON.stringify(Array.prototype.slice.call(m)) + "@" + m.index : "null"; +} + +function check(re, str, expected) { + var actual = run(re, str); + if (actual !== expected) + throw new Error("FAILED " + re + " on '" + str + "': expected " + expected + " but got " + actual); +} + +// Bug 1: NonGreedy min>0 must retry earlier iterations' alternatives for a leftmost match. +check(/(?:aab|ab|a){1,2}?b/, "aaba", '["aab"]@0'); + +// Bug 2: NonGreedy min>0 must re-expand after shrinking an earlier iteration (3+2+2 split). +check(/^(?:a{2,3}){1,3}?b$/, "aaaaaaab", '["aaaaaaab"]@0'); + +// Bug 3: NonGreedy min==0 must content-backtrack completed iterations (3+2+2 split). +check(/^(?:a{2,3}){0,3}?b$/, "aaaaaaab", '["aaaaaaab"]@0'); + +// Additional NonGreedy coverage. +check(/(?:a){0,3}?b/, "aaab", '["aaab"]@0'); +check(/(?:a){1,3}?b/, "b", "null"); +check(/(?:a){2,3}?b/, "aaab", '["aaab"]@0'); +check(/(?:a){2,3}?b/, "aab", '["aab"]@0'); +check(/(?:ab|a){2,4}?c/, "ababc", '["ababc"]@0'); +check(/(?:a|aa|aaa){1,3}?b/, "aaaaaab", '["aaaaaab"]@0'); +check(/(?:a|aa|aaa){0,3}?b/, "aaaaaab", '["aaaaaab"]@0'); +check(/c(?:a{1,2}){1,3}?b/, "caaaaab", '["caaaaab"]@0'); +check(/(?:a{2}){1,3}?b/, "aaaaaab", '["aaaaaab"]@0'); +check(/(foo|foobar){1,2}?baz/, "foofoobarbaz", '["foofoobarbaz","foobar"]@0'); + +// min==0 NonGreedy total-failure path: BEGIN.bt reaches count==0 after popping the +// first actual iteration. The empty (zero-iteration) alternative was already tried +// first via the forward skip, so propagating failure is correct — the parens must +// return no match here, not silently re-accept empty. +check(/^(?:a){0,3}?b$/, "aac", "null"); +check(/(?:ab){0,2}?c/, "abx", "null"); +check(/^(?:a{2,3}){0,3}?b$/, "aaaaaaac", "null"); +check(/^(?:a{2,3}){0,3}?$/, "a", "null"); +check(/^(?:aa|a){0,3}?b$/, "aaac", "null"); +// ...and the empty/skip-first alternative still matches when it should: +check(/^(?:a){0,3}?b$/, "b", '["b"]@0'); +check(/(?:ab){0,2}?c/, "c", '["c"]@0'); +check(/^(?:a{2,3}){0,3}?b$/, "b", '["b"]@0'); + +// Greedy controls must remain correct after the refactor of the shared path. +check(/^(?:a{2,3}){1,3}b$/, "aaaaaaab", '["aaaaaaab"]@0'); +check(/(?:aab|ab|a){1,2}b/, "aaba", '["aab"]@0'); +check(/(foo|foobar){1,2}baz/, "foofoobarbaz", '["foofoobarbaz","foobar"]@0'); + +// Nested variable-count parens must enforce the INNER lazy minimum. The inner +// (?:a+){2,3}? needs >= 2 iterations; accepting 1 (via a mis-restored outer frame on +// the JIT, or a missing min-refill on the interpreter content-backtrack) wrongly matches. +check(/^((?:a+){2,3}?){2,3}ba/, "aaababa", "null"); + +// Interpreter (also forced here via lookbehind): NonGreedy parens must not accept +// fewer than quantityMinCount iterations after a content backtrack. {2,3}? needs >= 2. +check(/(?<=Q)(?:xy|x){2,3}?yxw/, "Qxyxwab", "null"); + +// Mandatory iterations (count <= min) may match zero-length on backtrack: the {1,3} +// group's single mandatory iteration must be allowed to retry to the empty alternative +// so the following "b" can match at index 0. +check(/^(a|b|){1,3}b/, "bybaaybww", '["b",""]@0'); +check(/^(?:a|b|){1,2}?b/, "b", '["b"]@0'); + +// Greedy accept-fewer must keep EXACTLY quantityMinCount surviving iterations when it +// drops down to the minimum (the cannotAcceptFewer test is `Below min`, not `BelowOrEqual`). +// Here forward overshoots to 3-4 iterations, then must drop back to exactly 2 so the tail +// matches; with a `BelowOrEqual` threshold these would wrongly content-backtrack to null. +check(/^(?:(a)|(b)){2,3}ba$/, "abba", '["abba",null,"b"]@0'); +check(/^(?:(a)|(b)){2,4}ba$/, "aabba", '["aabba",null,"b"]@0'); +check(/^(?:(x)|(y)){2,3}yx$/, "xyyx", '["xyyx",null,"y"]@0'); +check(/^(?:(a)|(bb)){2,3}bbc$/, "abbbbc", '["abbbbc",null,"bb"]@0'); +check(/^(?:a{2,3}){2,3}$/, "aaaa", '["aaaa"]@0'); // 2+2, drop to exactly min +check(/^(?:a{2,3}){2,3}$/, "aaa", "null"); // can't reach min -> fail +check(/^(?:a{1,2}){2,4}aa$/, "aaaaaa", '["aaaaaa"]@0'); + +// Greedy accept-zero (min==0, count==0): the group matches zero iterations and the inner +// captures must reset to undefined via the restored pre-iteration snapshot — even though +// the greedy forward had set them — without an explicit clear on that success path. +check(/^(?:(a))*ab$/, "ab", '["ab",null]@0'); +check(/^(?:(a))*(b)$/, "b", '["b",null,"b"]@0'); +check(/^(?:(a)(c))*ac$/, "ac", '["ac",null,null]@0'); + +// Greedy re-expansion after accept-fewer: backtracking must shrink an earlier iteration +// and then ADD another to refill (e.g. the 3+2+2 split below). This relies on the +// accept-fewer path decrementing matchAmount before jumping to End.reentry, so that when +// the surviving iteration is later re-processed END.forward's re-increment lands on the +// correct count and its `count < max` check still allows adding the extra iteration. +// Dropping that decrement makes these return null (END.forward over-counts -> thinks max +// is reached -> never adds the needed iteration). +check(/^(?:a{2,3}){1,3}b$/, "aaaaaaab", '["aaaaaaab"]@0'); // 3+2+2 +check(/^(?:a{2,3}){1,4}b$/, "aaaaaaaaab", '["aaaaaaaaab"]@0'); // 3+2+2+2 +check(/^(?:a{2,3}){2,4}c$/, "aaaaaaaac", '["aaaaaaaac"]@0'); +check(/^(?:a{2,4}){2,3}d$/, "aaaaaaad", '["aaaaaaad"]@0'); +check(/^(?:a{1,3}){2,3}x$/, "aaaaax", '["aaaaax"]@0'); +check(/^(?:ab|abc){1,3}d$/, "ababcd", '["ababcd"]@0'); diff --git a/JSTests/stress/regexp-quantify-atom-copy-term-out-of-stack.js b/JSTests/stress/regexp-quantify-atom-copy-term-out-of-stack.js index 4d4f169e5b7b..1cd5c700a03b 100644 --- a/JSTests/stress/regexp-quantify-atom-copy-term-out-of-stack.js +++ b/JSTests/stress/regexp-quantify-atom-copy-term-out-of-stack.js @@ -3,15 +3,22 @@ depth = typeof(depth) === 'undefined' ? 50000 : depth; -let expectedException = "SyntaxError: Invalid regular expression: regular expression too large"; +// Either error message is acceptable: deeply nested parens with a non-zero-min +// quantifier exceed pattern size limits at compile time. The exact message +// depends on which limit is hit first ("regular expression too large" via +// pattern offset overflow vs "too many nested disjunctions" via parser depth). +let expectedExceptions = [ + "SyntaxError: Invalid regular expression: regular expression too large", + "RangeError: Out of memory: Invalid regular expression: too many nested disjunctions", +]; function test(source) { try { new RegExp(source); } catch (e) { - if (e != expectedException) - throw "Expected \"" + expectedException + "\", but got \"" + e + "\" for: " + source.slice(0, 30) + "..."; + if (!expectedExceptions.includes(String(e))) + throw "Expected one of [" + expectedExceptions.join(", ") + "], but got \"" + e + "\" for: " + source.slice(0, 30) + "..."; } } diff --git a/JSTests/stress/regexp-unicode-case-insensitive-ascii-range-canonical-set.js b/JSTests/stress/regexp-unicode-case-insensitive-ascii-range-canonical-set.js new file mode 100644 index 000000000000..dbc4b00a5591 --- /dev/null +++ b/JSTests/stress/regexp-unicode-case-insensitive-ascii-range-canonical-set.js @@ -0,0 +1,50 @@ +// Verify that case-insensitive Unicode-mode character class ranges include the +// non-ASCII canonical equivalents U+017F (long s) and U+212A (Kelvin sign). + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ', expected: ' + expected); +} + +const longS = "\u017F"; // LATIN SMALL LETTER LONG S, canonicalizes to "s". +const kelvin = "\u212A"; // KELVIN SIGN, canonicalizes to "k". + +shouldBe(/[a-z]/iu.test(longS), true); +shouldBe(/[A-Z]/iu.test(longS), true); +shouldBe(/[s]/iu.test(longS), true); +shouldBe(/[r-t]/iu.test(longS), true); +shouldBe(/[a-z]/iv.test(longS), true); +shouldBe(/[a-r]/iu.test(longS), false); +shouldBe(/[t-z]/iu.test(longS), false); + +shouldBe(/[a-z]/iu.test(kelvin), true); +shouldBe(/[A-Z]/iu.test(kelvin), true); +shouldBe(/[k]/iu.test(kelvin), true); +shouldBe(/[j-l]/iu.test(kelvin), true); +shouldBe(/[a-z]/iv.test(kelvin), true); +shouldBe(/[a-j]/iu.test(kelvin), false); +shouldBe(/[l-z]/iu.test(kelvin), false); + +// Negated classes must exclude the canonical equivalents. +shouldBe(/[^a-z]/iu.test(longS), false); +shouldBe(/[^a-z]/iu.test(kelvin), false); + +// Ranges crossing the ASCII boundary. +shouldBe(/[a-\u00FF]/iu.test(longS), true); +shouldBe(/[a-\u00FF]/iu.test(kelvin), true); + +// Reverse direction: non-ASCII ranges containing the canonical equivalents +// must keep matching the ASCII characters. +shouldBe(/[\u0170-\u0180]/iu.test("s"), true); +shouldBe(/[\u0170-\u0180]/iu.test("S"), true); +shouldBe(/[\u2120-\u2130]/iu.test("k"), true); +shouldBe(/[\u2120-\u2130]/iu.test("K"), true); + +// Without the i flag, no canonicalization. +shouldBe(/[a-z]/u.test(longS), false); +shouldBe(/[a-z]/u.test(kelvin), false); + +// Non-Unicode mode (UCS2 canonicalization) must not change: U+017F/U+212A +// do not canonicalize into ASCII there. +shouldBe(/[a-z]/i.test(longS), false); +shouldBe(/[a-z]/i.test(kelvin), false); diff --git a/JSTests/stress/regexp-variable-count-native.js b/JSTests/stress/regexp-variable-count-native.js new file mode 100644 index 000000000000..fb74d3409cc2 --- /dev/null +++ b/JSTests/stress/regexp-variable-count-native.js @@ -0,0 +1,440 @@ +//@ runDefault + +// Tests for native JIT support of variable counted parentheses with non-zero minimum. +// These patterns are now handled natively by the JIT using FixedCount-style content +// backtracking, without splitting into FixedCount{min} + Greedy{0,max-min}. + +function shouldBe(actual, expected, message) { + if (JSON.stringify(actual) !== JSON.stringify(expected)) + throw new Error(message + ": expected " + JSON.stringify(expected) + " but got " + JSON.stringify(actual)); +} + +// ==== Test 1: Basic greedy pattern with non-zero min ==== +(function() { + var re = /(a){2,4}/; + shouldBe(re.exec("a"), null, "Single 'a' fails min 2"); + shouldBe(re.exec("aa"), ["aa", "a"], "Two 'a's matches min 2"); + shouldBe(re.exec("aaa"), ["aaa", "a"], "Three 'a's matches"); + shouldBe(re.exec("aaaa"), ["aaaa", "a"], "Four 'a's matches max 4"); + shouldBe(re.exec("aaaaa"), ["aaaa", "a"], "Five 'a's matches max 4 (greedy)"); + shouldBe(re.exec(""), null, "Empty string fails"); +})(); + +// ==== Test 2: Basic non-greedy pattern with non-zero min ==== +(function() { + var re = /(a){2,4}?/; + shouldBe(re.exec("a"), null, "Single 'a' fails min 2"); + shouldBe(re.exec("aa"), ["aa", "a"], "Two 'a's matches min 2 (non-greedy stops at min)"); + shouldBe(re.exec("aaa"), ["aa", "a"], "Three 'a's matches min 2 (non-greedy)"); + shouldBe(re.exec("aaaa"), ["aa", "a"], "Four 'a's matches min 2 (non-greedy)"); +})(); + +// ==== Test 3: Greedy with trailing literal (forces backtracking) ==== +(function() { + var re = /(a){2,4}b/; + shouldBe(re.exec("ab"), null, "One 'a' fails min 2"); + shouldBe(re.exec("aab"), ["aab", "a"], "Two 'a's matches"); + shouldBe(re.exec("aaab"), ["aaab", "a"], "Three 'a's matches"); + shouldBe(re.exec("aaaab"), ["aaaab", "a"], "Four 'a's matches max"); + shouldBe(re.exec("aaaaab"), ["aaaab", "a"], "Five 'a's - matches 4 from position 1"); +})(); + +// ==== Test 4: Non-greedy with trailing literal ==== +(function() { + var re = /(a){2,4}?b/; + shouldBe(re.exec("ab"), null, "One 'a' fails min 2"); + shouldBe(re.exec("aab"), ["aab", "a"], "Two 'a's matches min"); + shouldBe(re.exec("aaab"), ["aaab", "a"], "Three 'a's - non-greedy forced to match 3"); + shouldBe(re.exec("aaaab"), ["aaaab", "a"], "Four 'a's - non-greedy forced to match 4"); + shouldBe(re.exec("aaaaab"), ["aaaab", "a"], "Five 'a's - matches 4 from position 1"); +})(); + +// ==== Test 5: Non-capturing group with non-zero min ==== +(function() { + var re = /(?:ab){2,4}c/; + shouldBe(re.exec("abc"), null, "One 'ab' fails min 2"); + shouldBe(re.exec("ababc"), ["ababc"], "Two 'ab' matches min"); + shouldBe(re.exec("abababc"), ["abababc"], "Three 'ab' matches"); + shouldBe(re.exec("ababababc"), ["ababababc"], "Four 'ab' matches max"); + shouldBe(re.exec("abababababc"), ["ababababc"], "Five 'ab' - matches 4 from position 2"); +})(); + +// ==== Test 6: Infinite max with non-zero min ==== +(function() { + var re = /(a){2,}/; + shouldBe(re.exec("a"), null, "One 'a' fails min 2"); + shouldBe(re.exec("aa"), ["aa", "a"], "Two 'a's matches min"); + shouldBe(re.exec("aaaaaaaaa"), ["aaaaaaaaa", "a"], "Many 'a's matches (greedy)"); +})(); + +// ==== Test 7: Infinite max non-greedy ==== +(function() { + var re = /(a){2,}?/; + shouldBe(re.exec("a"), null, "One 'a' fails min 2"); + shouldBe(re.exec("aa"), ["aa", "a"], "Two 'a's matches min"); + shouldBe(re.exec("aaaaaaaaa"), ["aa", "a"], "Many 'a's matches min (non-greedy)"); +})(); + +// ==== Test 8: Larger min values ==== +(function() { + var re = /(x){5,8}/; + shouldBe(re.exec("xxxx"), null, "4 chars fails min 5"); + shouldBe(re.exec("xxxxx"), ["xxxxx", "x"], "5 chars matches min"); + shouldBe(re.exec("xxxxxxxx"), ["xxxxxxxx", "x"], "8 chars matches max"); + shouldBe(re.exec("xxxxxxxxx"), ["xxxxxxxx", "x"], "9 chars matches max 8 (greedy)"); +})(); + +// ==== Test 9: Nested capturing groups ==== +(function() { + var re = /((a)(b)){2,4}/; + var result = re.exec("ababab"); + shouldBe(result[0], "ababab", "Full match"); + shouldBe(result[1], "ab", "Outer capture (last iteration)"); + shouldBe(result[2], "a", "Inner capture 1 (last iteration)"); + shouldBe(result[3], "b", "Inner capture 2 (last iteration)"); +})(); + +// ==== Test 10: Alternation inside quantified group ==== +(function() { + var re = /(a|b){2,4}/; + shouldBe(re.exec("a"), null, "One char fails min 2"); + shouldBe(re.exec("ab"), ["ab", "b"], "Two chars matches"); + shouldBe(re.exec("ba"), ["ba", "a"], "Two chars matches (other order)"); + shouldBe(re.exec("abab"), ["abab", "b"], "Four chars matches"); + shouldBe(re.exec("aaaaa"), ["aaaa", "a"], "Five chars matches max 4"); +})(); + +// ==== Test 11: Greedy inner content - content backtracking ==== +(function() { + var re = /(a+){2}b/; + shouldBe(re.exec("ab"), null, "One iteration fails"); + shouldBe(re.exec("aab"), ["aab", "a"], "Two iterations matches"); + shouldBe(re.exec("aaab"), ["aaab", "a"], "With extra chars in iteration"); +})(); + +// ==== Test 12: Multiple quantified groups ==== +(function() { + var re = /(x){1,2}(a){2,4}c/; + shouldBe(re.exec("xaac"), ["xaac", "x", "a"], "Min matches for both"); + shouldBe(re.exec("xxaaaac"), ["xxaaaac", "x", "a"], "Max for both"); + shouldBe(re.exec("xac"), null, "Second group fails min"); +})(); + +// ==== Test 13: Case insensitive ==== +(function() { + var re = /(a){2,4}/i; + shouldBe(re.exec("aA"), ["aA", "A"], "Mixed case matches"); + shouldBe(re.exec("AaAa"), ["AaAa", "a"], "Four mixed case chars"); +})(); + +// ==== Test 14: Unicode ==== +(function() { + var re = /(\u{1F600}){2,4}/u; + shouldBe(re.exec("\u{1F600}"), null, "One emoji fails min 2"); + shouldBe(re.exec("\u{1F600}\u{1F600}"), ["\u{1F600}\u{1F600}", "\u{1F600}"], "Two emojis match"); +})(); + +// ==== Test 15: Stress test - Greedy ==== +(function() { + var re = /(a){2,100}/; + for (var i = 0; i < 1000; i++) { + var result = re.exec("aaaaaaaaaa"); // 10 a's + if (result[0] !== "aaaaaaaaaa" || result[1] !== "a") + throw new Error("Stress test 1 failed at iteration " + i); + } +})(); + +// ==== Test 16: Stress test - NonGreedy ==== +(function() { + var re = /(a){2,100}?/; + for (var i = 0; i < 1000; i++) { + var result = re.exec("aaaaaaaaaa"); // 10 a's + if (result[0] !== "aa" || result[1] !== "a") + throw new Error("Stress test 2 failed at iteration " + i); + } +})(); + +// ==== Test 17: Stress test - backtracking ==== +(function() { + var re = /(a){2,5}b/; + for (var i = 0; i < 1000; i++) { + var result = re.exec("aaaab"); + if (result[0] !== "aaaab" || result[1] !== "a") + throw new Error("Stress test 3 failed at iteration " + i); + } +})(); + +// ==== Test 18: Edge case - min equals max minus 1 ==== +(function() { + var re = /(a){3,4}/; + shouldBe(re.exec("aa"), null, "Two chars fails min 3"); + shouldBe(re.exec("aaa"), ["aaa", "a"], "Three chars matches"); + shouldBe(re.exec("aaaa"), ["aaaa", "a"], "Four chars matches max"); + shouldBe(re.exec("aaaaa"), ["aaaa", "a"], "Five chars matches max 4"); +})(); + +// ==== Test 19: Non-greedy forcing backtrack ==== +(function() { + var re = /(a){2,5}?aaab/; + shouldBe(re.exec("aaaaaab"), ["aaaaaab", "a"], "Non-greedy forced to match 3 a's"); + shouldBe(re.exec("aaaab"), null, "Too short"); + shouldBe(re.exec("aaaaab"), ["aaaaab", "a"], "Exact minimum"); +})(); + +// ==== Test 20: Alternation patterns - the original motivating case ==== +(function() { + var re = /(aa|aaaa){2,3}$/; + shouldBe(re.exec("aaaaaa"), ["aaaaaa", "aa"], "6 a's: 3x'aa'"); + shouldBe(re.exec("aaaaaaaa"), ["aaaaaaaa", "aaaa"], "8 a's: 2x'aaaa'"); + shouldBe(re.exec("aaaa"), ["aaaa", "aa"], "4 a's: 2x'aa'"); + shouldBe(re.exec("aaa"), null, "3 a's: fails"); +})(); + +// ==== Test 21: Alternation patterns requiring specific combinations ==== +(function() { + var re = /(a|aaa){2}x/; + shouldBe(re.exec("aaaax"), ["aaaax", "aaa"], "4 a's + x: 'a'+'aaa'"); + shouldBe(re.exec("aax"), ["aax", "a"], "2 a's + x: 'a'+'a'"); + shouldBe(re.exec("ax"), null, "1 a + x: fails"); +})(); + +// ==== Test 22: Greedy content backtracking with min > 0 ==== +(function() { + var re = /(a+){2,4}b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "a+ must split to allow 2 iterations"); + shouldBe(re.exec("aab"), ["aab", "a"], "2 a's: 'a'+'a'+b"); + shouldBe(re.exec("ab"), null, "1 a: fails min 2"); + shouldBe(re.exec("aaaaab"), ["aaaaab", "a"], "5 a's: 4 iterations of a+"); +})(); + +// ==== Test 23: Content backtracking with fixed count ==== +(function() { + var re = /(a+){2}b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "3 a's: need to backtrack a+ to allow 2 iters"); + shouldBe(re.exec("aab"), ["aab", "a"], "2 a's: exactly 2 iters"); + shouldBe(re.exec("ab"), null, "1 a: fails"); +})(); + +// ==== Test 24: Content backtracking with fixed count (3) ==== +(function() { + var re = /(a+){3}b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "3 a's: exactly 3 iters of 1 a each"); + shouldBe(re.exec("aaaab"), ["aaaab", "a"], "4 a's: need to redistribute"); + shouldBe(re.exec("aab"), null, "2 a's: can't make 3 iters"); +})(); + +// ==== Test 25: NonGreedy with content backtracking ==== +(function() { + var re = /(a+){2,4}?b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "3 a's + b"); + shouldBe(re.exec("aab"), ["aab", "a"], "2 a's + b"); + shouldBe(re.exec("ab"), null, "1 a: fails min 2"); +})(); + +// ==== Test 26: Multi-alternative with content backtracking ==== +(function() { + var re = /(a+|b+){2,4}c/; + shouldBe(re.exec("aabbc"), ["aabbc", "bb"], "Mixed alternatives"); + shouldBe(re.exec("abc"), ["abc", "b"], "Single chars"); + shouldBe(re.exec("ac"), null, "Only 1 iteration: fails"); +})(); + +// ==== Test 27: Single-char alternatives ==== +(function() { + var re = /(a|b|c){2,3}d/; + shouldBe(re.exec("abcd"), ["abcd", "c"], "3 iterations"); + shouldBe(re.exec("abd"), ["abd", "b"], "2 iterations"); + shouldBe(re.exec("ad"), null, "1 iteration: fails"); +})(); + +// ==== Test 28: Acceptance at different counts ==== +(function() { + var re = /(abc){2,4}abcd/; + // 3 iterations + "abcd" suffix requires accepting 3 iterations (not 4) + shouldBe(re.exec("abcabcabcabcd"), ["abcabcabcabcd", "abc"], "Accept 3 iters + abcd"); + shouldBe(re.exec("abcabcabcd"), ["abcabcabcd", "abc"], "Accept 2 iters + abcd"); + shouldBe(re.exec("abcabcd"), null, "1 iter + abcd: fails min 2"); +})(); + +// ==== Test 29: Accept 2 iterations with suffix ==== +(function() { + var re = /(ab){2,3}abc/; + shouldBe(re.exec("abababc"), ["abababc", "ab"], "2 iters of (ab) + abc suffix"); + shouldBe(re.exec("ababababc"), ["ababababc", "ab"], "3 iters of (ab) + abc suffix"); + shouldBe(re.exec("ababc"), null, "Too short: 1 iter + abc doesn't meet min 2"); +})(); + +// ==== Test 30: Mixed fixed and variable count ==== +(function() { + var re = /(a){3}(b){2,4}c/; + shouldBe(re.exec("aaabbc"), ["aaabbc", "a", "b"], "Fixed 3, var 2"); + shouldBe(re.exec("aaabbbc"), ["aaabbbc", "a", "b"], "Fixed 3, var 3"); + shouldBe(re.exec("aaabbbbc"), ["aaabbbbc", "a", "b"], "Fixed 3, var 4"); + shouldBe(re.exec("aabbc"), null, "Fails fixed 3"); + shouldBe(re.exec("aaabc"), null, "Fails var min 2"); +})(); + +// ==== Test 31: Global flag ==== +(function() { + var re = /(a){2,4}/g; + var str = "aa aaa aaaa a aaaaa"; + var matches = str.match(re); + shouldBe(matches.length, 4, "Should find 4 matches"); + shouldBe(matches[0], "aa", "First match"); + shouldBe(matches[1], "aaa", "Second match"); + shouldBe(matches[2], "aaaa", "Third match"); + shouldBe(matches[3], "aaaa", "Fourth match (from 5 a's)"); +})(); + +// ==== Test 32: Replace ==== +(function() { + var re = /(a){2,4}/g; + var result = "aa aaa aaaa a".replace(re, "X"); + shouldBe(result, "X X X a", "Replace should work correctly"); +})(); + +// ==== Test 33: Infinite max with content backtracking ==== +(function() { + var re = /(a+){2,}b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "3 a's: a+ splits for 2 iters + b"); + shouldBe(re.exec("aab"), ["aab", "a"], "2 a's: 2 iters of 1 a each + b"); + shouldBe(re.exec("ab"), null, "1 a: fails min 2"); + shouldBe(re.exec("aaaaab"), ["aaaaab", "a"], "5 a's + b"); +})(); + +// ==== Test 34: Longer alternatives ==== +(function() { + var re = /(ab|abab){2,3}$/; + shouldBe(re.exec("abababab"), ["abababab", "abab"], "8 chars: 2x'abab'"); + shouldBe(re.exec("abab"), ["abab", "ab"], "4 chars: 2x'ab'"); + shouldBe(re.exec("ab"), null, "2 chars: 1x'ab', fails min 2"); +})(); + +// ==== Test 35: Non-capturing with content backtracking ==== +(function() { + var re = /(?:a+){2,4}b/; + shouldBe(re.exec("aaab"), ["aaab"], "3 a's + b"); + shouldBe(re.exec("aab"), ["aab"], "2 a's + b"); + shouldBe(re.exec("ab"), null, "1 a: fails"); +})(); + +// ==== Test 36: Nested quantifiers ==== +(function() { + var re = /((?:ab)+){2,3}c/; + shouldBe(re.exec("ababababc"), ["ababababc", "ab"], "Nested: last iter captures 'ab'"); + shouldBe(re.exec("ababc"), ["ababc", "ab"], "Nested: 2 outer iters"); +})(); + +// ==== Test 37: Backreferences with min > 0 ==== +(function() { + var re = /(a+)\1{2,3}/; + shouldBe(re.exec("aaaaaa"), ["aaaaaa", "aa"], "Backref: 'aa' repeated 3 times"); +})(); + +// ==== Test 38: Verify JIT and interpreter agree ==== +// Run many times to trigger JIT compilation +(function() { + for (var i = 0; i < 1000; i++) { + var re = /(aa|aaaa){2,3}$/; + var result = re.exec("aaaaaa"); + if (!result || result[0] !== "aaaaaa" || result[1] !== "aa") + throw new Error("JIT/interpreter mismatch at iteration " + i + ": " + JSON.stringify(result ? Array.from(result) : null)); + } +})(); + +// ==== Test 39: Complex alternation requiring backtrack ==== +(function() { + var re = /(a|aa|aaa){2,3}$/; + shouldBe(re.exec("aaaa"), ["aaaa", "aa"], "4 a's: 'aa'+'aa'"); + shouldBe(re.exec("aaa"), ["aaa", "a"], "3 a's: 'a'+'a'+'a' or 'a'+'aa'"); + shouldBe(re.exec("aa"), ["aa", "a"], "2 a's: 'a'+'a'"); + shouldBe(re.exec("a"), null, "1 a: fails min 2"); +})(); + +// ==== Test 40: Greedy with inner content backtracking ==== +(function() { + var re = /(a+){2,4}aab/; + shouldBe(re.exec("aaaab"), ["aaaab", "a"], "Need to save 'aab' for suffix"); + shouldBe(re.exec("aaaaab"), ["aaaaab", "a"], "More a's to distribute"); +})(); + +// ==== Test 41: NonGreedy inner with min > 0 ==== +(function() { + var re = /(a+?){2,4}b/; + shouldBe(re.exec("aaab"), ["aaab", "a"], "Non-greedy inner"); + shouldBe(re.exec("aab"), ["aab", "a"], "Non-greedy inner: 2 iters"); +})(); + +// ==== Test 42: Zero-length inner match (min == 0, Greedy) ==== +// (a?)* - inner can match empty string. min=0, so zero-length exit immediately. +(function() { + shouldBe(/(a?)*b/.exec("b"), ["b", undefined], "(a?)*b on 'b': capture undefined"); + shouldBe(/(a?)*b/.exec("ab"), ["ab", "a"], "(a?)*b on 'ab': capture 'a'"); + shouldBe(/(a?)*b/.exec("aab"), ["aab", "a"], "(a?)*b on 'aab': capture 'a'"); +})(); + +// ==== Test 43: Zero-length inner match (min > 0, Greedy) ==== +// (a?)+ / (a?){1,2} - inner can match empty, forced iterations counted. +(function() { + shouldBe(/(a?)+b/.exec("b"), ["b", ""], "(a?)+b on 'b': capture '' (forced iter)"); + shouldBe(/(a?)+b/.exec("ab"), ["ab", "a"], "(a?)+b on 'ab': capture 'a'"); + shouldBe(/(a?)+b/.exec("aab"), ["aab", "a"], "(a?)+b on 'aab': capture 'a'"); + + shouldBe(/(a?){1,2}b/.exec("b"), ["b", ""], "(a?){1,2}b on 'b'"); + shouldBe(/(a?){1,2}b/.exec("ab"), ["ab", "a"], "(a?){1,2}b on 'ab'"); + shouldBe(/(a?){1,2}b/.exec("aab"), ["aab", "a"], "(a?){1,2}b on 'aab'"); + + shouldBe(/(a?){2,3}b/.exec("b"), ["b", ""], "(a?){2,3}b on 'b'"); + shouldBe(/(a?){2,3}b/.exec("ab"), ["ab", ""], "(a?){2,3}b on 'ab'"); + shouldBe(/(a?){2,3}b/.exec("aab"), ["aab", "a"], "(a?){2,3}b on 'aab'"); + shouldBe(/(a?){2,3}b/.exec("aaab"), ["aaab", "a"], "(a?){2,3}b on 'aaab'"); + + shouldBe(/(a?){1,}b/.exec("b"), ["b", ""], "(a?){1,}b on 'b'"); + shouldBe(/(a?){1,}b/.exec("ab"), ["ab", "a"], "(a?){1,}b on 'ab'"); +})(); + +// ==== Test 44: Zero-length inner match (a*) ==== +(function() { + shouldBe(/(a*){2,3}b/.exec("b"), ["b", ""], "(a*){2,3}b on 'b'"); + shouldBe(/(a*){2,3}b/.exec("ab"), ["ab", ""], "(a*){2,3}b on 'ab'"); + shouldBe(/(a*){2,3}b/.exec("aab"), ["aab", ""], "(a*){2,3}b on 'aab'"); +})(); + +// ==== Test 45: Zero-length inner match (NonGreedy) ==== +(function() { + shouldBe(/(a?){1,2}?b/.exec("b"), ["b", ""], "(a?){1,2}?b on 'b'"); + shouldBe(/(a?){1,2}?b/.exec("ab"), ["ab", "a"], "(a?){1,2}?b on 'ab'"); + shouldBe(/(a?){2,3}?b/.exec("b"), ["b", ""], "(a?){2,3}?b on 'b'"); + shouldBe(/(a?){2,3}?b/.exec("ab"), ["ab", ""], "(a?){2,3}?b on 'ab'"); + shouldBe(/(a?){2,3}?b/.exec("aab"), ["aab", "a"], "(a?){2,3}?b on 'aab'"); +})(); + +// ==== Test 46: Zero-length inner match (min == 0, NonGreedy) ==== +(function() { + shouldBe(/(a?)*?b/.exec("b"), ["b", undefined], "(a?)*?b on 'b'"); + shouldBe(/(a?)*?b/.exec("ab"), ["ab", "a"], "(a?)*?b on 'ab'"); +})(); + +// ==== Test 47: Zero-length with alternatives ==== +(function() { + shouldBe(/(a|){1,2}b/.exec("b"), ["b", ""], "(a|){1,2}b on 'b'"); + shouldBe(/(a|){1,2}b/.exec("ab"), ["ab", "a"], "(a|){1,2}b on 'ab'"); + shouldBe(/(a|){1,2}b/.exec("aab"), ["aab", "a"], "(a|){1,2}b on 'aab'"); +})(); + +// ==== Test 48: Zero-length stress test with JIT ==== +(function() { + for (var i = 0; i < 1000; i++) { + shouldBe(/(a?){1,2}b/.exec("ab"), ["ab", "a"], "JIT stress (a?){1,2}b on 'ab' iter " + i); + shouldBe(/(a?)+b/.exec("b"), ["b", ""], "JIT stress (a?)+b on 'b' iter " + i); + shouldBe(/(a?)*b/.exec("ab"), ["ab", "a"], "JIT stress (a?)*b on 'ab' iter " + i); + } +})(); + +// ==== Test 49: Multiple capture groups with zero-length ==== +(function() { + shouldBe(/(a?)(b?){1,2}c/.exec("c"), ["c", "", ""], "(a?)(b?){1,2}c on 'c'"); + shouldBe(/(a?)(b?){1,2}c/.exec("abc"), ["abc", "a", "b"], "(a?)(b?){1,2}c on 'abc'"); + shouldBe(/(a?)(b?){1,2}c/.exec("ac"), ["ac", "a", ""], "(a?)(b?){1,2}c on 'ac'"); + shouldBe(/(a?)(b?){1,2}c/.exec("bc"), ["bc", "", "b"], "(a?)(b?){1,2}c on 'bc'"); +})(); diff --git a/JSTests/stress/regexp-variable-counted-parentheses-with-min.js b/JSTests/stress/regexp-variable-counted-parentheses-with-min.js index e09f3b1c1c69..9c1a0aa95738 100644 --- a/JSTests/stress/regexp-variable-counted-parentheses-with-min.js +++ b/JSTests/stress/regexp-variable-counted-parentheses-with-min.js @@ -275,3 +275,82 @@ function shouldBe(actual, expected, message) { throw new Error("(a){3}b should match 'aaab' within 'aaaab'"); } })(); + +// Test 23: validatorjs IPv6 pattern fragment - capturing groups with {1,N} +// Multiple sibling capturing parens with non-zero min trigger the +// no-IR-expansion path in YarrPattern (m_hasCopiedParenSubexpressions guard); +// the JIT must handle min > 0 && min != max for capturing groups directly. +(function() { + var re = /^(:(?:[0-9a-fA-F]{1,4})){1,7}$/; + for (var i = 0; i < 1000; i++) { + var result = re.exec(":a"); + if (!result || result[0] !== ":a") throw new Error("Test 23a iter " + i); + result = re.exec(":a:b:c:d:e:f:7"); + if (!result || result[0] !== ":a:b:c:d:e:f:7") throw new Error("Test 23b iter " + i); + if (re.exec(":") !== null) throw new Error("Test 23c iter " + i); + if (re.exec("a") !== null) throw new Error("Test 23d iter " + i); + if (re.exec(":a:b:c:d:e:f:g:h") !== null) throw new Error("Test 23e iter " + i); + } +})(); + +// Test 24: Nested capturing min>0 inside outer min>0 (mirrors locale RFC 5646 +// `(x(-[A-Za-z0-9]{1,8})+)`). Outer is FixedCount(1) with capturing inner that's +// (...){1,inf}. The inner BEGIN.bt count0 - /(?:(?:ab)+){2,}/ requires the outer +// BEGIN.bt to backtrack INTO the prior iter's content (via END's content +// backtrack entry) rather than fail when count < min. With "abab", the outer +// needs to break iter 1 into a single (ab) so iter 2 can match. +(function() { + var re = /^(?:(?:ab)+){2,}$/; + for (var i = 0; i < 1000; i++) { + if (!re.test("abab")) throw new Error("Test 25a iter " + i); + if (!re.test("ababab")) throw new Error("Test 25b iter " + i); + if (!re.test("abababab")) throw new Error("Test 25c iter " + i); + if (re.test("ab")) throw new Error("Test 25d iter " + i); + if (re.test("aba")) throw new Error("Test 25e iter " + i); + if (re.test("ababa")) throw new Error("Test 25f iter " + i); + } +})(); + +// Test 26: Non-greedy with capturing and min > 0 +// /(((a){2})+){2,}?z/ exercises NonGreedy mandatory phase with deeply nested +// capturing parens — exposed by the yarr-jit-fixedcount-paren-context-free-on-skip suite. +(function() { + var re = /(((a){2})+){2,}?z/; + for (var i = 0; i < 1000; i++) { + var result = re.exec("aaaaz"); + if (!result || result[0] !== "aaaaz" || result[1] !== "aa" || result[2] !== "aa" || result[3] !== "a") + throw new Error("Test 26a iter " + i); + result = re.exec("aaaaaaz"); + if (!result || result[0] !== "aaaaaaz") + throw new Error("Test 26b iter " + i); + if (re.exec("aaz") !== null) throw new Error("Test 26c iter " + i); + if (re.exec("z") !== null) throw new Error("Test 26d iter " + i); + } +})(); + +// Test 27: + on capturing group (= {1,inf}) — ensure simple cases still work +(function() { + var re = /^(a)+$/; + for (var i = 0; i < 1000; i++) { + var result = re.exec("aaa"); + if (!result || result[0] !== "aaa" || result[1] !== "a") + throw new Error("Test 27a iter " + i); + if (re.exec("") !== null) throw new Error("Test 27b iter " + i); + } +})(); diff --git a/JSTests/stress/regress-159954.js b/JSTests/stress/regress-159954.js index 356375d97598..53cb180317fd 100644 --- a/JSTests/stress/regress-159954.js +++ b/JSTests/stress/regress-159954.js @@ -1,11 +1,10 @@ -// Regression test for 159954. This test should not crash or throw an exception. +// Regression test for 159954. This test should not crash. -function testRegExp(regexpExpression) +function testRegExpThrows(regexpExpression) { try { let result = eval(regexpExpression); - - throw "Expected \"" + regexpExpression + "\" to throw and it didn't"; + throw "Expected \"" + regexpExpression + "\" to throw and it didn't, got: " + JSON.stringify(result); } catch (e) { if (e != "SyntaxError: Invalid regular expression: pattern exceeds string length limits") throw e; @@ -13,11 +12,21 @@ function testRegExp(regexpExpression) } } -testRegExp("/a{2147483649,2147483650}a{2147483649,2147483650}/.exec('aaaa')"); -testRegExp("/a{2147483649,2147483650}a{2147483649,2147483650}/.exec('aa')"); -testRegExp("/(?:\1{2147483649,2147483650})+/.exec('123')"); -testRegExp("/([^]{2147483648,2147483651}(?:.){2})+?/.exec('xxx')"); -testRegExp("/(\u0004\W\u0f0b+?$[\xa7\t\t-\ue118\f]{2147483648,2147483648})+.+?/u.exec('testing')"); -testRegExp("/(.{2147483649,2147483652})+?/g.exec('xxx')"); -testRegExp("/(?:(?:[\D]{2147483649})+?.)*?/igmy.exec('123\\n123')"); -testRegExp("/(?:\1{2147483648,})+?/m.exec('xxx')"); +function testRegExpResult(regexpExpression, expectedResult) +{ + let result = eval(regexpExpression); + if (JSON.stringify(result) !== JSON.stringify(expectedResult)) + throw "Expected \"" + regexpExpression + "\" to return " + JSON.stringify(expectedResult) + ", got: " + JSON.stringify(result); +} + +// These patterns cause offset overflow and should throw +testRegExpThrows("/a{2147483649,2147483650}a{2147483649,2147483650}/.exec('aaaa')"); +testRegExpThrows("/a{2147483649,2147483650}a{2147483649,2147483650}/.exec('aa')"); + +// These patterns are now supported with variable count parentheses and return valid results +testRegExpResult("/(?:\\1{2147483649,2147483650})+/.exec('123')", null); +testRegExpResult("/([^]{2147483648,2147483651}(?:.){2})+?/.exec('xxx')", null); +testRegExpResult("/(\\u0004\\W\\u0f0b+?$[\\xa7\\t\\t-\\ue118\\f]{2147483648,2147483648})+.+?/u.exec('testing')", null); +testRegExpResult("/(.{2147483649,2147483652})+?/g.exec('xxx')", null); +testRegExpResult("/(?:(?:[\\D]{2147483649})+?.)*?/igmy.exec('123\\n123')", [""]); +testRegExpResult("/(?:\\1{2147483648,})+?/m.exec('xxx')", null); diff --git a/JSTests/stress/regress-168411205.js b/JSTests/stress/regress-168411205.js new file mode 100644 index 000000000000..48463b9a55e7 --- /dev/null +++ b/JSTests/stress/regress-168411205.js @@ -0,0 +1,14 @@ +//@ runDefault("--useConcurrentJIT=0", "--validateGraphAtEachPhase=1", "--validateGraph=true") + +function f() { + const a = new Array(3); + a[0] = 0; + for (let i = 1; i < 3; ++i) { + a[i] = a[0]; + } +} +noInline(f); + +for (let i = 0; i < testLoopCount; ++i) { + f(); +} diff --git a/JSTests/stress/regress-171780137.js b/JSTests/stress/regress-171780137.js new file mode 100644 index 000000000000..cfc4bdf4de36 --- /dev/null +++ b/JSTests/stress/regress-171780137.js @@ -0,0 +1,10 @@ +function assert(x) { + if (!x) + throw new Error("Bad assertion!"); +} + +const sym = Symbol("foo"); +const obj = {}; +obj[sym] = 1; +const parsed = JSON.parse('{"foo": 42}'); +assert(!(parsed[sym] === 42 && parsed.foo === undefined)); diff --git a/JSTests/stress/set-iterator-fast-cross-realm.js b/JSTests/stress/set-iterator-fast-cross-realm.js new file mode 100644 index 000000000000..1d999fe35c26 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-cross-realm.js @@ -0,0 +1,37 @@ +// Cross-realm: iterating a Set / SetIterator from another realm. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +var otherRealm = createGlobalObject(); + +function valuesOfSet(set) { + var sum = 0; + for (var v of set.values()) sum += v; + return sum; +} +noInline(valuesOfSet); + +function plainOfSet(set) { + var sum = 0; + for (var v of set) sum += v; + return sum; +} +noInline(plainOfSet); + +function entriesOfSet(set) { + var sum = 0; + for (var [a, b] of set.entries()) sum += a + b; + return sum; +} +noInline(entriesOfSet); + +var otherSet = otherRealm.eval('var s = new Set(); for (var i = 0; i < 10; ++i) s.add(i + 1); s'); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(valuesOfSet(otherSet), 55); + shouldBe(plainOfSet(otherSet), 55); + shouldBe(entriesOfSet(otherSet), 110); +} diff --git a/JSTests/stress/set-iterator-fast-ftl.js b/JSTests/stress/set-iterator-fast-ftl.js new file mode 100644 index 000000000000..8a0666e05390 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-ftl.js @@ -0,0 +1,35 @@ +// FTL fast path for set.values()/entries() iteration. +//@ runFTLNoCJIT + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(set) { + var sum = 0; + for (var v of set.values()) sum += v; + return sum; +} + +function entries(set) { + var sum = 0; + for (var [a, b] of set.entries()) sum += a + b; + return sum; +} + +function plain(set) { + var sum = 0; + for (var v of set) sum += v; + return sum; +} + +var set = new Set(); +for (var i = 0; i < 10; ++i) + set.add(i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(set), 55); + shouldBe(entries(set), 110); + shouldBe(plain(set), 55); +} diff --git a/JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js b/JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js new file mode 100644 index 000000000000..94872efbbf29 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js @@ -0,0 +1,42 @@ +// Replacing %IteratorPrototype%[Symbol.iterator] (which the JSSetIterator inherits) should +// invalidate the fast path for set iterator reuse via for-of. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function valuesOfIterator(set) { + var iter = set.values(); + var sum = 0; + for (var v of iter) sum += v; + return sum; +} +noInline(valuesOfIterator); + +var set = new Set(); +for (var i = 0; i < 10; ++i) + set.add(i + 1); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(valuesOfIterator(set), 55); + +var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf((new Set()).values())); +iteratorPrototype[Symbol.iterator] = function () { + var arr = []; + var src = this; + var nextResult; + while (true) { + nextResult = src.next(); + if (nextResult.done) break; + arr.push(nextResult.value * 10); + } + var idx = 0; + return { + next() { + return idx < arr.length ? { value: arr[idx++], done: false } : { value: undefined, done: true }; + } + }; +}; + +shouldBe(valuesOfIterator(set), 550); diff --git a/JSTests/stress/set-iterator-fast-keys-values-entries.js b/JSTests/stress/set-iterator-fast-keys-values-entries.js new file mode 100644 index 000000000000..20d26e9455d4 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-keys-values-entries.js @@ -0,0 +1,79 @@ +// Tests for fast iteration of JSSetIterator (set.values(), set.keys(), set.entries()). +// Note: Set.prototype.keys === Set.prototype.values; both produce JSSetIterator(Values). + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(set) { + var sum = 0; + for (var v of set.values()) + sum += v; + return sum; +} +noInline(values); + +function keys(set) { + var sum = 0; + for (var k of set.keys()) + sum += k; + return sum; +} +noInline(keys); + +function entries(set) { + var sum = 0; + for (var [a, b] of set.entries()) + sum += a + b; + return sum; +} +noInline(entries); + +// for (...of set) uses Set.prototype[Symbol.iterator] === Set.prototype.values (FastSet path, +// fresh JSSetIterator(Values)). +function plain(set) { + var sum = 0; + for (var v of set) + sum += v; + return sum; +} +noInline(plain); + +var set = new Set(); +for (var i = 0; i < 10; ++i) + set.add(i + 1); + +var expectedValues = 55; // 1+2+...+10 +var expectedEntries = 110; // 2*(1+2+...+10) — entries yields [v, v] + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(set), expectedValues); + shouldBe(keys(set), expectedValues); + shouldBe(entries(set), expectedEntries); + shouldBe(plain(set), expectedValues); +} + +// Iterating the iterator object directly (the iterable is already a JSSetIterator). +function valuesOfIterator(set) { + var iter = set.values(); + var sum = 0; + for (var v of iter) + sum += v; + return sum; +} +noInline(valuesOfIterator); + +function entriesOfIterator(set) { + var iter = set.entries(); + var sum = 0; + for (var [a, b] of iter) + sum += a + b; + return sum; +} +noInline(entriesOfIterator); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(valuesOfIterator(set), expectedValues); + shouldBe(entriesOfIterator(set), expectedEntries); +} diff --git a/JSTests/stress/set-iterator-fast-mid-iteration.js b/JSTests/stress/set-iterator-fast-mid-iteration.js new file mode 100644 index 000000000000..903d3e7ff887 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-mid-iteration.js @@ -0,0 +1,55 @@ +// Mid-iteration mutation of the underlying Set. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function consumeOneAndIterateRest(set) { + var iter = set.values(); + var first = iter.next(); + var rest = []; + for (var v of iter) rest.push(v); + return { first: first.value, rest }; +} +noInline(consumeOneAndIterateRest); + +for (var i = 0; i < testLoopCount; ++i) { + var set = new Set(); + for (var j = 0; j < 5; ++j) set.add(j * 10); + + var r = consumeOneAndIterateRest(set); + shouldBe(r.first, 0); + shouldBe(r.rest.join(','), '10,20,30,40'); +} + +// Add during iteration; new entries are visible. +function drainThenIterate() { + var set = new Set([1, 2, 3]); + var collected = []; + for (var v of set) { + collected.push(v); + if (v === 2) set.add(99); + if (v === 99) set.add(100); + } + return collected.join(','); +} +noInline(drainThenIterate); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(drainThenIterate(), '1,2,3,99,100'); + +// Delete during iteration; deleted entries that haven't been visited yet are skipped. +function deleteWhileIterating() { + var set = new Set([1, 2, 3, 4]); + var collected = []; + for (var v of set) { + collected.push(v); + if (v === 2) set.delete(3); + } + return collected.join(','); +} +noInline(deleteWhileIterating); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(deleteWhileIterating(), '1,2,4'); diff --git a/JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js b/JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js new file mode 100644 index 000000000000..1a60c06a5a3c --- /dev/null +++ b/JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js @@ -0,0 +1,44 @@ +// Replacing SetIterator.prototype.next fires setIteratorProtocolWatchpointSet. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(set) { + var sum = 0; + for (var v of set.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(set) { + var sum = 0; + for (var v of set) + sum += v; + return sum; +} +noInline(plain); + +var set = new Set(); +for (var i = 0; i < 10; ++i) + set.add(i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(set), 55); + shouldBe(plain(set), 55); +} + +// Replace SetIterator.prototype.next — fires the watchpoint. +var setIteratorPrototype = Object.getPrototypeOf((new Set()).values()); +var counter = 0; +setIteratorPrototype.next = function () { + counter++; + return counter <= 3 ? { value: 7, done: false } : { value: undefined, done: true }; +}; + +counter = 0; +shouldBe(values(set), 21); +counter = 0; +shouldBe(plain(set), 21); diff --git a/JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js b/JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js new file mode 100644 index 000000000000..82197e71a7c7 --- /dev/null +++ b/JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js @@ -0,0 +1,49 @@ +// Replacing Set.prototype[Symbol.iterator] fires setIteratorProtocolWatchpointSet. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +function values(set) { + var sum = 0; + for (var v of set.values()) + sum += v; + return sum; +} +noInline(values); + +function plain(set) { + var sum = 0; + for (var v of set) + sum += v; + return sum; +} +noInline(plain); + +var set = new Set(); +for (var i = 0; i < 10; ++i) + set.add(i + 1); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(values(set), 55); + shouldBe(plain(set), 55); +} + +// Replace Set.prototype[Symbol.iterator]; for-of set now goes through this. +Set.prototype[Symbol.iterator] = function () { + var arr = []; + for (var v of this.values()) arr.push(v * 10); + var idx = 0; + return { + next() { + return idx < arr.length ? { value: arr[idx++], done: false } : { value: undefined, done: true }; + } + }; +}; + +// `for (var v of set)` now: v*10 each, expected sum = 550. +shouldBe(plain(set), 550); + +// `set.values()` is unaffected. +shouldBe(values(set), 55); diff --git a/JSTests/stress/stack-overflow-regexp.js b/JSTests/stress/stack-overflow-regexp.js index c8bccff65891..7ef0d3117820 100644 --- a/JSTests/stress/stack-overflow-regexp.js +++ b/JSTests/stress/stack-overflow-regexp.js @@ -7,9 +7,9 @@ function testDeepNesting() { try { new RegExp(Array(520000).join("(") + "a" + Array(520000).join(")")); } catch (e) { - if (e instanceof RangeError) + if (e instanceof SyntaxError || e instanceof RangeError) return; - throw new Error("Expected RangeError, got " + e); + throw new Error("Expected SyntaxError or RangeError, got " + e); } // With certain stack configurations the pattern may fit; that's OK. } diff --git a/JSTests/stress/string-at-cse-array-mode.js b/JSTests/stress/string-at-cse-array-mode.js new file mode 100644 index 000000000000..185cf8195d30 --- /dev/null +++ b/JSTests/stress/string-at-cse-array-mode.js @@ -0,0 +1,11 @@ +//@ runDefault("--jitPolicyScale=0.1") + +function opt(s, i) { + let a = s.at(i); + let b = s.at(i); + return `${a}_${b}_end`; +} +noInline(opt); + +for (let j = 0; j < 20000; j++) opt("hello", 1); +for (let j = 0; j < 200; j++) opt("hello", 100); diff --git a/JSTests/stress/string-from-code-point-intrinsic.js b/JSTests/stress/string-from-code-point-intrinsic.js new file mode 100644 index 000000000000..7af0881edad8 --- /dev/null +++ b/JSTests/stress/string-from-code-point-intrinsic.js @@ -0,0 +1,111 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual} (expected ${expected})`); +} + +function shouldThrow(func, errorType) { + let error; + try { + func(); + } catch (e) { + error = e; + } + if (!error) + throw new Error("Expected an error to be thrown"); + if (!(error instanceof errorType)) + throw new Error(`Expected ${errorType.name} but got ${error.name}: ${error.message}`); +} + +// Latin1 small string range. +function fromCodePointLatin1(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointLatin1); + +for (let i = 0; i < testLoopCount; ++i) { + shouldBe(fromCodePointLatin1(0), "\0"); + shouldBe(fromCodePointLatin1(0x41), "A"); + shouldBe(fromCodePointLatin1(0xFF), "ÿ"); +} + +// BMP non-Latin1 range: still single UTF-16 unit, but not a small string. +function fromCodePointBMP(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointBMP); + +for (let i = 0; i < testLoopCount; ++i) { + shouldBe(fromCodePointBMP(0x100), "Ā"); + shouldBe(fromCodePointBMP(0x3042), "あ"); + shouldBe(fromCodePointBMP(0xFFFF), "￿"); +} + +// Supplementary plane: surrogate pair. +function fromCodePointSupplementary(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointSupplementary); + +for (let i = 0; i < testLoopCount; ++i) { + shouldBe(fromCodePointSupplementary(0x10000), "𐀀"); + shouldBe(fromCodePointSupplementary(0x1F600), "😀"); + shouldBe(fromCodePointSupplementary(0x10FFFF), "􏿿"); +} + +// Out-of-range RangeError after warm-up with valid Int32 inputs. +function fromCodePointMaybeThrows(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointMaybeThrows); + +for (let i = 0; i < testLoopCount; ++i) + shouldBe(fromCodePointMaybeThrows(0x42), "B"); +shouldThrow(() => fromCodePointMaybeThrows(-1), RangeError); +shouldThrow(() => fromCodePointMaybeThrows(0x110000), RangeError); +shouldThrow(() => fromCodePointMaybeThrows(0x7FFFFFFF), RangeError); + +// Untyped (double) inputs after warm-up. +function fromCodePointDouble(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointDouble); + +for (let i = 0; i < testLoopCount; ++i) + shouldBe(fromCodePointDouble(0x41 + 0.0), "A"); +shouldBe(fromCodePointDouble(0x10000 + 0.0), "𐀀"); +shouldThrow(() => fromCodePointDouble(0.5), RangeError); +shouldThrow(() => fromCodePointDouble(NaN), RangeError); +shouldThrow(() => fromCodePointDouble(Infinity), RangeError); +shouldThrow(() => fromCodePointDouble(-1.0), RangeError); + +// Untyped object input that triggers valueOf side effects. +function fromCodePointObject(cp) { + return String.fromCodePoint(cp); +} +noInline(fromCodePointObject); + +let valueOfCalls = 0; +const obj = { valueOf() { ++valueOfCalls; return 0x43; } }; +for (let i = 0; i < testLoopCount; ++i) + shouldBe(fromCodePointObject(obj), "C"); +shouldBe(valueOfCalls, testLoopCount); + +// Multi-argument form must still go through the host function. +function fromCodePointMulti(a, b, c) { + return String.fromCodePoint(a, b, c); +} +noInline(fromCodePointMulti); + +for (let i = 0; i < testLoopCount; ++i) + shouldBe(fromCodePointMulti(0x41, 0x42, 0x43), "ABC"); + +// Result-unused call must still throw RangeError (cannot be DCE'd) even with Int32 input. +function fromCodePointDead(cp) { + String.fromCodePoint(cp); + return cp; +} +noInline(fromCodePointDead); + +for (let i = 0; i < testLoopCount; ++i) + shouldBe(fromCodePointDead(0x41), 0x41); +shouldThrow(() => fromCodePointDead(0x110000), RangeError); diff --git a/JSTests/stress/string-from-code-point-out-of-range.js b/JSTests/stress/string-from-code-point-out-of-range.js new file mode 100644 index 000000000000..eb6df8108d43 --- /dev/null +++ b/JSTests/stress/string-from-code-point-out-of-range.js @@ -0,0 +1,28 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}, expected ${expected}`); +} + +function shouldThrowRangeError(func) { + let threw = false; + try { + func(); + } catch (error) { + threw = true; + if (!(error instanceof RangeError)) + throw new Error(`bad error: ${error}`); + } + if (!threw) + throw new Error("did not throw"); +} + +const invalidCodePoints = [-1, -0.5, 0.5, NaN, Infinity, -Infinity, 0x110000, 4294967296, 4294967296 + 65, 1e100, -1e100, 65.5]; +for (const codePoint of invalidCodePoints) { + shouldThrowRangeError(() => String.fromCodePoint(codePoint)); + shouldThrowRangeError(() => String.fromCodePoint(65, codePoint)); +} + +shouldBe(String.fromCodePoint(0), "\0"); +shouldBe(String.fromCodePoint(-0), "\0"); +shouldBe(String.fromCodePoint(65), "A"); +shouldBe(String.fromCodePoint(0x10FFFF).codePointAt(0), 0x10FFFF); diff --git a/JSTests/stress/string-iterator-fast-path.js b/JSTests/stress/string-iterator-fast-path.js new file mode 100644 index 000000000000..34aa6b053530 --- /dev/null +++ b/JSTests/stress/string-iterator-fast-path.js @@ -0,0 +1,119 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function sumCodePoints(string) { + var result = 0; + for (var character of string) + result += character.codePointAt(0); + return result; +} +noInline(sumCodePoints); + +function collect(string) { + var result = []; + for (var character of string) + result.push(character); + return result; +} +noInline(collect); + +function firstChar(string) { + for (var character of string) + return character; + return null; +} +noInline(firstChar); + +var ascii = "Hello, World!"; +var unicode = "a\u{20BB7}b野家\u{1F600}x"; +var lonely = "a\uD842b\uDFB7c\uD842"; + +var expectedAscii = sumCodePoints(ascii); +var expectedUnicode = sumCodePoints(unicode); +var expectedLonely = sumCodePoints(lonely); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(sumCodePoints(ascii), expectedAscii); + shouldBe(sumCodePoints(unicode), expectedUnicode); + shouldBe(sumCodePoints(lonely), expectedLonely); + shouldBe(firstChar("\u{20BB7}野"), "\u{20BB7}"); + shouldBe(firstChar(""), null); +} + +shouldBe(collect(unicode).join("|"), "a|\u{20BB7}|b|野|家|\u{1F600}|x"); +shouldBe(collect(lonely).join("|"), "a|\uD842|b|\uDFB7|c|\uD842"); +shouldBe(collect("").length, 0); + +// Mixed iterables on the same for-of site. +function countValues(iterable) { + var count = 0; + for (var value of iterable) + count++; + return count; +} +noInline(countValues); + +for (var i = 0; i < testLoopCount; ++i) { + shouldBe(countValues("abc"), 3); + shouldBe(countValues([1, 2, 3, 4]), 4); + shouldBe(countValues(new Set([1, 2])), 2); + shouldBe(countValues("\u{20BB7}野家"), 3); +} + +// Exercise the fast path's 8-bit-inline vs 16-bit/rope/surrogate-slow-path split. +function makeRope(a, b) { return a + b + ""; } +noInline(makeRope); + +for (var i = 0; i < testLoopCount; ++i) { + // 8-bit high-latin1 (incl. NUL) take the inline single-character path. + shouldBe(collect("caféÿ\x00").join("|"), "c|a|f|é|ÿ|\x00"); + // 16-bit non-surrogate goes through the slow path. + shouldBe(collect("野家あ").join("|"), "野|家|あ"); + // Surrogate pair at the end / start, and two adjacent pairs. + shouldBe(collect("ab\u{1F600}").join("|"), "a|b|\u{1F600}"); + shouldBe(collect("\u{20BB7}xy").join("|"), "\u{20BB7}|x|y"); + shouldBe(collect("\u{1F600}\u{1F601}").join("|"), "\u{1F600}|\u{1F601}"); + // Lone lead surrogate at the very end (no following code unit to read). + shouldBe(collect("ab\uD842").join("|"), "a|b|\uD842"); + // Ropes resolve in the slow path. + shouldBe(collect(makeRope("ab", "cd")).join("|"), "a|b|c|d"); + shouldBe(collect(makeRope("x", "\u{1F600}")).join("|"), "x|\u{1F600}"); + shouldBe(countValues(makeRope("hello ", "world")), 11); +} + +// Manual next() after exhaustion must stay spec-correct ({ value: undefined, done: true }). +function exhaustManually() { + var it = "a\u{1F600}"[Symbol.iterator](); + shouldBe(it.next().value, "a"); + shouldBe(it.next().value, "\u{1F600}"); + var d = it.next(); + shouldBe(d.done, true); + shouldBe(d.value, undefined); + shouldBe(it.next().done, true); +} +noInline(exhaustManually); +for (var i = 0; i < testLoopCount; ++i) + exhaustManually(); + +// Breaking the protocol must fall back to generic mode. +function joinChars(string) { + var result = []; + for (var character of string) + result.push(character); + return result.join(""); +} +noInline(joinChars); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(joinChars("a\u{20BB7}b"), "a\u{20BB7}b"); + +var calledCustom = 0; +String.prototype[Symbol.iterator] = function* () { + calledCustom++; + yield "x"; + yield "y"; +}; +shouldBe(joinChars("a\u{20BB7}b"), "xy"); +shouldBe(calledCustom, 1); diff --git a/JSTests/stress/string-iterator-surrogate-pairs.js b/JSTests/stress/string-iterator-surrogate-pairs.js new file mode 100644 index 000000000000..bd097b0641a5 --- /dev/null +++ b/JSTests/stress/string-iterator-surrogate-pairs.js @@ -0,0 +1,155 @@ +function assert(condition, message) { + if (!condition) + throw new Error(message); +} + +// Independent reference: step through the string using codePointAt and slice with substring. +function referenceSegments(s) { + var r = []; + var i = 0; + while (i < s.length) { + var cp = s.codePointAt(i); + var len = cp > 0xFFFF ? 2 : 1; + r.push(s.substring(i, i + len)); + i += len; + } + return r; +} +noInline(referenceSegments); + +function forOfSegments(s) { + var r = []; + for (var c of s) + r.push(c); + return r; +} +noInline(forOfSegments); + +function manualSegments(s) { + var it = s[Symbol.iterator](); + var r = []; + for (;;) { + var n = it.next(); + if (n.done) + break; + r.push(n.value); + } + return r; +} +noInline(manualSegments); + +function dump(s) { + var u = []; + for (var i = 0; i < s.length; ++i) + u.push(s.charCodeAt(i).toString(16)); + return u.join(" "); +} + +function check(s) { + var ref = referenceSegments(s); + var got = forOfSegments(s); + assert(got.length === ref.length, "for-of segment count mismatch for [" + dump(s) + "]: " + got.length + " vs " + ref.length); + for (var i = 0; i < ref.length; i++) + assert(got[i] === ref[i], "for-of segment " + i + " mismatch for [" + dump(s) + "]: [" + dump(got[i]) + "] vs [" + dump(ref[i]) + "]"); + assert(got.join("") === s, "for-of join mismatch for [" + dump(s) + "]"); + + var man = manualSegments(s); + assert(man.length === ref.length, "manual next() segment count mismatch for [" + dump(s) + "]"); + for (var i = 0; i < ref.length; i++) + assert(man[i] === ref[i], "manual next() segment " + i + " mismatch for [" + dump(s) + "]"); + assert(man.join("") === s, "manual next() join mismatch for [" + dump(s) + "]"); +} + +// Hard-coded expectations for the canonical surrogate cases. +function checkExact(s, expected) { + var got = forOfSegments(s); + assert(got.length === expected.length, "exact count mismatch for [" + dump(s) + "]"); + for (var i = 0; i < expected.length; i++) + assert(got[i] === expected[i], "exact segment " + i + " mismatch for [" + dump(s) + "]"); + check(s); +} + +function runExactCases() { + checkExact("", []); + checkExact("a", ["a"]); + checkExact("𠮷", ["𠮷"]); + checkExact("a𠮷", ["a", "𠮷"]); + checkExact("𠮷a", ["𠮷", "a"]); + checkExact("\uD842", ["\uD842"]); + checkExact("a\uD842", ["a", "\uD842"]); + checkExact("\uD842x", ["\uD842", "x"]); + checkExact("\uD842\uD842", ["\uD842", "\uD842"]); + checkExact("\uD842𠮷", ["\uD842", "𠮷"]); + checkExact("\uDFB7", ["\uDFB7"]); + checkExact("\uDFB7x", ["\uDFB7", "x"]); + checkExact("\uDFB7\uD842", ["\uDFB7", "\uD842"]); + checkExact("\uDC00\uDC00", ["\uDC00", "\uDC00"]); + checkExact("\u{10000}", ["\u{10000}"]); + checkExact("\u{10FFFF}", ["\u{10FFFF}"]); + checkExact("\uD7FF\uDC00", ["\uD7FF", "\uDC00"]); + checkExact("\uDC00\uD800", ["\uDC00", "\uD800"]); + checkExact("\uE000\uDFFF", ["\uE000", "\uDFFF"]); +} +noInline(runExactCases); + +// All 1 / 2 / 3 length combinations of the interesting boundary code units. +var units = [0x0041, 0x00FF, 0x0100, 0xD7FF, 0xD800, 0xDBFF, 0xDC00, 0xDFFF, 0xE000, 0xFFFF]; +function runBoundaryCombinations() { + for (var a = 0; a < units.length; ++a) { + check(String.fromCharCode(units[a])); + for (var b = 0; b < units.length; ++b) { + check(String.fromCharCode(units[a], units[b])); + for (var c = 0; c < units.length; ++c) + check(String.fromCharCode(units[a], units[b], units[c])); + } + } +} +noInline(runBoundaryCombinations); + +// Deterministic pseudo-random strings mixing ASCII / Latin-1 / BMP / lone and paired surrogates. +var seed = 42; +function rnd(n) { + seed = (seed * 1103515245 + 12345) & 0x7fffffff; + return seed % n; +} +function randomUnit() { + var k = rnd(10); + if (k < 4) return 0x20 + rnd(0x60); + if (k < 6) return rnd(0x100); + if (k < 8) return rnd(0x10000); + if (k < 9) return 0xD800 + rnd(0x400); + return 0xDC00 + rnd(0x400); +} +function runRandomStrings() { + for (var iteration = 0; iteration < 500; ++iteration) { + var len = rnd(30); + var arr = []; + for (var i = 0; i < len; ++i) + arr.push(randomUnit()); + check(String.fromCharCode.apply(null, arr)); + } + for (var iteration = 0; iteration < 50; ++iteration) { + var rope = "abc" + "\u{20BB7}".repeat(1 + rnd(5)) + String.fromCharCode(0xD800 + rnd(0x400)) + "xyz".repeat(rnd(3)); + check(rope); + check(rope.substring(1, rope.length - 1)); + } +} +noInline(runRandomStrings); + +runExactCases(); +runBoundaryCombinations(); +runRandomStrings(); + +// Keep iterating a fixed surrogate-heavy set so the for-of site tiers up with surrogate pairs +// flowing through the optimized code, verifying every iteration. +var hot = [ + "\u{1F600}\u{1F601}\u{1F602}\u{1F603}", + "a\uD800b\uDC00c\u{10000}", + "\u{20BB7}野家\u{29E3D}", + "\uD800\uD800\uD800\uD800\uD800", + "\uDC00\uDC00\uDC00\uDC00\uDC00", + ("ab\u{20BB7}").repeat(20), +]; +for (var i = 0; i < testLoopCount; ++i) + check(hot[i % hot.length]); +runExactCases(); diff --git a/JSTests/stress/string-prototype-matchall-edge-cases.js b/JSTests/stress/string-prototype-matchall-edge-cases.js new file mode 100644 index 000000000000..88abef76fb73 --- /dev/null +++ b/JSTests/stress/string-prototype-matchall-edge-cases.js @@ -0,0 +1,196 @@ +// Exercises edge cases of String.prototype.matchAll across LLInt/Baseline/DFG/FTL tiers. +// Mirrors string-prototype-match-edge-cases.js, adapted for matchAll's spec semantics +// (mandatory "g" flag, returns an iterator, dispatches via @@matchAll). + +function shouldBe(actual, expected) { + var a = JSON.stringify(actual); + var e = JSON.stringify(expected); + if (a !== e) + throw new Error("expected " + e + " but got " + a); +} + +function shouldThrow(fn, expectedMessage) { + var threw = false; + try { + fn(); + } catch (e) { + threw = true; + if (expectedMessage && String(e).indexOf(expectedMessage) === -1) + throw new Error("expected error message to contain " + JSON.stringify(expectedMessage) + " but got " + JSON.stringify(String(e))); + } + if (!threw) + throw new Error("expected exception but none was thrown"); +} + +function arrFromIter(it) { + return [...it].map(m => [...m]); +} + +// ----- |this| coercion ----- +shouldBe(arrFromIter("abc1".matchAll(/[0-9]/g)), [["1"]]); +shouldBe(arrFromIter(String.prototype.matchAll.call(12345, /[0-9]/g)), [["1"], ["2"], ["3"], ["4"], ["5"]]); +shouldBe(arrFromIter(String.prototype.matchAll.call(true, /[a-z]/g)), [["t"], ["r"], ["u"], ["e"]]); +shouldBe(arrFromIter(String.prototype.matchAll.call({ toString() { return "obj1"; } }, /[0-9]/g)), [["1"]]); +shouldThrow(() => String.prototype.matchAll.call(null, /a/g), "TypeError"); +shouldThrow(() => String.prototype.matchAll.call(undefined, /a/g), "TypeError"); + +// ----- non-global regexp argument throws ----- +shouldThrow(() => "abc".matchAll(/a/), "TypeError"); +shouldThrow(() => "abc".matchAll(/a/i), "TypeError"); +shouldThrow(() => "abc".matchAll(/a/y), "TypeError"); + +// ----- regexp argument types (non-RegExp -> RegExpCreate(arg, "g")) ----- +shouldBe(arrFromIter("abc".matchAll()), [[""], [""], [""], [""]]); // /(?:)/g +shouldBe(arrFromIter("abc".matchAll(undefined)), [[""], [""], [""], [""]]); +shouldBe(arrFromIter("anull".matchAll(null)), [["null"]]); +shouldBe(arrFromIter("a123b".matchAll(123)), [["123"]]); +shouldBe(arrFromIter("xtruey".matchAll(true)), [["true"]]); +shouldBe(arrFromIter("abc1def2".matchAll("[0-9]")), [["1"], ["2"]]); +shouldBe(arrFromIter("aaa".matchAll("a+")), [["aaa"]]); + +// invalid regexp pattern from string -> SyntaxError +shouldThrow(() => "abc".matchAll("["), "SyntaxError"); +shouldThrow(() => "abc".matchAll("(?"), "SyntaxError"); + +// Symbol cannot be coerced to a string when constructing the regexp. +shouldThrow(() => "abc".matchAll(Symbol("s")), "TypeError"); + +// ----- flag combinations (must include "g") ----- +shouldBe(arrFromIter("abc1def2ghi3".matchAll(/[0-9]/g)), [["1"], ["2"], ["3"]]); +shouldBe(arrFromIter("ABC".matchAll(/abc/gi)), [["ABC"]]); +shouldBe(arrFromIter("a\nb".matchAll(/^./gm)), [["a"], ["b"]]); +shouldBe(arrFromIter("a\u{1F600}b".matchAll(/./gu)), [["a"], ["\u{1F600}"], ["b"]]); +shouldBe(arrFromIter("a\u{1F600}b".matchAll(/./gv)), [["a"], ["\u{1F600}"], ["b"]]); + +// Capture groups +{ + var arr = arrFromIter("abcd".matchAll(/(.)(.)/g)); + shouldBe(arr, [["ab", "a", "b"], ["cd", "c", "d"]]); +} +{ + var [m] = "ab".matchAll(/(?a)(?b)/g); + shouldBe(m.groups, { x: "a", y: "b" }); +} + +// ----- lastIndex behavior ----- +{ + // matchAll preserves the source RegExp's lastIndex by copying onto a new matcher. + var g = /[0-9]/g; + g.lastIndex = 3; + shouldBe(arrFromIter("a1b2c3".matchAll(g)), [["2"], ["3"]]); + // The original's lastIndex must not have been mutated by matchAll. + shouldBe(g.lastIndex, 3); +} +{ + // Non-numeric lastIndex: fast path bails and the spec path kicks in. + var g2 = /[0-9]/g; + g2.lastIndex = { valueOf() { return 0; } }; + shouldBe(arrFromIter("a1b2".matchAll(g2)), [["1"], ["2"]]); +} + +// ----- per-instance @@matchAll override on a RegExp ----- +{ + var re = /a/g; + re[Symbol.matchAll] = function (s) { return ["instance-override:" + s]; }; + shouldBe("hello".matchAll(re), ["instance-override:hello"]); +} +// per-instance @@matchAll deleted -> falls back to RegExp.prototype[@@matchAll]. +{ + var re2 = /a/g; + re2[Symbol.matchAll] = undefined; + // GetMethod returns undefined -> falls through to step 3-5: ToString(this) + RegExpCreate(re2, "g"). + // re2.toString() yields "/a/g" so the constructed regexp is /\/a\/g/g, no match in "hello". + shouldBe(arrFromIter("hello".matchAll(re2)), []); + shouldBe(arrFromIter("/a/g/a/g".matchAll(re2)), [["/a/g"], ["/a/g"]]); +} +{ + var re3 = /a/g; + re3[Symbol.matchAll] = "not callable"; + shouldThrow(() => "abc".matchAll(re3), "TypeError"); +} + +// ----- @@matchAll on a plain object (custom matcher) ----- +{ + // Non-RegExp object: IsRegExp returns false (no @@match, no [[RegExpMatcher]]). + // Thus the flags check is skipped, and @@matchAll is invoked directly. + var obj = { [Symbol.matchAll](s) { return [s, "custom"]; } }; + shouldBe("hello".matchAll(obj), ["hello", "custom"]); +} +{ + var obj2 = { [Symbol.matchAll]: 42 }; + shouldThrow(() => "hello".matchAll(obj2), "TypeError"); +} +// @@matchAll getter side effects. +{ + var log = []; + var obj3 = { + get [Symbol.matchAll]() { + log.push("get @@matchAll"); + return function (s) { log.push("call @@matchAll"); return [s]; }; + } + }; + shouldBe("hi".matchAll(obj3), ["hi"]); + shouldBe(log, ["get @@matchAll", "call @@matchAll"]); +} + +// ----- Custom @@match makes IsRegExp return true; flags check then runs. ----- +{ + var fakeRegExp = { + [Symbol.match]: true, + get flags() { return "g"; }, + [Symbol.matchAll](s) { return ["fake:" + s]; }, + }; + shouldBe("xyz".matchAll(fakeRegExp), ["fake:xyz"]); +} +{ + var fakeNonGlobal = { + [Symbol.match]: true, + get flags() { return ""; }, + [Symbol.matchAll](s) { return ["fake:" + s]; }, + }; + shouldThrow(() => "xyz".matchAll(fakeNonGlobal), "TypeError"); +} + +// ----- Subclassed RegExp ----- +{ + class MyRegExp extends RegExp { } + var mr = new MyRegExp("[0-9]", "g"); + shouldBe(arrFromIter("a1b2c3".matchAll(mr)), [["1"], ["2"], ["3"]]); +} +{ + class MyRegExp2 extends RegExp { + [Symbol.matchAll](s) { return ["subclass:" + s]; } + } + var mr2 = new MyRegExp2("a", "g"); + shouldBe("hello".matchAll(mr2), ["subclass:hello"]); +} + +// ----- iterator protocol ----- +{ + var iter = "abc".matchAll(/./g); + shouldBe(typeof iter[Symbol.iterator], "function"); + shouldBe(iter[Symbol.iterator]() === iter, true); +} +{ + var iter = "ab".matchAll(/./g); + shouldBe(iter.next().value[0], "a"); + shouldBe(iter.next().value[0], "b"); + shouldBe(iter.next().done, true); +} + +// ----- empty-string regex iterates by codepoint position ----- +{ + shouldBe(arrFromIter("ab".matchAll(/(?:)/g)), [[""], [""], [""]]); + shouldBe(arrFromIter("a\u{1F600}b".matchAll(/(?:)/gu)), [[""], [""], [""], [""]]); +} + +// ----- matched index / input ----- +{ + var [m1, m2] = "abc1def2".matchAll(/[0-9]/g); + shouldBe(m1.index, 3); + shouldBe(m1.input, "abc1def2"); + shouldBe(m2.index, 7); + shouldBe(m2.input, "abc1def2"); +} + +print("PASSED"); diff --git a/JSTests/stress/string-prototype-matchall-species-constructor.js b/JSTests/stress/string-prototype-matchall-species-constructor.js new file mode 100644 index 000000000000..31ce77773c67 --- /dev/null +++ b/JSTests/stress/string-prototype-matchall-species-constructor.js @@ -0,0 +1,64 @@ +// Verifies that String.prototype.matchAll and RegExp.prototype[@@matchAll] observe +// SpeciesConstructor(R, %RegExp%): a custom species constructor must be called, and a +// non-object RegExp.prototype.constructor must cause a TypeError, even after the C++ +// fast path has been warmed up. + +function shouldBe(actual, expected) { + var a = JSON.stringify(actual); + var e = JSON.stringify(expected); + if (a !== e) + throw new Error("expected " + e + " but got " + a); +} + +function shouldThrow(func, errorMessage) { + var error = null; + try { + func(); + } catch (e) { + error = e; + } + if (!error) + throw new Error("not thrown"); + if (String(error) !== errorMessage) + throw new Error("bad error: " + String(error)); +} + +function matchAllToArray(str, re) { + return [...str.matchAll(re)]; +} +noInline(matchAllToArray); + +for (var i = 0; i < testLoopCount; ++i) + shouldBe(matchAllToArray("a1b2", /[0-9]/g), [["1"], ["2"]]); + +// 1. A custom species constructor must be observed: its return value becomes the matcher. +(function () { + var calls = []; + var savedConstructor = RegExp.prototype.constructor; + RegExp.prototype.constructor = { + [Symbol.species]: function (re, flags) { + calls.push(flags); + return new RegExp("b", flags); + } + }; + try { + shouldBe(matchAllToArray("ab", /a/g), [["b"]]); + shouldBe(calls, ["g"]); + + calls.length = 0; + shouldBe([.../a/g[Symbol.matchAll]("ab")], [["b"]]); + shouldBe(calls, ["g"]); + } finally { + RegExp.prototype.constructor = savedConstructor; + } +})(); + +// 2. A non-object constructor must cause SpeciesConstructor to throw a TypeError. +(function () { + RegExp.prototype.constructor = 5; + shouldThrow(() => "x".matchAll(/y/g), "TypeError: |this|.constructor is not an Object or undefined"); + shouldThrow(() => /y/g[Symbol.matchAll]("x"), "TypeError: |this|.constructor is not an Object or undefined"); + // Primitive pattern: matchAll creates a fresh global RegExp internally, which still + // inherits the poisoned constructor. + shouldThrow(() => "x".matchAll("y"), "TypeError: |this|.constructor is not an Object or undefined"); +})(); diff --git a/JSTests/stress/string-prototype-matchall-tostring-once.js b/JSTests/stress/string-prototype-matchall-tostring-once.js new file mode 100644 index 000000000000..8e2a58ee38ce --- /dev/null +++ b/JSTests/stress/string-prototype-matchall-tostring-once.js @@ -0,0 +1,47 @@ +// Regression test: String.prototype.matchAll must call ToString(this) at most once, +// even when the user's toString invalidates the matchAll fast-path watchpoint mid-call, +// and must pass the original (un-ToString'd) thisValue to a user-defined @@matchAll. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`expected ${expected} but got ${actual}`); +} + +// Fast-path entry, watchpoint invalidates inside toString → fall back to primordial @@matchAll +// with the already-converted string. ToString(this) must run exactly once. +{ + let toStringCount = 0; + const receiver = { + toString() { + toStringCount++; + // No-op write that still invalidates regExpPrimordialPropertiesWatchpointSet. + RegExp.prototype.exec = RegExp.prototype.exec; + return "aabbaa"; + }, + }; + + const results = [...String.prototype.matchAll.call(receiver, /a+/g)]; + shouldBe(toStringCount, 1); + shouldBe(results.length, 2); + shouldBe(results[0][0], "aa"); + shouldBe(results[1][0], "aa"); +} + +// Spec compliance: when GetMethod(regexp, @@matchAll) returns a non-undefined matcher, +// String.prototype.matchAll passes the original thisValue (not a coerced string) to it. +{ + RegExp.prototype[Symbol.matchAll] = function(o) { + return { receivedThis: o }; + }; + + let toStringCount = 0; + const receiver = { + toString() { toStringCount++; return "should-not-be-called"; }, + }; + + const result = String.prototype.matchAll.call(receiver, /x/g); + shouldBe(toStringCount, 0); + shouldBe(result.receivedThis, receiver); + + delete RegExp.prototype[Symbol.matchAll]; +} diff --git a/JSTests/stress/string-prototype-matchall-tostring-recompiles-regexp.js b/JSTests/stress/string-prototype-matchall-tostring-recompiles-regexp.js new file mode 100644 index 000000000000..7d6b80830159 --- /dev/null +++ b/JSTests/stress/string-prototype-matchall-tostring-recompiles-regexp.js @@ -0,0 +1,44 @@ +// Regression test: when ToString(this) is observable and recompiles the regexp, +// String.prototype.matchAll's fast path must use the post-toString RegExp (and +// its flags), not the captured-before-toString one. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`expected ${expected} but got ${actual}`); +} + +function arrFromIter(iter) { + return [...iter].map(m => m[0]); +} + +// Recompile to a non-global pattern inside toString; the iterator must observe +// global=false and the new pattern. +{ + const re = /a/g; + const receiver = { toString() { re.compile("b", ""); return "abab"; } }; + const result = arrFromIter(String.prototype.matchAll.call(receiver, re)); + shouldBe(result.length, 1); + shouldBe(result[0], "b"); +} + +// Recompile to a global pattern with a different body; the iterator must use +// the new pattern and continue to be global. +{ + const re = /a/g; + const receiver = { toString() { re.compile("b", "g"); return "abab"; } }; + const result = arrFromIter(String.prototype.matchAll.call(receiver, re)); + shouldBe(result.length, 2); + shouldBe(result[0], "b"); + shouldBe(result[1], "b"); +} + +// Recompile to add the unicode flag; the iterator's fullUnicode bit must +// reflect the post-toString state. +{ + const re = /😀/g; + const receiver = { toString() { re.compile("\\ud83d\\ude00", "gu"); return "😀😀"; } }; + const result = arrFromIter(String.prototype.matchAll.call(receiver, re)); + shouldBe(result.length, 2); + shouldBe(result[0], "😀"); + shouldBe(result[1], "😀"); +} diff --git a/JSTests/stress/string-prototype-matchall-watchpoint-invalidation.js b/JSTests/stress/string-prototype-matchall-watchpoint-invalidation.js new file mode 100644 index 000000000000..c40281abe5f5 --- /dev/null +++ b/JSTests/stress/string-prototype-matchall-watchpoint-invalidation.js @@ -0,0 +1,174 @@ +// Verifies that String.prototype.matchAll honors dynamic mutations of @@matchAll-related +// state after DFG/FTL code has been compiled. Each test warms up the fast path, +// then invalidates one watchpoint or the per-instance state and confirms the +// override is observed. Mirrors string-prototype-match-watchpoint-invalidation.js. + +function shouldBe(actual, expected) { + var a = JSON.stringify(actual); + var e = JSON.stringify(expected); + if (a !== e) + throw new Error("expected " + e + " but got " + a); +} + +// 1. Per-instance @@matchAll override after warm-up. +(function () { + function matchAll(str, re) { return [...str.matchAll(re)]; } + noInline(matchAll); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(matchAll("a1b2", re), [["1"], ["2"]]); + re[Symbol.matchAll] = function (s) { return ["override:" + s]; }; + shouldBe(str_matchAll_via_get("a1b2", re), ["override:a1b2"]); +})(); + +function str_matchAll_via_get(str, re) { return str.matchAll(re); } +noInline(str_matchAll_via_get); + +// 2. RegExp.prototype[@@matchAll] replaced after warm-up. +(function () { + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe([...str_matchAll_via_get("a1b2", re)], [["1"], ["2"]]); + var saved = RegExp.prototype[Symbol.matchAll]; + RegExp.prototype[Symbol.matchAll] = function (s) { return ["proto:" + s]; }; + try { + shouldBe(str_matchAll_via_get("a1b2", re), ["proto:a1b2"]); + } finally { + RegExp.prototype[Symbol.matchAll] = saved; + } +})(); + +// 3. RegExp.prototype.exec replaced after warm-up. Per spec, the iterator pulls each +// match via R.exec(), so a custom exec must be observed at iteration time even when +// matchAll itself returned without seeing it. +(function () { + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe([...str_matchAll_via_get("a1b2", re)], [["1"], ["2"]]); + var saved = RegExp.prototype.exec; + var execCount = 0; + RegExp.prototype.exec = function (s) { + execCount++; + return saved.call(this, s); + }; + try { + shouldBe([...str_matchAll_via_get("a1b2", re)], [["1"], ["2"]]); + if (execCount === 0) + throw new Error("custom RegExp.prototype.exec must be observed by the iterator"); + } finally { + RegExp.prototype.exec = saved; + } +})(); + +// 4. String.prototype[@@matchAll] defined after warm-up with a primitive pattern. +// Per spec ("If regexp is not Object"), a primitive pattern argument does NOT trigger +// a GetMethod(@@matchAll) lookup, so a user-installed String.prototype[@@matchAll] +// is not observed for a primitive string pattern. +(function () { + function matchAll(str, pat) { return [...str.matchAll(pat)]; } + noInline(matchAll); + for (var i = 0; i < 1e4; ++i) + shouldBe(matchAll("a1b2", "[0-9]"), [["1"], ["2"]]); + Object.defineProperty(String.prototype, Symbol.matchAll, { + configurable: true, + value: function () { return ["string-proto"]; } + }); + try { + shouldBe(matchAll("a1b2", "[0-9]"), [["1"], ["2"]]); + // But a String *object* DOES go through @@matchAll on its prototype chain. + shouldBe("a1b2".matchAll(new String("[0-9]")), ["string-proto"]); + } finally { + delete String.prototype[Symbol.matchAll]; + } +})(); + +// 5. Setting non-numeric lastIndex after warm-up forces the watchpoint to invalidate. +(function () { + function matchAll(str, re) { return [...str.matchAll(re)]; } + noInline(matchAll); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(matchAll("a1b2", re), [["1"], ["2"]]); + re.lastIndex = { valueOf() { return 0; } }; + shouldBe(matchAll("a1b2", re), [["1"], ["2"]]); +})(); + +// 6. Reflect.setPrototypeOf to a non-RegExp prototype after warm-up. Unlike match, +// matchAll's spec requires a flags check before @@matchAll dispatch, so the custom +// proto must also expose flags containing "g". +(function () { + function matchAll(str, re) { return [...str.matchAll(re)]; } + noInline(matchAll); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(matchAll("a1b2", re), [["1"], ["2"]]); + var weird = /[0-9]/g; + Object.setPrototypeOf(weird, { + [Symbol.matchAll](s) { return ["weird:" + s]; }, + get flags() { return "g"; }, + }); + shouldBe(str_matchAll_via_get("a1b2", weird), ["weird:a1b2"]); + // The fast path must keep working for normal regexps after seeing one weird instance. + shouldBe(matchAll("a1b2", re), [["1"], ["2"]]); +})(); + +// 7. ToString(this) mutates the regexp instance (adds an own property) between +// the fast-path check and the iterator construction. The post-toString re-check +// must observe this and fall back to the primordial @@matchAll path. +(function () { + var re = /a/g; + var receiver = { + toString() { + // Adding an own property invalidates the fast path's hasCustomProperties() check. + re.foo = 42; + return "aabb"; + } + }; + shouldBe([...String.prototype.matchAll.call(receiver, re)], [["a"], ["a"]]); +})(); + +// 8. Mutating RegExp.prototype.exec inside ToString fires regExpPrimordialPropertiesWatchpointSet +// and the iterator must observe the user-installed exec. +(function () { + var re = /a/g; + var saved = RegExp.prototype.exec; + var execCalls = 0; + var receiver = { + toString() { + RegExp.prototype.exec = function (s) { + execCalls++; + return saved.call(this, s); + }; + return "aabb"; + } + }; + try { + var results = [...String.prototype.matchAll.call(receiver, re)]; + shouldBe(results, [["a"], ["a"]]); + if (execCalls === 0) + throw new Error("user-installed RegExp.prototype.exec must be observed"); + } finally { + RegExp.prototype.exec = saved; + } +})(); + +// 9. Replacing RegExp.prototype[@@matchAll] inside ToString must be observed: matcher dispatch +// is locked in BEFORE ToString in the spec, so the primordial @@matchAll runs even after +// invalidation. Since our fast path locks matcher = primordial pre-ToString, the linkTimeConstant +// fallback should still call the primordial, not the user's replacement. +(function () { + var re = /a/g; + var saved = RegExp.prototype[Symbol.matchAll]; + var receiver = { + toString() { + RegExp.prototype[Symbol.matchAll] = function () { return ["should-not-be-called"]; }; + return "aa"; + } + }; + try { + var results = [...String.prototype.matchAll.call(receiver, re)]; + shouldBe(results, [["a"], ["a"]]); + } finally { + RegExp.prototype[Symbol.matchAll] = saved; + } +})(); diff --git a/JSTests/stress/string-prototype-search-edge-cases.js b/JSTests/stress/string-prototype-search-edge-cases.js new file mode 100644 index 000000000000..e04dad26bbbd --- /dev/null +++ b/JSTests/stress/string-prototype-search-edge-cases.js @@ -0,0 +1,160 @@ +// Edge case coverage for the C++ implementation of String.prototype.search. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("expected " + expected + " but got " + actual); +} + +function shouldThrow(func, errorType) { + var threw = false; + try { + func(); + } catch (e) { + threw = e instanceof errorType; + } + if (!threw) + throw new Error("expected to throw " + errorType.name); +} + +// Basic behavior. +shouldBe("abc".search(/b/), 1); +shouldBe("abc".search(/x/), -1); +shouldBe("abc".search(/a/), 0); +shouldBe("".search(/x/), -1); +shouldBe("".search(/(?:)/), 0); +shouldBe("abc".search(new RegExp("c")), 2); + +// No argument / undefined / null arguments. +shouldBe("abc".search(), 0); // RegExpCreate(undefined) -> /(?:)/ +shouldBe("abc".search(undefined), 0); +shouldBe("abcnull".search(null), 3); // pattern is the string "null" + +// Primitive patterns are coerced through RegExpCreate. +shouldBe("a1b2".search("[0-9]"), 1); +shouldBe("a.c".search("."), 0); // "." is a regexp wildcard +shouldBe("abc123".search(123), 3); +shouldBe("abctrue".search(true), 3); + +// |this| coercion. +shouldBe(String.prototype.search.call(12345, /3/), 2); +shouldBe(String.prototype.search.call(true, /ru/), 1); +shouldThrow(() => String.prototype.search.call(null, /a/), TypeError); +shouldThrow(() => String.prototype.search.call(undefined, /a/), TypeError); +shouldThrow(() => "abc".search.call(undefined), TypeError); + +// |this| with a custom toString. +shouldBe(String.prototype.search.call({ toString() { return "xyz"; } }, /y/), 1); + +// Global flag and lastIndex are ignored: search always starts from index 0 and +// restores lastIndex. +{ + var re = /b/g; + re.lastIndex = 2; + shouldBe("abcabc".search(re), 1); + shouldBe(re.lastIndex, 2); +} +{ + var re = /b/y; + shouldBe("ba".search(re), 0); + shouldBe("ab".search(re), -1); + shouldBe(re.lastIndex, 0); +} + +// Non-writable lastIndex: resetting to 0 throws only when it is not already 0. +{ + var re = /b/; + re.lastIndex = 3; + Object.defineProperty(re, "lastIndex", { writable: false }); + shouldThrow(() => "abc".search(re), TypeError); + + var reZero = /b/; + Object.defineProperty(reZero, "lastIndex", { writable: false }); + shouldBe("abc".search(reZero), 1); +} + +// Custom @@search on a plain object. +shouldBe("abc".search({ [Symbol.search]() { return 42; } }), 42); + +// @@search receives the original |this| value, not a string. +{ + var receivedArg; + var searcher = { [Symbol.search](arg) { receivedArg = arg; return 7; } }; + var thisObject = { toString() { return "should-not-be-called-by-search"; } }; + shouldBe(String.prototype.search.call(thisObject, searcher), 7); + shouldBe(receivedArg, thisObject); +} + +// undefined / null @@search on an object falls back to RegExpCreate(ToString(object)). +shouldBe("xbcx".search({ [Symbol.search]: undefined, toString() { return "b"; } }), 1); +shouldBe("xbcx".search({ [Symbol.search]: null, toString() { return "c"; } }), 2); + +// Non-callable @@search throws. +shouldThrow(() => "abc".search({ [Symbol.search]: 1 }), TypeError); +shouldThrow(() => "abc".search({ [Symbol.search]: "x" }), TypeError); + +// Throwing @@search getter propagates. +shouldThrow(() => "abc".search({ get [Symbol.search]() { throw new TypeError("getter"); } }), TypeError); + +// RegExp subclasses without overrides behave like plain regexps. +{ + class MyRegExp extends RegExp { } + shouldBe("a1b2".search(new MyRegExp("[0-9]")), 1); +} + +// RegExp subclasses overriding @@search are observed. +{ + class MyRegExp2 extends RegExp { + [Symbol.search](str) { return "custom:" + str; } + } + shouldBe("a1b2".search(new MyRegExp2("[0-9]")), "custom:a1b2"); +} + +// RegExp subclasses overriding exec are observed through RegExp.prototype[@@search]. +{ + class MyRegExp3 extends RegExp { + exec() { return { index: 99 }; } + } + shouldBe("a1b2".search(new MyRegExp3("[0-9]")), 99); +} + +// A fake regexp-like object with only @@search. +{ + var fake = { + [Symbol.search](str) { return str.length; } + }; + shouldBe("hello".search(fake), 5); +} + +// Unicode handling: the result is a code unit index. +shouldBe("\u{20BB7}a".search(/a/), 2); +shouldBe("\u{20BB7}a".search(/\u{20BB7}/u), 0); +shouldBe("あいう".search(/う/), 2); + +// Rope strings. +{ + var left = "a".repeat(10); + var right = "1" + "b".repeat(10); + shouldBe((left + right).search(/[0-9]/), 10); +} + +// Captures and legacy RegExp statics still work through search. +{ + "abc1def".search(/([0-9])/); + shouldBe(RegExp.$1, "1"); + shouldBe(RegExp.lastMatch, "1"); +} + +// Function properties. +shouldBe(String.prototype.search.length, 1); +shouldBe(String.prototype.search.name, "search"); +shouldBe(typeof RegExp.prototype[Symbol.search], "function"); + +// Property attributes stay the same as before (writable, non-enumerable, configurable). +{ + var descriptor = Object.getOwnPropertyDescriptor(String.prototype, "search"); + shouldBe(descriptor.writable, true); + shouldBe(descriptor.enumerable, false); + shouldBe(descriptor.configurable, true); +} + +print("PASSED"); diff --git a/JSTests/stress/string-prototype-search-strength-reduction.js b/JSTests/stress/string-prototype-search-strength-reduction.js new file mode 100644 index 000000000000..cc2467d2218c --- /dev/null +++ b/JSTests/stress/string-prototype-search-strength-reduction.js @@ -0,0 +1,92 @@ +// Exercises the DFG path where a StringSearch node is converted to RegExpSearch +// in fixup and then further strength-reduced for known-flag literal RegExp +// arguments. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("expected " + expected + " but got " + actual); +} + +// Non-global literal: StringSearch -> RegExpSearch (strength-reduced for the literal). +function searchLiteral(str) { + return str.search(/[0-9]/); +} +noInline(searchLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(searchLiteral("a1b2c3"), 1); +shouldBe(searchLiteral("nope"), -1); + +// Global literal: search ignores the global flag and always starts from index 0. +function searchGlobalLiteral(str) { + return str.search(/[0-9]/g); +} +noInline(searchGlobalLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(searchGlobalLiteral("a1b2c3"), 1); +shouldBe(searchGlobalLiteral("nope"), -1); + +// Sticky literal: @@search resets lastIndex to 0, so sticky only matches at the start. +function searchStickyLiteral(str) { + return str.search(/[0-9]/y); +} +noInline(searchStickyLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(searchStickyLiteral("1abc"), 0); +shouldBe(searchStickyLiteral("a1bc"), -1); + +// Unicode literal exercising surrogate handling. +function searchUnicode(str) { + return str.search(/\u{1F600}/u); +} +noInline(searchUnicode); +for (var i = 0; i < 1e5; ++i) + shouldBe(searchUnicode("a\u{1F600}b"), 1); + +// Cached RegExp parameter: StringSearch -> RegExpSearch (no strength reduction +// since the regexp is not a constant). +function searchCached(str, re) { + return str.search(re); +} +noInline(searchCached); +var cached = /[0-9]/; +for (var i = 0; i < 1e5; ++i) + shouldBe(searchCached("a1b2c3", cached), 1); + +// Cached global RegExp with non-zero lastIndex: search always starts from 0 and +// must leave lastIndex untouched on the fast path. +var cachedGlobal = /[0-9]/g; +cachedGlobal.lastIndex = 5; +for (var i = 0; i < 1e5; ++i) { + shouldBe(searchCached("a1b2c3", cachedGlobal), 1); + shouldBe(cachedGlobal.lastIndex, 5); +} + +// String pattern: StringSearch with StringUse on child2. +function searchStringPattern(str, pat) { + return str.search(pat); +} +noInline(searchStringPattern); +for (var i = 0; i < 1e5; ++i) + shouldBe(searchStringPattern("a1b2c3", "[0-9]"), 1); + +// Mixed: function that sees both global and non-global regexps. +function searchPoly(str, re) { + return str.search(re); +} +noInline(searchPoly); +var g = /[0-9]/g; +var ng = /[0-9]/; +for (var i = 0; i < 1e5; ++i) { + shouldBe(searchPoly("a1b2c3", g), 1); + shouldBe(searchPoly("a1b2c3", ng), 1); +} + +// Legacy properties recorded after a search. +{ + "abc1def".search(/[0-9]/); + shouldBe(RegExp.lastMatch, "1"); + shouldBe(RegExp.leftContext, "abc"); + shouldBe(RegExp.rightContext, "def"); +} + +print("PASSED"); diff --git a/JSTests/stress/string-prototype-search-watchpoint-invalidation.js b/JSTests/stress/string-prototype-search-watchpoint-invalidation.js new file mode 100644 index 000000000000..367353d4bdb9 --- /dev/null +++ b/JSTests/stress/string-prototype-search-watchpoint-invalidation.js @@ -0,0 +1,189 @@ +// Verifies that String.prototype.search honors dynamic mutations of @@search-related +// state after DFG/FTL code has been compiled. Each test warms up the fast path, +// then invalidates one watchpoint or the per-instance state and confirms the +// override is observed. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("expected " + expected + " but got " + actual); +} + +// 1. Per-instance @@search override after JIT compilation with a primordial RegExp. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + re[Symbol.search] = function (s) { return "override:" + s; }; + shouldBe(search("a1b2c3", re), "override:a1b2c3"); +})(); + +// 2. RegExp.prototype[@@search] replaced after JIT compilation. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + var saved = RegExp.prototype[Symbol.search]; + RegExp.prototype[Symbol.search] = function (s) { return "proto:" + s; }; + try { + shouldBe(search("a1b2c3", re), "proto:a1b2c3"); + } finally { + RegExp.prototype[Symbol.search] = saved; + } +})(); + +// 3. RegExp.prototype.exec replaced after JIT compilation. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + var saved = RegExp.prototype.exec; + var execCount = 0; + RegExp.prototype.exec = function (s) { + execCount++; + return saved.call(this, s); + }; + try { + shouldBe(search("a1b2c3", re), 1); + if (execCount === 0) + throw new Error("custom RegExp.prototype.exec must be observed"); + } finally { + RegExp.prototype.exec = saved; + } +})(); + +// 4. String.prototype[@@search] defined after JIT compilation with a string regexp. +(function () { + function search(str, pat) { return str.search(pat); } + noInline(search); + for (var i = 0; i < 1e4; ++i) + shouldBe(search("abc1def2", "[0-9]"), 3); + // Per current spec ("2. If regexp is not Object"), a primitive pattern argument + // does NOT trigger a GetMethod(@@search) lookup, so a user-installed + // String.prototype[@@search] is not observed for a primitive string pattern. + Object.defineProperty(String.prototype, Symbol.search, { + configurable: true, + value: function () { return "string-proto"; } + }); + try { + shouldBe(search("abc1def2", "[0-9]"), 3); + // But a String *object* DOES go through @@search. + shouldBe("abc1def2".search(new String("[0-9]")), "string-proto"); + } finally { + delete String.prototype[Symbol.search]; + } +})(); + +// 5. Non-numeric lastIndex after JIT compilation. @@search never coerces lastIndex, +// so valueOf must not be observed and the result stays correct. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + var valueOfCount = 0; + re.lastIndex = { valueOf() { valueOfCount++; return 0; } }; + shouldBe(search("a1b2c3", re), 1); + shouldBe(valueOfCount, 0); +})(); + +// 6. Non-writable lastIndex after JIT compilation. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + // With lastIndex frozen at 0 and a non-global regexp, @@search performs no + // lastIndex writes and succeeds. + var frozenZero = /[0-9]/; + Object.defineProperty(frozenZero, "lastIndex", { writable: false }); + shouldBe(search("a1b2c3", frozenZero), 1); + // The original regexp keeps using the fast path. + shouldBe(search("a1b2c3", re), 1); +})(); + +// 7. Reflect.setPrototypeOf to a non-RegExp prototype after JIT compilation. +(function () { + function search(str, re) { return str.search(re); } + noInline(search); + var re = /[0-9]/; + for (var i = 0; i < 1e4; ++i) + shouldBe(search("a1b2c3", re), 1); + var weird = /[0-9]/; + Object.setPrototypeOf(weird, { + [Symbol.search](s) { return "weird:" + s; } + }); + shouldBe(search("a1b2c3", weird), "weird:a1b2c3"); + // The fast path must keep working for normal regexps after seeing one weird instance. + shouldBe(search("a1b2c3", re), 1); +})(); + +// 8. ToString(this) mutates the regexp instance between the fast-path check and +// the search engine. Per spec, RegExp.prototype[@@search] dispatches to +// RegExpExec(rx, S) *after* S = ToString(string), so the user-installed exec +// must be observed. +(function () { + var re = /a/; + var receiver = { + toString() { + re.exec = function () { return { index: 42 }; }; + return "abc"; + } + }; + shouldBe(String.prototype.search.call(receiver, re), 42); +})(); +(function () { + // Mutating RegExp.prototype.exec inside ToString fires regExpPrimordialPropertiesWatchpointSet. + var re = /a/; + var saved = RegExp.prototype.exec; + var receiver = { + toString() { + RegExp.prototype.exec = function () { return { index: 42 }; }; + return "abc"; + } + }; + try { + shouldBe(String.prototype.search.call(receiver, re), 42); + } finally { + RegExp.prototype.exec = saved; + } +})(); +(function () { + // Mutating lastIndex to a non-number inside ToString. + var re = /b/; + var receiver = { + toString() { + re.lastIndex = { valueOf() { return 0; } }; + return "abc"; + } + }; + shouldBe(String.prototype.search.call(receiver, re), 1); +})(); +(function () { + // Making lastIndex non-writable (and non-zero) inside ToString: the generic + // @@search path must throw when resetting lastIndex to 0. + var re = /b/; + re.lastIndex = 3; + var receiver = { + toString() { + Object.defineProperty(re, "lastIndex", { writable: false }); + return "abc"; + } + }; + var threw = false; + try { + String.prototype.search.call(receiver, re); + } catch (e) { + threw = e instanceof TypeError; + } + shouldBe(threw, true); +})(); + +print("PASSED"); diff --git a/JSTests/stress/temporal-calendar.js b/JSTests/stress/temporal-calendar.js index 04157ff5ab33..c0c12ba50d3a 100644 --- a/JSTests/stress/temporal-calendar.js +++ b/JSTests/stress/temporal-calendar.js @@ -1,10 +1,13 @@ //@ requireOptions("--useTemporal=1") +// FIXME: toLocaleString requires IntlDateTimeFormat Temporal support, implemented in the next patch. +//@ skip + function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`expected ${expected} but got ${actual}`); } -function shouldThrow(func, errorType, message) { +function shouldThrow(func, errorType) { let error; try { func(); @@ -14,137 +17,34 @@ function shouldThrow(func, errorType, message) { if (!(error instanceof errorType)) throw new Error(`Expected ${errorType.name}!`); - if (message !== undefined) - shouldBe(String(error), message); -} - -shouldBe(Temporal.Calendar instanceof Function, true); -shouldBe(Temporal.Calendar.length, 0); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.Calendar, 'prototype').writable, false); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.Calendar, 'prototype').enumerable, false); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.Calendar, 'prototype').configurable, false); -shouldBe(Temporal.Calendar.prototype.constructor, Temporal.Calendar); - -const isoCalendar = new Temporal.Calendar("iso8601"); -shouldBe(isoCalendar.id, `iso8601`); -shouldBe(String(isoCalendar), `iso8601`); - -{ - let calendar = new Temporal.Calendar("gregory"); - shouldBe(calendar.id, `gregory`); - shouldBe(String(calendar), `gregory`); } -shouldThrow(() => { - new Temporal.Calendar("discordian"); -}, RangeError, `RangeError: invalid calendar ID`); +// Stage 4: Temporal.Calendar constructor is removed +shouldThrow(() => { new Temporal.Calendar("iso8601"); }, TypeError); +shouldThrow(() => { Temporal.Calendar.from("iso8601"); }, TypeError); +// Calendar is accessed via calendarId string on Temporal types { - let input = ["monthCode", "day"]; - let fields = Temporal.Calendar.from("iso8601").fields(input); - shouldBe(input !== fields, true); - shouldBe(JSON.stringify(fields), `["monthCode","day"]`); -} -{ - let input = ["monthCode", "day"]; - let fields = Temporal.Calendar.from("gregory").fields(input); - shouldBe(input !== fields, true); - shouldBe(JSON.stringify(fields), `["monthCode","day"]`); + let pd = Temporal.PlainDate.from("2024-03-15"); + shouldBe(pd.calendarId, "iso8601"); } { - let input = ["monthCode", "day", "year"]; - let fields = Temporal.Calendar.from("iso8601").fields(input); - shouldBe(input !== fields, true); - shouldBe(JSON.stringify(fields), `["monthCode","day","year"]`); + let pd = Temporal.PlainDate.from("2024-03-15[u-ca=gregory]"); + shouldBe(pd.calendarId, "gregory"); } +// Calendar-aware arithmetic via PlainDate { - let input = ["monthCode", "day", "year"]; - let fields = Temporal.Calendar.from("gregory").fields(input); - shouldBe(input !== fields, true); - shouldBe(JSON.stringify(fields), `["monthCode","day","year","era","eraYear"]`); -} -{ - let merged = Temporal.Calendar.from('iso8601').mergeFields( - { year: 2006, month: 7, day: 31 }, - { monthCode: 'M08' } - ); - shouldBe(JSON.stringify(merged), `{"year":2006,"day":31,"monthCode":"M08"}`); -} -{ - let merged = Temporal.Calendar.from('gregory').mergeFields( - { year: 2006, month: 7, day: 31 }, - { monthCode: 'M08' } - ); - shouldBe(JSON.stringify(merged), `{"year":2006,"day":31,"monthCode":"M08"}`); + let date = Temporal.PlainDate.from("2020-02-28"); + shouldBe(date.add({ days: 1 }).toString(), "2020-02-29"); + shouldBe(date.add({ months: 1 }).toString(), "2020-03-28"); + shouldBe(date.add({ years: 1 }).toString(), "2021-02-28"); } +// dateUntil via PlainDate.until { - const user = { - id: 775, - username: 'robotcat', - password: 'hunter2', // Note: Don't really store passwords like that - userCalendar: Temporal.Calendar.from('gregory') - }; - let string = JSON.stringify(user); - shouldBe(string, `{"id":775,"username":"robotcat","password":"hunter2","userCalendar":"gregory"}`); - // To rebuild from the string: - function reviver(key, value) { - if (key.endsWith('Calendar')) - return Temporal.Calendar.from(value); - return value; - } - shouldBe(JSON.parse(string, reviver).userCalendar instanceof Temporal.Calendar, true); + let d1 = Temporal.PlainDate.from("2020-02-28"); + let d2 = Temporal.PlainDate.from("2021-02-28"); + shouldBe(d1.until(d2).toString(), "P366D"); + shouldBe(d1.until(d2, { largestUnit: "year" }).toString(), "P1Y"); } - -shouldBe(isoCalendar.toString(), isoCalendar.toJSON()); -shouldThrow(() => { Temporal.Calendar.prototype.toString.call({}); }, TypeError); -shouldThrow(() => { Temporal.Calendar.prototype.toJSON.call({}); }, TypeError); - -shouldBe(Temporal.Calendar.prototype.dateFromFields.length, 1); -shouldBe(isoCalendar.dateFromFields({ year: 2007, month: 1, day: 9 }).toString(), '2007-01-09'); -shouldBe(isoCalendar.dateFromFields({ year: 2007, monthCode: 'M01', day: 9 }).toString(), '2007-01-09'); -shouldBe(isoCalendar.dateFromFields({ year: 2007, month: 20, day: 40 }).toString(), '2007-12-31'); -shouldBe(isoCalendar.dateFromFields({ year: 2007, month: 20, day: 40 }, { overflow: 'constrain' }).toString(), '2007-12-31'); - -shouldThrow(() => { isoCalendar.dateFromFields(null); }, TypeError); -shouldThrow(() => { isoCalendar.dateFromFields({ month: 1, day: 9 }); }, TypeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, day: 9 }); }, TypeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, month: 1 }); }, TypeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: Infinity, month: 1, day: 9 }); }, RangeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, month: 0, day: 9 }); }, RangeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, monthCode: 'M00', day: 9 }); }, RangeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, month: 1, day: 0 }); }, RangeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, month: 1, monthCode: 'M02', day: 9 }); }, RangeError); -shouldThrow(() => { isoCalendar.dateFromFields({ year: 2007, month: 20, day: 40 }, { overflow: 'reject' }); }, RangeError); - -shouldBe(Temporal.Calendar.prototype.dateAdd.length, 2); -shouldBe(isoCalendar.dateAdd('2020-02-28', new Temporal.Duration()).toString(), '2020-02-28'); -shouldBe(isoCalendar.dateAdd('2020-02-28', { years: 1, months: 1 }).toString(), '2021-03-28'); -shouldBe(isoCalendar.dateAdd('2020-02-28', 'P1W1D').toString(), '2020-03-07'); -shouldBe(isoCalendar.dateAdd('2020-02-28', { hours: 24 }).toString(), '2020-02-29'); -shouldBe(isoCalendar.dateAdd('2020-02-28', { days: 36500000 }).toString(), '+101953-10-07'); -shouldBe(isoCalendar.dateAdd('2020-02-28', new Temporal.Duration(-1, -1, 0, -1)).toString(), '2019-01-27'); -shouldBe(isoCalendar.dateAdd('2020-01-30', { months: 1 }).toString(), '2020-02-29'); -shouldThrow(() => { isoCalendar.dateAdd('2020-01-30', { months: 1 }, { overflow: 'reject' }); }, RangeError); -shouldThrow(() => { isoCalendar.dateAdd('2020-02-28', { years: 300000 }); }, RangeError); - -shouldBe(isoCalendar.dateAdd('2020-02-28', { years: -1, months: -1 }).toString(), '2019-01-28'); -shouldBe(isoCalendar.dateAdd('2020-02-28', '-P1W1D').toString(), '2020-02-20'); -shouldBe(isoCalendar.dateAdd('2020-02-28', { hours: -24 }).toString(), '2020-02-27'); -shouldBe(isoCalendar.dateAdd('2020-02-28', { days: -36500000 }).toString(), '-097914-07-21'); -shouldBe(isoCalendar.dateAdd('2020-02-28', new Temporal.Duration(1, 1, 0, 1)).toString(), '2021-03-29'); -shouldBe(isoCalendar.dateAdd('2020-03-30', { months: -1 }).toString(), '2020-02-29'); -shouldThrow(() => { isoCalendar.dateAdd('2020-03-30', { months: -1 }, { overflow: 'reject' }); }, RangeError); -shouldThrow(() => { isoCalendar.dateAdd('2020-02-28', { years: -300000 }); }, RangeError); - -shouldBe(Temporal.Calendar.prototype.dateUntil.length, 2); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2019-02-28').toString(), '-P365D'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2019-02-28', { largestUnit: 'year' }).toString(), '-P1Y'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2021-02-28').toString(), 'P366D'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2021-02-28', { largestUnit: 'year' }).toString(), 'P1Y'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2020-04-28', { largestUnit: 'month' }).toString(), 'P2M'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2019-12-28', { largestUnit: 'month' }).toString(), '-P2M'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2020-03-15', { largestUnit: 'week' }).toString(), 'P2W2D'); -shouldBe(isoCalendar.dateUntil('2020-02-28', '2020-02-12', { largestUnit: 'week' }).toString(), '-P2W2D'); -shouldThrow(() => { isoCalendar.dateUntil('2020-02-28', '2019-02-28', { largestUnit: 'hour' }); }, RangeError); diff --git a/JSTests/stress/temporal-duration.js b/JSTests/stress/temporal-duration.js index 172e47bbe3bb..d8e8a98a271a 100644 --- a/JSTests/stress/temporal-duration.js +++ b/JSTests/stress/temporal-duration.js @@ -1,4 +1,6 @@ //@ requireOptions("--useTemporal=1") +// FIXME: toLocaleString requires IntlDateTimeFormat Temporal support, implemented in the next patch. +//@ skip function shouldBe(actual, expected) { if (actual !== expected) @@ -263,15 +265,14 @@ const negSubseconds = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -999, -999999, shouldBe(posSubseconds.total("seconds"), 2.998998999); shouldBe(negSubseconds.total("seconds"), -2.998998999); -// At present, toLocaleString has the same behavior as toJSON or argumentless toString. -for (const method of ['toString', 'toJSON', 'toLocaleString']) { +for (const method of ['toString', 'toJSON']) { shouldBe(Temporal.Duration.prototype[method].length, 0); shouldThrow(() => Temporal.Duration.prototype[method].call({}), TypeError); shouldBe(zero[method](), 'PT0S'); shouldBe(pos[method](), 'P1Y2M3W4DT5H6M7.00800901S'); shouldBe(neg[method](), '-P1Y2M3W4DT5H6M7.00800901S'); - + shouldBe(new Temporal.Duration(1,1,1,1)[method](), 'P1Y1M1W1D'); shouldBe(new Temporal.Duration(0,0,0,0,1,1,1)[method](), 'PT1H1M1S'); shouldBe(new Temporal.Duration(0,0,0,0,0,0,0,100)[method](), 'PT0.1S'); @@ -282,6 +283,9 @@ for (const method of ['toString', 'toJSON', 'toLocaleString']) { shouldBe(new Temporal.Duration(0,0,0,0,0,0,0,0,1,1001)[method](), 'PT0.000002001S'); shouldBe(new Temporal.Duration(0,0,0,0,0,0,1,1001,1001,1001)[method](), 'PT2.002002001S'); } +shouldBe(Temporal.Duration.prototype.toLocaleString.length, 0); +shouldThrow(() => Temporal.Duration.prototype.toLocaleString.call({}), TypeError); +shouldBe(typeof zero.toLocaleString(), 'string'); shouldBe(pos.toString({}), pos.toString()); diff --git a/JSTests/stress/temporal-plaindate.js b/JSTests/stress/temporal-plaindate.js index 6abe36126565..b409a48463eb 100644 --- a/JSTests/stress/temporal-plaindate.js +++ b/JSTests/stress/temporal-plaindate.js @@ -69,9 +69,9 @@ shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Etc/GMT-20]') shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[-01:00]')), `2007-01-09`); -shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[u-ca=japanese]')), `2007-01-09`); -shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[Europe/Brussels][u-ca=japanese]')), `2007-01-09`); -shouldBe(String(Temporal.PlainDate.from('2007-01-09[u-ca=japanese]')), `2007-01-09`); +shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[u-ca=japanese]')), `2007-01-09[u-ca=japanese]`); +shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[Europe/Brussels][u-ca=japanese]')), `2007-01-09[u-ca=japanese]`); +shouldBe(String(Temporal.PlainDate.from('2007-01-09[u-ca=japanese]')), `2007-01-09[u-ca=japanese]`); { let date = Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Europe/Brussels]'); shouldBe(date === Temporal.PlainDate.from(date), false); @@ -90,7 +90,7 @@ shouldBe(String(Temporal.PlainDate.from('2007-01-09[u-ca=japanese]')), `2007-01- shouldBe(Temporal.PlainDate.from({ year: 2007, month: 20, day: 40 }, { overflow: 'constrain' }).toString(), '2007-12-31'); shouldBe(date.toJSON(), date.toString()); - shouldBe(date.toLocaleString(), date.toString()); + shouldBe(typeof date.toLocaleString(), 'string'); } shouldThrow(() => { Temporal.PlainDate.from({ month: 1, day: 9 }); }, TypeError); @@ -148,9 +148,6 @@ let failures = [ "2007-01-09T03:24:30+01:00[-/_]", "2007-01-09T03:24:30+01:00[_/-]", "2007-01-09T03:24:30+01:00[CocoaCappuccinoMatcha]", - "2007-01-09T03:24:30+01:00[Etc/GMT+50]", - "2007-01-09T03:24:30+01:00[Etc/GMT+0]", - "2007-01-09T03:24:30+01:00[Etc/GMT0]", "2007-01-09T03:24:30+10:20:30.0123456789", "2007-01-09 03:24:30+01:00[Etc/GMT\u221201]", "2007-01-09 03:24:30+01:00[+02:00:00.0123456789]", @@ -318,7 +315,7 @@ for (let text of failures) { { let getterNames = [ - "calendar", + "calendarId", "year", "month", "monthCode", @@ -343,8 +340,11 @@ for (let text of failures) { shouldThrow(() => { Temporal.PlainDate.from('2007-01-09').valueOf(); }, TypeError); { - let time = Temporal.PlainDate.from('2007-01-09'); - shouldBe(JSON.stringify(time.getISOFields()), `{"calendar":"iso8601","isoDay":9,"isoMonth":1,"isoYear":2007}`); + let date = Temporal.PlainDate.from('2007-01-09'); + shouldBe(date.year, 2007); + shouldBe(date.month, 1); + shouldBe(date.day, 9); + shouldBe(date.calendarId, "iso8601"); } { diff --git a/JSTests/stress/temporal-plaindatetime.js b/JSTests/stress/temporal-plaindatetime.js index 558f2f05ca27..50b764a75a3f 100644 --- a/JSTests/stress/temporal-plaindatetime.js +++ b/JSTests/stress/temporal-plaindatetime.js @@ -60,8 +60,7 @@ fields.forEach((field, i) => { shouldBe(pdt[field], i + 1); }); -shouldBe(pdt.calendar instanceof Temporal.Calendar, true); -shouldBe(pdt.calendar.toString(), 'iso8601'); +shouldBe(pdt.calendarId, 'iso8601'); { const dateGetters = ['monthCode', 'dayOfWeek', 'dayOfYear', 'weekOfYear', 'daysInWeek', 'daysInMonth', 'daysInYear', 'monthsInYear', 'inLeapYear']; const results = ['M02', 6, 34, 5, 7, 28, 365, 12, false]; @@ -71,8 +70,15 @@ shouldBe(pdt.calendar.toString(), 'iso8601'); }); } -shouldBe(Temporal.PlainDateTime.prototype.getISOFields.length, 0); -shouldBe(JSON.stringify(pdt.getISOFields()), `{"calendar":"iso8601","isoDay":3,"isoHour":4,"isoMicrosecond":8,"isoMillisecond":7,"isoMinute":5,"isoMonth":2,"isoNanosecond":9,"isoSecond":6,"isoYear":1}`); +shouldBe(pdt.year, 1); +shouldBe(pdt.month, 2); +shouldBe(pdt.day, 3); +shouldBe(pdt.hour, 4); +shouldBe(pdt.minute, 5); +shouldBe(pdt.second, 6); +shouldBe(pdt.millisecond, 7); +shouldBe(pdt.microsecond, 8); +shouldBe(pdt.nanosecond, 9); shouldBe(Temporal.PlainDateTime.from.length, 1); shouldThrow(() => Temporal.PlainDateTime.from(), TypeError); @@ -166,9 +172,6 @@ const badStrings = [ "2007-01-09T03:24:30+01:00[-/_]", "2007-01-09T03:24:30+01:00[_/-]", "2007-01-09T03:24:30+01:00[CocoaCappuccinoMatcha]", - "2007-01-09T03:24:30+01:00[Etc/GMT+50]", - "2007-01-09T03:24:30+01:00[Etc/GMT+0]", - "2007-01-09T03:24:30+01:00[Etc/GMT0]", "2007-01-09T03:24:30+10:20:30.0123456789", "2007-01-09 03:24:30+01:00[Etc/GMT\u221201]", "2007-01-09 03:24:30+01:00[+02:00:00.0123456789]", @@ -197,13 +200,15 @@ shouldBe(Temporal.PlainDateTime.compare('2007-01-09T03:24', '2007-01-09'), 1); shouldBe(Temporal.PlainDateTime.compare('2007-01-09T03:24', '2007-01-09T03:24:00.007008009'), -1); shouldBe(Temporal.PlainDateTime.compare('2007-01-09T00:00', '2007-01-09'), 0); -// At present, toLocaleString has the same behavior as toJSON or argumentless toString. -for (const method of ['toString', 'toJSON', 'toLocaleString']) { +for (const method of ['toString', 'toJSON']) { shouldBe(Temporal.PlainDateTime.prototype[method].length, 0); shouldThrow(() => Temporal.PlainDateTime.prototype[method].call({}), TypeError); shouldBe(pdt[method](), '0001-02-03T04:05:06.007008009'); } +shouldBe(Temporal.PlainDateTime.prototype.toLocaleString.length, 0); +shouldThrow(() => Temporal.PlainDateTime.prototype.toLocaleString.call({}), TypeError); +shouldBe(typeof pdt.toLocaleString(), 'string'); shouldBe(pdt.toString({}), pdt.toString()); shouldThrow(() => pdt.toString({ smallestUnit: 'bogus' }), RangeError); diff --git a/JSTests/stress/temporal-plainmonthday.js b/JSTests/stress/temporal-plainmonthday.js index 70b22e68e0c9..52cad8c6de3d 100644 --- a/JSTests/stress/temporal-plainmonthday.js +++ b/JSTests/stress/temporal-plainmonthday.js @@ -41,7 +41,7 @@ const monthDay = new Temporal.PlainMonthDay(4, 29); { shouldBe(monthDay.toString(), '04-29'); shouldBe(monthDay.toJSON(), monthDay.toString()); - shouldBe(monthDay.toLocaleString(), monthDay.toString()); + shouldBe(typeof monthDay.toLocaleString("en-US", { calendar: "iso8601" }), 'string'); } shouldBe(Temporal.PlainMonthDay.prototype.with.length, 1); diff --git a/JSTests/stress/temporal-plaintime.js b/JSTests/stress/temporal-plaintime.js index 63daf442d50e..670fb6574560 100644 --- a/JSTests/stress/temporal-plaintime.js +++ b/JSTests/stress/temporal-plaintime.js @@ -146,7 +146,7 @@ shouldBe(String(Temporal.PlainTime.from('2007-01-09 03:24:30[u-ca=japanese]')), shouldBe(Temporal.PlainTime.from(dateTime).toString(), time.toString()); shouldBe(time.toJSON(), time.toString()); - shouldBe(time.toLocaleString(), time.toString()); + shouldBe(typeof time.toLocaleString(), 'string'); } { let time = Temporal.PlainTime.from({ @@ -242,9 +242,6 @@ let failures = [ "1995-12-07T03:24:30+01:00[-/_]", "1995-12-07T03:24:30+01:00[_/-]", "1995-12-07T03:24:30+01:00[CocoaCappuccinoMatcha]", - "1995-12-07T03:24:30+01:00[Etc/GMT+50]", - "1995-12-07T03:24:30+01:00[Etc/GMT+0]", - "1995-12-07T03:24:30+01:00[Etc/GMT0]", "1995-12-07T03:24:30+10:20:30.0123456789", "1995-12-07 03:24:30+01:00[Etc/GMT\u221201]", "1995-12-07 03:24:30+01:00[+02:00:00.0123456789]", @@ -278,13 +275,6 @@ for (let text of failures) { shouldBe(sorted.join(' '), `01:24:00 01:24:05 03:24:00`); } -shouldBe(String(Temporal.PlainTime.from("20:34").calendar), `iso8601`); -shouldBe(Temporal.PlainTime.from("20:34").calendar instanceof Temporal.Calendar, true); -{ - let time = Temporal.PlainTime.from("20:34"); - shouldBe(time.calendar, time.calendar); -} - { let time = Temporal.PlainTime.from('19:39:09.068346205'); shouldBe(String(time.round('hour')), `20:00:00`); @@ -332,7 +322,12 @@ shouldThrow(() => { }, TypeError); { let time = Temporal.PlainTime.from('19:39:09.068346205'); - shouldBe(JSON.stringify(time.getISOFields()), `{"calendar":"iso8601","isoHour":19,"isoMicrosecond":346,"isoMillisecond":68,"isoMinute":39,"isoNanosecond":205,"isoSecond":9}`); + shouldBe(time.hour, 19); + shouldBe(time.minute, 39); + shouldBe(time.second, 9); + shouldBe(time.millisecond, 68); + shouldBe(time.microsecond, 346); + shouldBe(time.nanosecond, 205); } { let max = 1 ** 53; diff --git a/JSTests/stress/temporal-plainyearmonth.js b/JSTests/stress/temporal-plainyearmonth.js index e90624a5fc02..91f516ad501d 100644 --- a/JSTests/stress/temporal-plainyearmonth.js +++ b/JSTests/stress/temporal-plainyearmonth.js @@ -41,7 +41,7 @@ const yearMonth = new Temporal.PlainYearMonth(2025, 4); { shouldBe(yearMonth.toString(), '2025-04'); shouldBe(yearMonth.toJSON(), yearMonth.toString()); - shouldBe(yearMonth.toLocaleString(), yearMonth.toString()); + shouldBe(typeof yearMonth.toLocaleString("en-US", { calendar: "iso8601" }), 'string'); shouldThrow(() => yearMonth.toString({ calendarName: "bogus" }), RangeError); } @@ -135,21 +135,19 @@ shouldBe(Temporal.PlainYearMonth.prototype.subtract.length, 1); { shouldBe(yearMonth.add(new Temporal.Duration()).toString(), '2025-04'); shouldBe(yearMonth.add({ years: 1, months: 1 }).toString(), '2026-05'); - shouldBe(yearMonth.add('P1W1D').toString(), '2025-04'); - shouldBe(yearMonth.add({ hours: 24 }).toString(), '2025-04'); - shouldBe(yearMonth.add({ days: 36500000 }).toString(), '+101958-11'); - shouldBe(yearMonth.add(new Temporal.Duration(-1, -1, 0, -1)).toString(), '2024-03'); shouldBe(Temporal.PlainYearMonth.from('2025-04').add({ months: 1 }).toString(), '2025-05'); shouldThrow(() => { yearMonth.add({ years: 300000 }); }, RangeError); + shouldThrow(() => { yearMonth.add('P1W1D'); }, RangeError); + shouldThrow(() => { yearMonth.add({ hours: 24 }); }, RangeError); + shouldThrow(() => { yearMonth.add({ days: 1 }); }, RangeError); shouldBe(yearMonth.subtract(new Temporal.Duration()).toString(), '2025-04'); shouldBe(yearMonth.subtract({ years: 1, months: 1 }).toString(), '2024-03'); - shouldBe(yearMonth.subtract('P1W1D').toString(), '2025-04'); - shouldBe(yearMonth.subtract({ hours: 24 }).toString(), '2025-04'); - shouldBe(yearMonth.subtract({ days: 36500000 }).toString(), '-097909-09'); - shouldBe(yearMonth.subtract(new Temporal.Duration(-1, -1, 0, -1)).toString(), '2026-05'); shouldBe(Temporal.PlainYearMonth.from('2025-04').subtract({ months: 1 }).toString(), '2025-03'); shouldThrow(() => { yearMonth.subtract({ years: 300000 }); }, RangeError); + shouldThrow(() => { yearMonth.subtract('P1W1D'); }, RangeError); + shouldThrow(() => { yearMonth.subtract({ hours: 24 }); }, RangeError); + shouldThrow(() => { yearMonth.subtract({ days: 1 }); }, RangeError); } shouldBe(Temporal.PlainYearMonth.prototype.since.length, 1); diff --git a/JSTests/stress/temporal-timezone.js b/JSTests/stress/temporal-timezone.js index d0f4cf17ff5d..764997565d6e 100644 --- a/JSTests/stress/temporal-timezone.js +++ b/JSTests/stress/temporal-timezone.js @@ -1,11 +1,13 @@ -//@ skip if $hostOS == "windows" || $hostOS == "linux" //@ requireOptions("--useTemporal=1") +// FIXME: toLocaleString requires IntlDateTimeFormat Temporal support, implemented in the next patch. +//@ skip + function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`expected ${expected} but got ${actual}`); } -function shouldThrow(func, errorType, message) { +function shouldThrow(func, errorType) { let error; try { func(); @@ -15,113 +17,36 @@ function shouldThrow(func, errorType, message) { if (!(error instanceof errorType)) throw new Error(`Expected ${errorType.name}!`); - if (message !== undefined) - shouldBe(String(error), message); -} - -shouldBe(Temporal.TimeZone instanceof Function, true); -shouldBe(Temporal.TimeZone.length, 0); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.TimeZone, 'prototype').writable, false); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.TimeZone, 'prototype').enumerable, false); -shouldBe(Object.getOwnPropertyDescriptor(Temporal.TimeZone, 'prototype').configurable, false); -shouldBe(Temporal.TimeZone.prototype.constructor, Temporal.TimeZone); - -let failures = [ - "", - "+", - "+2", - "+2:00", - "+24", - "+23:", - "20:00", - "+2:00", - "+32:00", - "+23:001", - "+23:99", - "+23:990", - "+23:59:99", - "+23:59:001", - "+23:59:999", - "+23:59:59.", - "+23:59:59,", - "+23:59:59a", - "+23:59:59.a", - "+20:0000", - "+20:60", - "+20:59:", - "+20:59:60", - "2059:00", - "+2059:00", - "+20:5900", - "+20:59:00.0123456789", - "local", - "\u221202:00", -]; - -for (let text of failures) { - shouldThrow(() => { - new Temporal.TimeZone(text); - }, RangeError); } -shouldBe(new Temporal.TimeZone("+00:00").id, `UTC`); -shouldBe(new Temporal.TimeZone("+01:00").id, `+01:00`); -shouldBe(new Temporal.TimeZone("+01:59").id, `+01:59`); -shouldBe(new Temporal.TimeZone("-01:59").id, `-01:59`); -shouldBe(new Temporal.TimeZone("-01:59:30").id, `-01:59:30`); -shouldBe(new Temporal.TimeZone("-01:59:30.12345").id, `-01:59:30.12345`); -shouldBe(new Temporal.TimeZone("-01:59:30.000001").id, `-01:59:30.000001`); -shouldBe(new Temporal.TimeZone("-01:59:30.123450000").id, `-01:59:30.12345`); -shouldBe(new Temporal.TimeZone("-01:59:30.000000001").id, `-01:59:30.000000001`); -shouldBe(new Temporal.TimeZone("-01:59:30.123456789").id, `-01:59:30.123456789`); -shouldBe(new Temporal.TimeZone("-01:59:30.001002003").id, `-01:59:30.001002003`); -shouldBe(new Temporal.TimeZone("-01:59:30.000000000").id, `-01:59:30`); -shouldBe(new Temporal.TimeZone("-01:59:00.000000000").id, `-01:59`); -shouldBe(new Temporal.TimeZone("-01:00:00.000000000").id, `-01:00`); - -let tz = new Temporal.TimeZone("-01:59:30.123456789") -shouldBe(tz.id, String(tz)); - -shouldBe(new Temporal.TimeZone("Asia/Tokyo").id, `Asia/Tokyo`); -shouldBe(new Temporal.TimeZone("ASIA/TOKYO").id, `Asia/Tokyo`); -shouldBe(new Temporal.TimeZone("UTC").id, `UTC`); - -shouldBe(new Temporal.TimeZone('UTC').id, `UTC`); -shouldBe(new Temporal.TimeZone('Africa/Cairo').id, `Africa/Cairo`); -shouldBe(new Temporal.TimeZone('america/VANCOUVER').id, `America/Vancouver`); -shouldBe(new Temporal.TimeZone('Asia/Katmandu').id, `Asia/Kathmandu`); -shouldBe(new Temporal.TimeZone('-04:00').id, `-04:00`); -shouldBe(new Temporal.TimeZone('+0645').id, `+06:45`); - -shouldBe(Temporal.TimeZone.from('UTC').id, `UTC`); -shouldBe(Temporal.TimeZone.from('Africa/Cairo').id, `Africa/Cairo`); -shouldBe(Temporal.TimeZone.from('Africa/Cairo').toString(), `Africa/Cairo`); -shouldBe(Temporal.TimeZone.from('Africa/Cairo').toJSON(), `Africa/Cairo`); -shouldBe(Temporal.TimeZone.from('america/VANCOUVER').id, `America/Vancouver`); -shouldBe(Temporal.TimeZone.from('Asia/Katmandu').id, `Asia/Kathmandu`); -shouldBe(Temporal.TimeZone.from('-04:00').id, `-04:00`); -shouldBe(Temporal.TimeZone.from('+0645').id, `+06:45`); -shouldBe(Temporal.TimeZone.from('+0645').toString(), `+06:45`); -shouldBe(Temporal.TimeZone.from('+0645').toJSON(), `+06:45`); - -// ISO 8601 string with time zone offset part -// FIXME: We will support Temporal Instant format in Temporal.TimeZone.from. -// shouldBe(Temporal.TimeZone.from('2020-01-14T00:31:00.065858086Z').id, ``); -// shouldBe(Temporal.TimeZone.from('2020-01-13T16:31:00.065858086-08:00').id, ``); -// shouldBe(Temporal.TimeZone.from('2020-01-13T16:31:00.065858086-08:00[America/Vancouver]').id, ``); - -const user = { - id: 775, - username: 'robotcat', - password: 'hunter2', // Note: Don't really store passwords like that - userTimeZone: Temporal.TimeZone.from('Europe/Madrid') -}; -const str = JSON.stringify(user); -shouldBe(str, `{"id":775,"username":"robotcat","password":"hunter2","userTimeZone":"Europe/Madrid"}`); -function reviver(key, value) { - if (key.endsWith('TimeZone')) return Temporal.TimeZone.from(value); - return value; +// Stage 4: Temporal.TimeZone constructor is removed +shouldThrow(() => { new Temporal.TimeZone("UTC"); }, TypeError); +shouldThrow(() => { Temporal.TimeZone.from("UTC"); }, TypeError); + +// FIXME: TimeZone is accessed via timeZoneId on ZonedDateTime +// { +// let zdt = Temporal.ZonedDateTime.from("2024-06-15T12:00[Asia/Tokyo]"); +// shouldBe(zdt.timeZoneId, "Asia/Tokyo"); +// shouldBe(zdt.offset, "+09:00"); +// } + +// FIXME: UTC, fixed offset, ZonedDateTime +// { +// let zdt = Temporal.ZonedDateTime.from("2024-06-15T12:00[UTC]"); +// shouldBe(zdt.timeZoneId, "UTC"); +// shouldBe(zdt.offset, "+00:00"); +// } + +// FIXME: Fixed UTC offset ZonedDateTime +// { +// let zdt = new Temporal.ZonedDateTime(0n, "+05:30"); +// shouldBe(zdt.timeZoneId, "+05:30"); +// shouldBe(zdt.offset, "+05:30"); +// } + +// Temporal.Now.timeZoneId returns a string +{ + let tzId = Temporal.Now.timeZoneId(); + shouldBe(typeof tzId, "string"); + shouldBe(tzId.length > 0, true); } -const parsed = JSON.parse(str, reviver); -shouldBe(parsed.userTimeZone instanceof Temporal.TimeZone, true); -shouldBe(parsed.userTimeZone.id, `Europe/Madrid`); diff --git a/JSTests/stress/to-locale-case-root-fast-path.js b/JSTests/stress/to-locale-case-root-fast-path.js new file mode 100644 index 000000000000..33de226ed584 --- /dev/null +++ b/JSTests/stress/to-locale-case-root-fast-path.js @@ -0,0 +1,64 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("bad value: expected " + JSON.stringify(expected) + " but got " + JSON.stringify(actual)); +} + +const inputs = [ + "", + "Hello World", + "HELLO WORLD", + "hello world", + "ÀÉÎ", + "àéî", + "ß", + "ΟΔΟΣ", + "Größe", + "\u{10400}", // Deseret capital (non-BMP) + "\u{10428}", // Deseret small (non-BMP) + "ABCdef123", + "Ì", +]; + +// Core invariant of the optimization: for any non-tailoring locale, toLocaleLowerCase / +// toLocaleUpperCase must produce exactly the locale-independent result. +for (const s of inputs) { + const rootLower = s.toLowerCase(); + const rootUpper = s.toUpperCase(); + for (const locale of [undefined, "en", "de", "ja", "fr", "en-US", "zh-Hans", "ru", "es-419"]) { + shouldBe(s.toLocaleLowerCase(locale), rootLower); + shouldBe(s.toLocaleUpperCase(locale), rootUpper); + } +} + +// Identity preservation: an already-lowercased/uppercased string round-trips unchanged. +shouldBe("hello world".toLocaleLowerCase(), "hello world"); +shouldBe("HELLO WORLD".toLocaleUpperCase(), "HELLO WORLD"); +shouldBe("".toLocaleLowerCase("en"), ""); +shouldBe("".toLocaleUpperCase("en"), ""); + +// German sharp-s uppercases to "SS" in the root locale. +shouldBe("ß".toLocaleUpperCase(), "SS"); + +// Tailoring locales must keep going through ICU and differ from the root mapping. + +// Turkish / Azeri: dotted/dotless i. +shouldBe("I".toLocaleLowerCase("tr"), "ı"); +shouldBe("i".toLocaleUpperCase("tr"), "İ"); +shouldBe("I".toLocaleLowerCase("az"), "ı"); +shouldBe("i".toLocaleUpperCase("az"), "İ"); + +// Unicode extension subtags must not defeat tailoring detection. +shouldBe("I".toLocaleLowerCase("tr-u-co-phonebk"), "ı"); + +// Greek: uppercasing strips the tonos accent, differing from the root mapping. +if ("Άυτη".toLocaleUpperCase("el") === "Άυτη".toUpperCase()) + throw new Error("Greek uppercasing should differ from root"); + +// Lithuanian: combining dot above is retained on lowercase of accented I, so it +// differs from the root locale-independent lowercasing. +if ("Ì".toLocaleLowerCase("lt") === "Ì".toLowerCase()) + throw new Error("Lithuanian lowercasing should differ from root"); + +// Empty string with an explicit tailoring locale. +shouldBe("".toLocaleLowerCase("tr"), ""); +shouldBe("".toLocaleUpperCase("el"), ""); diff --git a/JSTests/stress/typedarray-forEach-transition.js b/JSTests/stress/typedarray-forEach-transition.js new file mode 100644 index 000000000000..6b922b2aeaca --- /dev/null +++ b/JSTests/stress/typedarray-forEach-transition.js @@ -0,0 +1,16 @@ +let ta = new Int32Array(100); +for (let i = 0; i < 100; i++) ta[i] = i; + +ta.forEach((v, i) => { + if (i === 0) { + ta.buffer; + + for (let j = 1; j < 100; j++) { + ta[j] = 0xDEAD; + } + } else { + if (v !== 0xDEAD) { + throw new Error("read stale value at index ", i); + } + } +}); diff --git a/JSTests/stress/wasm-funcref-table-grow-gc-marking-gap.js b/JSTests/stress/wasm-funcref-table-grow-gc-marking-gap.js new file mode 100644 index 000000000000..3c9d9c4d47c8 --- /dev/null +++ b/JSTests/stress/wasm-funcref-table-grow-gc-marking-gap.js @@ -0,0 +1,58 @@ +// Regression test: Wasm::Table::grow on a funcref table with a non-null +// default left slots in an inconsistent state where m_value held a live +// WebAssemblyFunction wrapper but m_function.rtt was null. Because +// Function::isEmpty() == !m_function.rtt and visitAggregateImpl skipped +// visiting m_value on "empty" slots, the wrapper went unmarked, GC freed +// it, and table.get returned a dangling pointer. + +if (!this.WebAssembly) + quit(0); + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("bad value: " + actual + " (expected " + expected + ")"); +} + +// (module (func $f (export "f") (result i32) (i32.const ))) +// Each slot gets its own module/instance/function so identity is unambiguous. +function makeModule(constant) { + const leb = []; + let v = constant; + while (true) { + const b = v & 0x7f; + v >>>= 7; + if (v === 0 && (b & 0x40) === 0) { + leb.push(b); + break; + } + leb.push(b | 0x80); + } + const bodyLen = 3 + leb.length; + const codeLen = 2 + bodyLen; + return new WebAssembly.Module(new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, + 0x03, 0x02, 0x01, 0x00, + 0x07, 0x05, 0x01, 0x01, 0x66, 0x00, 0x00, + 0x0a, codeLen, 0x01, bodyLen, 0x00, 0x41, ...leb, 0x0b, + ])); +} + +const N = 1000; +const table = new WebAssembly.Table({ element: "funcref", initial: 0 }); + +// Each slot's only strong reference is the m_value WriteBarrier on the slot +// itself; the `fn` local goes dead between iterations. +for (let i = 0; i < N; ++i) { + const fn = new WebAssembly.Instance(makeModule(i)).exports.f; + table.grow(1, fn); +} + +fullGC(); + +for (let i = 0; i < N; ++i) { + const stale = table.get(i); + if (typeof stale !== "function") + throw new Error("table.get(" + i + ") was not a function: " + stale); + shouldBe(stale(), i); +} diff --git a/JSTests/stress/weak-map-weak-set-lazy-buffer.js b/JSTests/stress/weak-map-weak-set-lazy-buffer.js new file mode 100644 index 000000000000..d16484543442 --- /dev/null +++ b/JSTests/stress/weak-map-weak-set-lazy-buffer.js @@ -0,0 +1,154 @@ +// Exercises the lazily-allocated WeakMap/WeakSet buffer: a freshly constructed instance +// shares an immortal empty buffer (capacity 1) and only allocates a real buffer on the +// first insertion. All read paths must work against that shared empty buffer, and the +// getOrInsert fast path (findBucketIndex + addBucket) must not write into it. + +function assert(b, message) { + if (!b) + throw new Error("bad assertion: " + message); +} + +function makeWeakMap() { + return new WeakMap(); +} +noInline(makeWeakMap); + +function makeWeakSet() { + return new WeakSet(); +} +noInline(makeWeakSet); + +// 1. Reads against the shared empty buffer must miss, and delete must report false. +for (var i = 0; i < 1e5; ++i) { + var key = {}; + var map = makeWeakMap(); + assert(map.get(key) === undefined, "empty map get"); + assert(!map.has(key), "empty map has"); + assert(!map.delete(key), "empty map delete"); + + var set = makeWeakSet(); + assert(!set.has(key), "empty set has"); + assert(!set.delete(key), "empty set delete"); +} + +// 2. getOrInsert / getOrInsertComputed on a fresh (empty buffer) map must allocate a real +// buffer and insert, rather than writing into the shared sentinel at the stale index. +for (var i = 0; i < 1e5; ++i) { + var key = {}; + var map = makeWeakMap(); + var inserted = map.getOrInsert(key, i); + assert(inserted === i, "getOrInsert returns inserted value"); + assert(map.get(key) === i, "getOrInsert stored value"); + assert(map.has(key), "getOrInsert key present"); + // Second call must observe the existing entry (real-buffer exists path), not overwrite. + assert(map.getOrInsert(key, i + 1) === i, "getOrInsert keeps existing value"); + + var key2 = {}; + var map2 = makeWeakMap(); + var computed = map2.getOrInsertComputed(key2, (k) => i * 2); + assert(computed === i * 2, "getOrInsertComputed returns value"); + assert(map2.get(key2) === i * 2, "getOrInsertComputed stored value"); +} + +// 3. A separate empty map sharing the same sentinel must remain empty after another map +// allocated its own real buffer (i.e. addBucket did not scribble on the shared buffer). +var canary = {}; +for (var i = 0; i < 1e4; ++i) { + var emptyMap = makeWeakMap(); + var usedMap = makeWeakMap(); + usedMap.set(canary, 123); + assert(!emptyMap.has(canary), "sibling empty map stays empty after another map writes"); + assert(emptyMap.get(canary) === undefined, "sibling empty map get misses"); + + var emptySet = makeWeakSet(); + var usedSet = makeWeakSet(); + usedSet.add(canary); + assert(!emptySet.has(canary), "sibling empty set stays empty"); +} + +// 4. Grow a map enough to force several rehashes (real-buffer reallocation + free), then +// verify every entry survives. +function makeFilledMap(n) { + var map = new WeakMap(); + var keys = []; + for (var j = 0; j < n; ++j) { + var k = { id: j }; + keys.push(k); + map.set(k, j); + } + return [map, keys]; +} +noInline(makeFilledMap); + +for (var round = 0; round < 100; ++round) { + var [map, keys] = makeFilledMap(256); + for (var j = 0; j < keys.length; ++j) + assert(map.get(keys[j]) === j, "filled map entry " + j); + // Delete half to exercise shrink/rehash. + for (var j = 0; j < keys.length; j += 2) + assert(map.delete(keys[j]), "delete entry " + j); + for (var j = 1; j < keys.length; j += 2) + assert(map.get(keys[j]) === j, "surviving entry " + j); +} + +// 5. Allocate many empty (sentinel) maps and force GC. finalizeUnconditionally must not +// touch / free the shared empty buffer for these instances. +var live = []; +for (var i = 0; i < 1e4; ++i) + live.push(makeWeakMap(), makeWeakSet()); +if (typeof gc === "function") + gc(); +for (var i = 0; i < live.length; ++i) { + var obj = live[i]; + assert(!obj.has(canary), "post-gc empty container has"); +} + +// 6. Subclasses (slow allocation path / new.target != callee) must also start empty. +class SubWeakMap extends WeakMap {} +function makeSub() { + return new SubWeakMap(); +} +noInline(makeSub); +for (var i = 0; i < 1e4; ++i) { + var m = makeSub(); + assert(m.get(canary) === undefined, "subclass empty get"); + m.set(canary, i); + assert(m.get(canary) === i, "subclass set/get"); +} + +// 7. Hand a fresh (still empty-buffer) map/set to read functions that were optimized against a +// populated one, so the DFG/FTL WeakMapGet fast path probes the shared empty buffer and misses. +function readGet(map, key) { + return map.get(key); +} +noInline(readGet); + +function readHas(map, key) { + return map.has(key); +} +noInline(readHas); + +function readSetHas(set, key) { + return set.has(key); +} +noInline(readSetHas); + +var warmKey = {}; +var warmMap = new WeakMap(); +warmMap.set(warmKey, 1); +var warmSet = new WeakSet(); +warmSet.add(warmKey); +for (var i = 0; i < 1e5; ++i) { + assert(readGet(warmMap, warmKey) === 1, "warm get"); + assert(readHas(warmMap, warmKey), "warm has"); + assert(readSetHas(warmSet, warmKey), "warm set has"); +} +for (var i = 0; i < 1e4; ++i) { + var emptyMap = makeWeakMap(); + var emptySet = makeWeakSet(); + assert(readGet(emptyMap, warmKey) === undefined, "optimized get on empty map"); + assert(!readHas(emptyMap, warmKey), "optimized has on empty map"); + assert(!readSetHas(emptySet, warmKey), "optimized has on empty set"); +} + +print("PASS"); diff --git a/JSTests/stress/yarr-jit-shared-lead-prefilter.js b/JSTests/stress/yarr-jit-shared-lead-prefilter.js new file mode 100644 index 000000000000..1f9e7230e87f --- /dev/null +++ b/JSTests/stress/yarr-jit-shared-lead-prefilter.js @@ -0,0 +1,421 @@ +// Tests for the YarrJIT BodyAlternative shared-lead-surrogate prefilter and the +// per-term shared-lead trail-only fast path. These optimizations only fire under +// /u or /v on Char16 input; the tests exercise both the positive paths +// (alternations whose first consuming term shares a UTF-16 lead surrogate) and +// the negatives that must NOT trigger the prefilter. + +function shouldBe(actual, expected, message) +{ + if (actual !== expected) + throw new Error(message + ": expected " + String(expected) + " but got " + String(actual)); +} + +function shouldBeArray(actual, expected, message) +{ + if (actual === null && expected === null) + return; + if (actual === null || expected === null) + throw new Error(message + ": one of actual/expected is null (actual=" + String(actual) + ", expected=" + String(expected) + ")"); + if (actual.length !== expected.length) + throw new Error(message + ": length mismatch — expected " + expected.length + " got " + actual.length); + for (let i = 0; i < expected.length; ++i) { + if (actual[i] !== expected[i]) + throw new Error(message + "[" + i + "]: expected " + String(expected[i]) + " got " + String(actual[i])); + } +} + +// Run a regex twice — once on a fresh literal, once on a String constructor +// result — so both Char8/Char16 representations of the haystack are exercised. +function execBoth(reSource, flags, input, expectedMatch) +{ + let re1 = new RegExp(reSource, flags); + let m1 = re1.exec(input); + if (expectedMatch === null) + shouldBe(m1, null, "exec(" + JSON.stringify(input) + ") via RegExp(" + JSON.stringify(reSource) + "," + JSON.stringify(flags) + ")"); + else { + shouldBe(m1 !== null, true, "exec must match: " + JSON.stringify(reSource) + " on " + JSON.stringify(input)); + shouldBe(m1[0], expectedMatch, "exec[0]: " + JSON.stringify(reSource) + " on " + JSON.stringify(input)); + } + + let re2 = new RegExp(reSource, flags); + let m2 = re2.test(input); + shouldBe(m2, expectedMatch !== null, "test(): " + JSON.stringify(reSource) + " on " + JSON.stringify(input)); +} + +// ---------------------------------------------------------------------------- +// 1. PatternCharacter alternation, all sharing UTF-16 lead 0xD83C. +// This exercises the new findFirstTermSharedLead PatternCharacter branch. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F0B1}|\u{1F0C1}|\u{1F0D1}/u; + + shouldBe(re.test("\u{1F0A1}"), true, "literal-alt: AS"); + shouldBe(re.test("\u{1F0B1}"), true, "literal-alt: HS"); + shouldBe(re.test("\u{1F0C1}"), true, "literal-alt: DS"); + shouldBe(re.test("\u{1F0D1}"), true, "literal-alt: CS"); + + // Same lead, codepoint not in the alternation — must reject. + shouldBe(re.test("\u{1F0A2}"), false, "literal-alt: same lead but not enumerated"); + shouldBe(re.test("\u{1F0DE}"), false, "literal-alt: end-of-card-range, not enumerated"); + + // Different lead surrogate — must reject without misreading the pair. + shouldBe(re.test("\u{1F1E6}"), false, "literal-alt: different lead 0xD83C->0xD83C, low pair differs"); + shouldBe(re.test("\u{20000}"), false, "literal-alt: different lead 0xD840"); + + // BMP haystack — no surrogate pair at all. + shouldBe(re.test("ABCD"), false, "literal-alt: BMP haystack"); + shouldBe(re.test(""), false, "literal-alt: empty haystack"); + + // Lone surrogate — must not match (no pair to decode). + shouldBe(re.test("\uD83C"), false, "literal-alt: lone lead surrogate"); + shouldBe(re.test("\uDCA1"), false, "literal-alt: lone trail surrogate"); + + // Match anywhere in the string (non-anchored). + shouldBeArray(re.exec("foo\u{1F0B1}bar"), ["\u{1F0B1}"], "literal-alt: middle of string"); + shouldBeArray(re.exec("\u{1F600}\u{1F0C1}"), ["\u{1F0C1}"], "literal-alt: after another non-BMP char"); +} + +// ---------------------------------------------------------------------------- +// 2. PatternCharacter alternation, mixed lead surrogates. +// Prefilter must NOT fire (or must fire with no shared lead) but the regex +// must still match correctly. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F1E6}|\u{20000}/u; + shouldBe(re.test("\u{1F0A1}"), true, "mixed-lead: 1F0A1"); + shouldBe(re.test("\u{1F1E6}"), true, "mixed-lead: 1F1E6"); + shouldBe(re.test("\u{20000}"), true, "mixed-lead: 20000"); + shouldBe(re.test("\u{1F0A2}"), false, "mixed-lead: not in set"); + shouldBe(re.test("ABC"), false, "mixed-lead: BMP haystack"); +} + +// ---------------------------------------------------------------------------- +// 3. CharacterClass shared-lead — the original UniPoker shape. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0DE}]/u; + for (let cp = 0x1F0A1; cp <= 0x1F0DE; ++cp) + shouldBe(re.test(String.fromCodePoint(cp)), true, "card-class: " + cp.toString(16)); + + shouldBe(re.test("\u{1F0A0}"), false, "card-class: just below"); + shouldBe(re.test("\u{1F0DF}"), false, "card-class: just above"); + shouldBe(re.test("\u{1F600}"), false, "card-class: same lead, different trail"); + shouldBe(re.test("A"), false, "card-class: BMP"); +} + +// ---------------------------------------------------------------------------- +// 4. CharacterClass alternation — multiple classes all sharing a lead. +// Each first-term is a class with hasSharedLeadSurrogate(); the prefilter +// should compute a single shared lead across all alternatives. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}\u{1F0A2}]|[\u{1F0B1}\u{1F0B2}]|[\u{1F0C1}\u{1F0C2}]/u; + shouldBe(re.test("\u{1F0A1}"), true, "class-alt: 1F0A1"); + shouldBe(re.test("\u{1F0B2}"), true, "class-alt: 1F0B2"); + shouldBe(re.test("\u{1F0C1}"), true, "class-alt: 1F0C1"); + shouldBe(re.test("\u{1F0A3}"), false, "class-alt: 1F0A3 (same lead, not enumerated)"); + shouldBe(re.test("\u{1F600}"), false, "class-alt: same lead, different trail"); +} + +// ---------------------------------------------------------------------------- +// 5. Mixed PatternCharacter + CharacterClass alternation, shared lead. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|[\u{1F0B1}-\u{1F0BE}]|\u{1F0C1}/u; + shouldBe(re.test("\u{1F0A1}"), true, "mixed: literal A"); + shouldBe(re.test("\u{1F0B5}"), true, "mixed: range middle"); + shouldBe(re.test("\u{1F0C1}"), true, "mixed: literal C"); + shouldBe(re.test("\u{1F0BF}"), false, "mixed: just past range"); + shouldBe(re.test("\u{1F0D1}"), false, "mixed: same lead, not enumerated"); +} + +// ---------------------------------------------------------------------------- +// 6. ParenthesesSubpattern wrapper — single-alternative group around a literal +// or class. Prefilter recurses through these. +// ---------------------------------------------------------------------------- +{ + let re = /(\u{1F0A1})|(\u{1F0B1})|(\u{1F0C1})/u; + let m = re.exec("\u{1F0B1}"); + shouldBe(m !== null, true, "paren: matched"); + shouldBe(m[0], "\u{1F0B1}", "paren: full match"); + shouldBe(m[1], undefined, "paren: cap1 empty"); + shouldBe(m[2], "\u{1F0B1}", "paren: cap2 captured"); + shouldBe(m[3], undefined, "paren: cap3 empty"); + shouldBe(re.test("\u{1F0A2}"), false, "paren: same lead not enumerated"); +} + +// ---------------------------------------------------------------------------- +// 7. ParenthesesSubpattern with multiple internal alternatives — must NOT be +// transparent for the prefilter (the body-alt prefilter only recurses into +// single-alternative groups). Match correctness is what we check here. +// ---------------------------------------------------------------------------- +{ + let re = /(\u{1F0A1}|\u{1F0B1})\u{1F0C1}/u; + shouldBe(re.test("\u{1F0A1}\u{1F0C1}"), true, "multi-alt-paren: A then C"); + shouldBe(re.test("\u{1F0B1}\u{1F0C1}"), true, "multi-alt-paren: B then C"); + shouldBe(re.test("\u{1F0C1}\u{1F0C1}"), false, "multi-alt-paren: C then C"); + shouldBe(re.test("\u{1F0A1}\u{1F0D1}"), false, "multi-alt-paren: A then D"); +} + +// ---------------------------------------------------------------------------- +// 8. Negative — inverted character class must disable the per-term shared-lead +// fast path (and the prefilter must not over-reject). +// ---------------------------------------------------------------------------- +{ + let re = /[^\u{1F0A1}-\u{1F0DE}]/u; + shouldBe(re.test("\u{1F0A0}"), true, "inverted: just below range"); + shouldBe(re.test("A"), true, "inverted: BMP"); + shouldBe(re.test("\u{1F0A1}"), false, "inverted: in range"); + shouldBe(re.test("\u{1F0DE}"), false, "inverted: range end"); +} + +// ---------------------------------------------------------------------------- +// 9. Negative — BMP-only alternation. Must not engage shared-lead path; must +// still match correctly under /u. +// ---------------------------------------------------------------------------- +{ + let re = /A|B|C/u; + shouldBe(re.test("A"), true, "bmp: A"); + shouldBe(re.test("D"), false, "bmp: D"); +} + +// ---------------------------------------------------------------------------- +// 10. /v flag (UnicodeSets). The optimization is gated on m_pattern.eitherUnicode() +// which is true for both /u and /v. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F0B1}|\u{1F0C1}/v; + shouldBe(re.test("\u{1F0A1}"), true, "/v literal-alt: A"); + shouldBe(re.test("\u{1F0B1}"), true, "/v literal-alt: B"); + shouldBe(re.test("\u{1F0A2}"), false, "/v literal-alt: not enumerated"); + shouldBe(re.test("\u{1F600}"), false, "/v literal-alt: same lead diff trail"); +} + +// ---------------------------------------------------------------------------- +// 11. ignoreCase — non-BMP characters that are CanonicalizeUnique survive as +// PatternCharacter. Mathematical italic codepoints are unique-cased (no +// case fold equivalent). +// ---------------------------------------------------------------------------- +{ + let re = /\u{1D400}|\u{1D401}/iu; // 𝐀 𝐁 — bold mathematical A/B + shouldBe(re.test("\u{1D400}"), true, "iu unique: A"); + shouldBe(re.test("\u{1D401}"), true, "iu unique: B"); + shouldBe(re.test("\u{1D402}"), false, "iu unique: C (not enumerated)"); + // Same lead 0xD835, but trail differs. + shouldBe(re.test("\u{1D403}"), false, "iu unique: same lead, different trail"); +} + +// ---------------------------------------------------------------------------- +// 12. Quantifiers on the first term — quantityMinCount must be > 0 for the +// prefilter to engage. quantityMinCount = 0 (e.g., \u{1F0A1}?) means the +// first consumed character isn't necessarily the literal — must still +// match correctly even if prefilter is skipped. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}?\u{1F0B1}/u; + shouldBe(re.test("\u{1F0B1}"), true, "?-quant: B alone"); + shouldBe(re.test("\u{1F0A1}\u{1F0B1}"), true, "?-quant: A then B"); + shouldBe(re.test("\u{1F0A1}"), false, "?-quant: A alone"); +} + +// ---------------------------------------------------------------------------- +// 13. Fixed-count quantifier > 1 on the leading term — exercises the +// generateCharacterClassFixed shared-lead inner loop. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0DE}]{4}/u; + shouldBe(re.test("\u{1F0A1}\u{1F0B1}\u{1F0C1}\u{1F0D1}"), true, "fixed-4: matches"); + shouldBe(re.test("\u{1F0A1}\u{1F0B1}\u{1F0C1}"), false, "fixed-4: only 3"); + shouldBe(re.test("\u{1F0A1}\u{1F0B1}\u{1F0C1}A"), false, "fixed-4: 3 + BMP"); + shouldBe(re.test("\u{1F0A1}\u{1F0B1}\u{1F0C1}\u{1F600}"), false, "fixed-4: 3 + same-lead other"); +} + +// ---------------------------------------------------------------------------- +// 14. Greedy quantifier on the leading term — exercises the +// generateCharacterClassGreedy shared-lead path. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0DE}]+/u; + let s = "\u{1F0A1}\u{1F0B1}\u{1F0C1}\u{1F0D1}foo"; + let m = re.exec(s); + shouldBe(m !== null, true, "greedy: matched"); + shouldBe(m[0], "\u{1F0A1}\u{1F0B1}\u{1F0C1}\u{1F0D1}", "greedy: full prefix"); + + let re2 = /[\u{1F0A1}-\u{1F0DE}]+/u; + shouldBe(re2.test("foo"), false, "greedy: BMP only"); + shouldBe(re2.test("\u{1F600}"), false, "greedy: same lead, different trail"); +} + +// ---------------------------------------------------------------------------- +// 15. Non-anchored search — string starts with non-matching content; the +// prefilter advances by the right amount and the actual match is found +// deeper in the haystack. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F0B1}/u; + let prefix = "abc\u{1F600}def🄀ghi"; // includes mixed-lead non-BMP and \u{1F100} + let target = prefix + "\u{1F0B1}tail"; + let m = re.exec(target); + shouldBe(m !== null, true, "advance: matched"); + shouldBe(m[0], "\u{1F0B1}", "advance: full match"); + shouldBe(m.index, prefix.length, "advance: index correct"); +} + +// ---------------------------------------------------------------------------- +// 16. Sticky and global flags — sticky disables the prefilter via the +// `!m_pattern.sticky()` guard at the BodyAlternativeBegin site. Match +// semantics must remain correct. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F0B1}/uy; + re.lastIndex = 0; + shouldBe(re.test("\u{1F0B1}foo"), true, "sticky: at 0"); + re.lastIndex = 0; + shouldBe(re.test("foo\u{1F0B1}"), false, "sticky: not at 0"); + re.lastIndex = 3; + shouldBe(re.test("foo\u{1F0B1}"), true, "sticky: at 3"); +} + +// ---------------------------------------------------------------------------- +// 17. Capture preservation — the prefilter is just a fast reject; once we +// fall through to per-alternative codegen, captures must be filled +// correctly. +// ---------------------------------------------------------------------------- +{ + let re = /(\u{1F0A1})|(\u{1F0B1})|(\u{1F0C1})/u; + let m = re.exec("xx\u{1F0C1}yy"); + shouldBe(m !== null, true, "capture: matched"); + shouldBe(m[0], "\u{1F0C1}", "capture: full match"); + shouldBe(m[1], undefined, "capture: cap1 empty"); + shouldBe(m[2], undefined, "capture: cap2 empty"); + shouldBe(m[3], "\u{1F0C1}", "capture: cap3 set"); + shouldBe(m.index, 2, "capture: index"); +} + +// ---------------------------------------------------------------------------- +// 18. JIT-tier coverage — recompile and re-execute many times so the regex +// escapes the bytecode interpreter and reaches the JIT, then matches both +// fast-path acceptances and prefilter rejections. +// ---------------------------------------------------------------------------- +{ + let re = /\u{1F0A1}|\u{1F0B1}|\u{1F0C1}|[\u{1F0D1}-\u{1F0DE}]/u; + let pos = ["\u{1F0A1}", "\u{1F0B1}", "\u{1F0C1}", "\u{1F0D5}"]; + let neg = ["A", "\u{1F600}", "\u{1F0DF}", "\u{1F0A0}", ""]; + for (let i = 0; i < 5000; ++i) { + for (let p of pos) { + if (!re.test(p)) + throw new Error("hot: should match " + p); + } + for (let n of neg) { + if (re.test(n)) + throw new Error("hot: should reject " + JSON.stringify(n)); + } + } +} + +// ---------------------------------------------------------------------------- +// 19. Slow-path trail-only class — multiple ranges. The synthetic trail-only +// class has m_rangesUnicode.size() >= 2, which fails both fast-path +// detectors in readPairAndMatchTrailForSharedLead and falls through to +// matchCharacterClass. matchCharacterClass asserts that m_rangesUnicode is +// sorted, so this exercises the std::ranges::sort on m_rangesUnicode in +// buildTrailsOnlyClass. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0A3}\u{1F0B1}-\u{1F0B3}\u{1F0C1}-\u{1F0C3}]/u; + + // Members of the union — must match. + for (let cp of [0x1F0A1, 0x1F0A2, 0x1F0A3, + 0x1F0B1, 0x1F0B2, 0x1F0B3, + 0x1F0C1, 0x1F0C2, 0x1F0C3]) { + shouldBe(re.test(String.fromCodePoint(cp)), true, "slow-multi-range: " + cp.toString(16)); + } + + // Same lead 0xD83C, trails NOT in any range — must reject. + for (let cp of [0x1F0A0, 0x1F0A4, 0x1F0AF, + 0x1F0B0, 0x1F0B4, 0x1F0BF, + 0x1F0C0, 0x1F0C4, 0x1F0FF, + 0x1F600, 0x1F300]) { + shouldBe(re.test(String.fromCodePoint(cp)), false, "slow-multi-range: not in set " + cp.toString(16)); + } + + // Different lead surrogate — must reject (lead check kicks before trail). + shouldBe(re.test("\u{20000}"), false, "slow-multi-range: different lead"); + + // BMP haystack — no surrogate pair. + shouldBe(re.test("ABC"), false, "slow-multi-range: BMP"); +} + +// ---------------------------------------------------------------------------- +// 20. Slow-path trail-only class — mixed matches + ranges. Both +// m_matchesUnicode and m_rangesUnicode are populated on the synthetic +// class, so neither fast-path detector fires. Exercises the unifyMatches / +// unifyRanges logic in matchCharacterClass against the synthetic class. +// ---------------------------------------------------------------------------- +{ + // \u{1F0A1} → match; \u{1F0A5}-\u{1F0A8} → range; \u{1F0AA} → match. + // After dedup/canonicalization the source class will have m_matchesUnicode + // = {1F0A1, 1F0AA} and m_rangesUnicode = {[1F0A5,1F0A8]}. + let re = /[\u{1F0A1}\u{1F0A5}-\u{1F0A8}\u{1F0AA}]/u; + + for (let cp of [0x1F0A1, 0x1F0A5, 0x1F0A6, 0x1F0A7, 0x1F0A8, 0x1F0AA]) + shouldBe(re.test(String.fromCodePoint(cp)), true, "slow-mixed: " + cp.toString(16)); + + for (let cp of [0x1F0A0, 0x1F0A2, 0x1F0A3, 0x1F0A4, 0x1F0A9, 0x1F0AB, 0x1F0DE]) + shouldBe(re.test(String.fromCodePoint(cp)), false, "slow-mixed: not in set " + cp.toString(16)); + + shouldBe(re.test("A"), false, "slow-mixed: BMP"); + shouldBe(re.test("\u{20000}"), false, "slow-mixed: different lead"); +} + +// ---------------------------------------------------------------------------- +// 21. Slow-path with quantifier — exercises the slow path inside a +// fixed-count quantifier loop, where the synthetic class is built once and +// read on every iteration. If the sort were missing or wrong, the +// std::is_sorted assertion in matchCharacterClass would fire on debug +// builds; on release we'd silently miscompile and the wrong characters +// would match. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0A3}\u{1F0B1}-\u{1F0B3}\u{1F0C1}-\u{1F0C3}]{3}/u; + + let goodSeqs = [ + "\u{1F0A1}\u{1F0B2}\u{1F0C3}", + "\u{1F0A2}\u{1F0A3}\u{1F0B1}", + "\u{1F0C1}\u{1F0C2}\u{1F0C3}", + ]; + for (let s of goodSeqs) + shouldBe(re.test(s), true, "slow-quant: should match " + s.codePointAt(0).toString(16) + ".."); + + let badSeqs = [ + "\u{1F0A4}\u{1F0B2}\u{1F0C3}", // first char outside + "\u{1F0A1}\u{1F0B4}\u{1F0C3}", // middle char outside + "\u{1F0A1}\u{1F0B2}\u{1F0DE}", // last char outside, same lead + "\u{1F0A1}\u{1F0B2}A", // last char BMP + ]; + for (let s of badSeqs) + shouldBe(re.test(s), false, "slow-quant: should reject " + s); +} + +// ---------------------------------------------------------------------------- +// 22. Slow-path JIT-tier hot loop — drives the slow-path codegen across +// thousands of iterations to escape the interpreter and stress the +// compiled JIT code on a class large enough to bypass both fast paths. +// ---------------------------------------------------------------------------- +{ + let re = /[\u{1F0A1}-\u{1F0A3}\u{1F0A5}\u{1F0A7}\u{1F0B1}-\u{1F0B3}\u{1F0C1}-\u{1F0C3}]/u; + let pos = ["\u{1F0A1}", "\u{1F0A2}", "\u{1F0A3}", "\u{1F0A5}", "\u{1F0A7}", + "\u{1F0B1}", "\u{1F0B2}", "\u{1F0B3}", "\u{1F0C1}", "\u{1F0C2}", "\u{1F0C3}"]; + let neg = ["\u{1F0A0}", "\u{1F0A4}", "\u{1F0A6}", "\u{1F0A8}", "\u{1F0AF}", + "\u{1F0B0}", "\u{1F0B4}", "\u{1F0C0}", "\u{1F0C4}", "\u{1F600}", "A", ""]; + for (let i = 0; i < 3000; ++i) { + for (let p of pos) { + if (!re.test(p)) + throw new Error("slow-hot: should match " + p); + } + for (let n of neg) { + if (re.test(n)) + throw new Error("slow-hot: should reject " + JSON.stringify(n)); + } + } +} diff --git a/JSTests/test262/config.yaml b/JSTests/test262/config.yaml index db107751fd1b..90225f395846 100644 --- a/JSTests/test262/config.yaml +++ b/JSTests/test262/config.yaml @@ -19,6 +19,8 @@ skip: - Intl.Era-monthcode - await-dictionary - import-bytes + - immutable-arraybuffer + - error-stack-accessor paths: # Depends on the nonextensible-applies-to-private proposal which JSC has not implemented yet. - test/language/import/import-defer/evaluation-triggers/ignore-private-name-access.js @@ -455,23 +457,6 @@ skip: - test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js - test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js - test/intl402/Temporal/Instant/prototype/toString/timezone-string-datetime.js - - - # transferToImmutable() is not implemented yet - - test/built-ins/ArrayBuffer/prototype/resize/this-is-immutable-arraybuffer-object.js - - test/built-ins/ArrayBuffer/prototype/transfer/this-is-immutable-arraybuffer.js - - test/built-ins/ArrayBuffer/prototype/transferToFixedLength/this-is-immutable-arraybuffer.js - - test/built-ins/DataView/prototype/setBigInt64/immutable-buffer.js - - test/built-ins/DataView/prototype/setBigUint64/immutable-buffer.js - - test/built-ins/DataView/prototype/setFloat16/immutable-buffer.js - - test/built-ins/DataView/prototype/setFloat32/immutable-buffer.js - - test/built-ins/DataView/prototype/setFloat64/immutable-buffer.js - - test/built-ins/DataView/prototype/setInt16/immutable-buffer.js - - test/built-ins/DataView/prototype/setInt32/immutable-buffer.js - - test/built-ins/DataView/prototype/setInt8/immutable-buffer.js - - test/built-ins/DataView/prototype/setUint16/immutable-buffer.js - - test/built-ins/DataView/prototype/setUint32/immutable-buffer.js - - test/built-ins/DataView/prototype/setUint8/immutable-buffer.js # Depends on Temporal support in IntlDateTimeFormat::handleDateTimeValue() - test/intl402/DateTimeFormat/prototype/format/temporal-objects-resolved-time-zone.js diff --git a/JSTests/test262/expectations.yaml b/JSTests/test262/expectations.yaml index c96db0a530dd..c439a288054b 100644 --- a/JSTests/test262/expectations.yaml +++ b/JSTests/test262/expectations.yaml @@ -34,27 +34,6 @@ test/built-ins/Proxy/apply/trap-is-not-callable-realm.js: test/built-ins/Proxy/construct/arguments-realm.js: default: 'Test262Error: Expected SameValue(«function Array() {' strict mode: 'Test262Error: Expected SameValue(«function Array() {' -test/built-ins/Proxy/construct/null-handler-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-null-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-number-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-string-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' -test/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js: - default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' - strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' test/built-ins/Proxy/construct/trap-is-not-callable-realm.js: default: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' strict mode: 'Test262Error: Expected a TypeError but got a different error constructor with the same name' @@ -62,119 +41,59 @@ test/built-ins/Temporal/Duration/compare/blank-duration.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" test/built-ins/Temporal/Duration/compare/exhaustive.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/compare/instances-identical.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/compare/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [] and expected [get options.relativeTo] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [] and expected [get options.relativeTo] should have the same contents. all options should be read first' -test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid-offset-string.js: - default: 'Test262Error: "1000 is not a valid offset string Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: "1000 is not a valid offset string Expected a TypeError but got a RangeError' + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" test/built-ins/Temporal/Duration/compare/relativeto-propertybag-optional-properties.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' + strict mode: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' test/built-ins/Temporal/Duration/compare/relativeto-propertybag-timezone-string.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/compare/relativeto-string-invalid.js: - default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' + default: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' + strict mode: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' test/built-ins/Temporal/Duration/compare/relativeto-string-limits.js: - default: 'Test262Error: "-271821-04-19T23:00-01:00[-01:00]" is outside the representable range for a relativeTo parameter Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: "-271821-04-19T23:00-01:00[-01:00]" is outside the representable range for a relativeTo parameter Expected a RangeError to be thrown but no exception was thrown at all' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/compare/relativeto-string.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/compare/throws-when-target-zoned-date-time-outside-valid-limits.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(864n * 10n**19n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(864n * 10n**19n, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/round/balances-days-up-to-both-years-and-months.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' -test/built-ins/Temporal/Duration/prototype/round/balances-up-to-next-unit-after-rounding.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/round/balances-up-to-weeks.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' test/built-ins/Temporal/Duration/prototype/round/blank-duration.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" test/built-ins/Temporal/Duration/prototype/round/case-where-relativeto-affects-rounding-mode-half-even.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/round/does-not-balance-up-to-weeks-if-largest-unit-is-larger-than-weeks.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/round/end-of-month-round-up.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/round/half-expand-is-default.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' -test/built-ins/Temporal/Duration/prototype/round/largestunit-correct-rebalancing.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' +test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-plaindate.js: + default: 'Test262Error: P31D weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' + strict mode: 'Test262Error: P31D weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' +test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-zoned.js: + default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" + strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" test/built-ins/Temporal/Duration/prototype/round/next-day-out-of-range.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(86400_0000_0000_000_000_000n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(86400_0000_0000_000_000_000n, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/round/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.largestUnit, get options.largestUnit.toString, call options.largestUnit.toString, get options.roundingIncrement, get options.roundingIncrement.valueOf, call options.roundingIncrement.valueOf, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.largestUnit, get options.largestUnit.toString, call options.largestUnit.toString, get options.relativeTo, get options.roundingIncrement, get options.roundingIncrement.valueOf, call options.roundingIncrement.valueOf, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.largestUnit, get options.largestUnit.toString, call options.largestUnit.toString, get options.roundingIncrement, get options.roundingIncrement.valueOf, call options.roundingIncrement.valueOf, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.largestUnit, get options.largestUnit.toString, call options.largestUnit.toString, get options.relativeTo, get options.roundingIncrement, get options.roundingIncrement.valueOf, call options.roundingIncrement.valueOf, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' -test/built-ins/Temporal/Duration/prototype/round/relativeto-balances-down-differently-depending-on-relative-date.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/round/relativeto-balances-up-differently-depending-on-relative-date.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' test/built-ins/Temporal/Duration/prototype/round/relativeto-date-limits.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/prototype/round/relativeto-days-24-hours-relative-to-zoned-date-time.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, \"+04:30\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, \"+04:30\")')" -test/built-ins/Temporal/Duration/prototype/round/relativeto-duration-out-of-range-added-to-relative-date.js: - default: 'Test262Error: days out of range, positive, smallestUnit years Expected a RangeError but got a Error' - strict mode: 'Test262Error: days out of range, positive, smallestUnit years Expected a RangeError but got a Error' -test/built-ins/Temporal/Duration/prototype/round/relativeto-ignores-incorrect-properties.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' test/built-ins/Temporal/Duration/prototype/round/relativeto-largestunit-smallestunit-combinations.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(63072000_000_000_000n /* = 1972-01-01T00Z */, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(63072000_000_000_000n /* = 1972-01-01T00Z */, \"UTC\")')" test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-optional-properties.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' -test/built-ins/Temporal/Duration/prototype/round/relativeto-required-for-rounding-durations-with-calendar-units.js: - default: 'Test262Error: Expected a RangeError but got a Error' - strict mode: 'Test262Error: Expected a RangeError but got a Error' -test/built-ins/Temporal/Duration/prototype/round/relativeto-required-properties.js: - default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/Duration/prototype/round/relativeto-required-to-round-calendar-units.js: - default: 'Test262Error: Expected a RangeError but got a Error' - strict mode: 'Test262Error: Expected a RangeError but got a Error' -test/built-ins/Temporal/Duration/prototype/round/relativeto-rounding-date.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' + strict mode: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' test/built-ins/Temporal/Duration/prototype/round/relativeto-string-limits.js: - default: 'Test262Error: "+275760-09-13T00:00Z[UTC]" is outside the representable range for a relativeTo parameter after conversion to DateTime Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: "+275760-09-13T00:00Z[UTC]" is outside the representable range for a relativeTo parameter after conversion to DateTime Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/Duration/prototype/round/relativeto-string-wrong-offset.js: - default: 'Test262Error: round should throw RangeError on a string with UTC offset mismatch Expected a RangeError but got a Error' - strict mode: 'Test262Error: round should throw RangeError on a string with UTC offset mismatch Expected a RangeError but got a Error' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/prototype/round/relativeto-string.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' -test/built-ins/Temporal/Duration/prototype/round/round-and-balance-calendar-units-with-increment-disallowed.js: - default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/round/round-cross-unit-boundary.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' +test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-large-time-component-out-of-range.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" test/built-ins/Temporal/Duration/prototype/round/rounding-increment-relativeto.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" @@ -184,78 +103,36 @@ test/built-ins/Temporal/Duration/prototype/round/rounding-increments.js: test/built-ins/Temporal/Duration/prototype/round/rounding-is-noop.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\", \"iso8601\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\", \"iso8601\")')" -test/built-ins/Temporal/Duration/prototype/round/rounding-window.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' test/built-ins/Temporal/Duration/prototype/round/roundingincrement-days-large.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/round/singular-units.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' -test/built-ins/Temporal/Duration/prototype/round/throws-on-wrong-offset-for-zoned-date-time-relative-to.js: - default: 'Test262Error: Expected a RangeError but got a Error' - strict mode: 'Test262Error: Expected a RangeError but got a Error' -test/built-ins/Temporal/Duration/prototype/round/valid-increments.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' test/built-ins/Temporal/Duration/prototype/round/zero-duration.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'UTC')')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'UTC')')" -test/built-ins/Temporal/Duration/prototype/toString/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' -test/built-ins/Temporal/Duration/prototype/toString/order-of-operations.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' -test/built-ins/Temporal/Duration/prototype/toString/total-of-duration-time-units-out-of-range.js: - default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' test/built-ins/Temporal/Duration/prototype/total/blank-duration.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1n, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/total/incorrect-properties-ignored.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' test/built-ins/Temporal/Duration/prototype/total/no-dst-day-length.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, \"+04:30\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, \"+04:30\")')" -test/built-ins/Temporal/Duration/prototype/total/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.unit, get options.unit.toString, call options.unit.toString] and expected [get options.relativeTo, get options.unit, get options.unit.toString, call options.unit.toString] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.unit, get options.unit.toString, call options.unit.toString] and expected [get options.relativeTo, get options.unit, get options.unit.toString, call options.unit.toString] should have the same contents. all options should be read first' -test/built-ins/Temporal/Duration/prototype/total/precision-exact-mathematical-values-5.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/total/relativeto-calendar-units-depend-on-relative-date.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' test/built-ins/Temporal/Duration/prototype/total/relativeto-date-limits.js: - default: 'Test262Error: +275760-09-12T00:00:01+00:00[UTC] is out of range as a relativeTo argument for total Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: +275760-09-12T00:00:01+00:00[UTC] is out of range as a relativeTo argument for total Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/Duration/prototype/total/relativeto-must-have-required-properties.js: - default: 'Test262Error: Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: Expected a TypeError but got a RangeError' -test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-invalid-offset-string.js: - default: 'Test262Error: "0" is not a valid offset string Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: "0" is not a valid offset string Expected a TypeError but got a RangeError' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-optional-properties.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' + strict mode: 'RangeError: relativeTo with timeZone (ZonedDateTime) is not yet implemented' test/built-ins/Temporal/Duration/prototype/total/relativeto-string-limits.js: - default: 'Test262Error: "+275760-09-13T00:00Z[UTC]" is outside the representable range for a relativeTo parameter after conversion to DateTime Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: "+275760-09-13T00:00Z[UTC]" is outside the representable range for a relativeTo parameter after conversion to DateTime Expected a RangeError to be thrown but no exception was thrown at all' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/prototype/total/relativeto-string.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/built-ins/Temporal/Duration/prototype/total/relativeto-total-of-each-unit.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(63072000_000_000_000n /* = 1972-01-01T00Z */, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(63072000_000_000_000n /* = 1972-01-01T00Z */, \"UTC\")')" -test/built-ins/Temporal/Duration/prototype/total/relativeto-unit-weeks-balances-hours-into-days.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/Duration/prototype/total/rounding-window.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' +test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-large-time-component-out-of-range.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" test/built-ins/Temporal/Duration/prototype/total/throws-if-date-time-invalid-with-zoneddatetime-relative.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(864n * 10n**19n - 1n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(864n * 10n**19n - 1n, \"UTC\")')" @@ -265,186 +142,18 @@ test/built-ins/Temporal/Duration/prototype/total/throws-if-target-nanoseconds-ou test/built-ins/Temporal/Duration/prototype/total/zero-duration.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'UTC')')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'UTC')')" -test/built-ins/Temporal/Instant/prototype/toString/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.timeZone, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.timeZone] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.timeZone, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.timeZone] should have the same contents. all options should be read first' -test/built-ins/Temporal/Instant/prototype/toString/order-of-operations.js: - default: 'Error: FIXME: Temporal.Instant.toString({timeZone}) not implemented yet' - strict mode: 'Error: FIXME: Temporal.Instant.toString({timeZone}) not implemented yet' -test/built-ins/Temporal/Instant/prototype/toString/timezone-string-sub-minute-offset.js: - default: 'Test262Error: -12:12:59.9 is not a valid time zone string Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: -12:12:59.9 is not a valid time zone string Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js: - default: 'Test262Error: null does not convert to a valid ISO string Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: null does not convert to a valid ISO string Expected a TypeError but got a RangeError' -test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-case-insensitive.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/compare/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID (first argument) Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID (first argument) Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/from/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDate/from/month-code-wrong-type.js: - default: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' -test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-primitive.js: - default: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. Failing call before options is processed' - strict mode: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. Failing call before options is processed' -test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js: - default: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. options read after ISO string parsing' - strict mode: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. options read after ISO string parsing' -test/built-ins/Temporal/PlainDate/from/options-wrong-type.js: - default: 'Test262Error: Invalid string processed before throwing TypeError Expected a RangeError but got a TypeError' - strict mode: 'Test262Error: Invalid string processed before throwing TypeError Expected a RangeError but got a TypeError' test/built-ins/Temporal/PlainDate/from/order-of-operations.js: default: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' strict mode: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDate/prototype/era/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"era\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"era\").get')" -test/built-ins/Temporal/PlainDate/prototype/era/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainDate/prototype/eraYear/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"eraYear\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"eraYear\").get')" -test/built-ins/Temporal/PlainDate/prototype/eraYear/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/prototype/since/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDate/prototype/since/calendar-id-match.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-half-boundary.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/PlainDate/prototype/toString/order-of-operations.js: - default: 'Test262Error: Actual [] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/prototype/until/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDate/prototype/until/calendar-id-match.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-half-boundary.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/PlainDate/prototype/yearOfWeek/basic.js: - default: 'Test262Error: 1975-12-29 should be in yearOfWeek 1976 Expected SameValue(«undefined», «1976») to be true' - strict mode: 'Test262Error: 1975-12-29 should be in yearOfWeek 1976 Expected SameValue(«undefined», «1976») to be true' -test/built-ins/Temporal/PlainDate/prototype/yearOfWeek/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"yearOfWeek\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, \"yearOfWeek\").get')" -test/built-ins/Temporal/PlainDate/prototype/yearOfWeek/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainDateTime/argument-convert.js: - default: 'Test262Error: year undefined Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: year undefined Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-case-insensitive.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDateTime/compare/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID (first argument) Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID (first argument) Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDateTime/from/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDateTime/from/month-code-wrong-type.js: - default: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' -test/built-ins/Temporal/PlainDateTime/from/observable-get-overflow-argument-string-invalid.js: - default: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. options read after string parsing' - strict mode: 'Test262Error: Actual [get options.overflow, get options.overflow.toString, call options.overflow.toString] and expected [] should have the same contents. options read after string parsing' -test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js: - default: 'Test262Error: Invalid string processed before throwing TypeError Expected a RangeError but got a TypeError' - strict mode: 'Test262Error: Invalid string processed before throwing TypeError Expected a RangeError but got a TypeError' +test/built-ins/Temporal/PlainDate/prototype/since/exact-multiple-of-larger-unit.js: + default: 'Test262Error: P1M weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' + strict mode: 'Test262Error: P1M weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' +test/built-ins/Temporal/PlainDate/prototype/until/exact-multiple-of-larger-unit.js: + default: 'Test262Error: P1M weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' + strict mode: 'Test262Error: P1M weeks..months ceil: weeks result: Expected SameValue(«1», «0») to be true' test/built-ins/Temporal/PlainDateTime/from/order-of-operations.js: - default: 'Test262Error: Actual [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-iso-string.js: - default: 'RangeError: invalid calendar ID' - strict mode: 'RangeError: invalid calendar ID' -test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-calendar-invalid-iso-string.js: - default: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Unknown calendar is not a valid calendar ID Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDateTime/prototype/era/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"era\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"era\").get')" -test/built-ins/Temporal/PlainDateTime/prototype/era/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainDateTime/prototype/eraYear/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"eraYear\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"eraYear\").get')" -test/built-ins/Temporal/PlainDateTime/prototype/eraYear/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainDateTime/prototype/toString/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString, get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString, get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' -test/built-ins/Temporal/PlainDateTime/prototype/toString/order-of-operations.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString, get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.calendarName, get options.calendarName.toString, call options.calendarName.toString, get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-edge-of-range.js: - default: 'Test262Error: Rounding down can go out of range Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: Rounding down can go out of range Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js: - default: 'Test262Error: Actual [get fields.calendar, get fields.timeZone, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf] and expected [get fields.calendar, get fields.timeZone, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [get fields.calendar, get fields.timeZone, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf] and expected [get fields.calendar, get fields.timeZone, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.hour, get fields.hour.valueOf, call fields.hour.valueOf, get fields.microsecond, get fields.microsecond.valueOf, call fields.microsecond.valueOf, get fields.millisecond, get fields.millisecond.valueOf, call fields.millisecond.valueOf, get fields.minute, get fields.minute.valueOf, call fields.minute.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.nanosecond, get fields.nanosecond.valueOf, call fields.nanosecond.valueOf, get fields.second, get fields.second.valueOf, call fields.second.valueOf, get fields.year, get fields.year.valueOf, call fields.year.valueOf, get options.overflow, get options.overflow.toString, call options.overflow.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainDateTime/prototype/yearOfWeek/basic.js: - default: 'Test262Error: check yearOfWeek information Expected SameValue(«undefined», «1976») to be true' - strict mode: 'Test262Error: check yearOfWeek information Expected SameValue(«undefined», «1976») to be true' -test/built-ins/Temporal/PlainDateTime/prototype/yearOfWeek/branding.js: - default: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"yearOfWeek\").get')" - strict mode: "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(Temporal.PlainDateTime.prototype, \"yearOfWeek\").get')" -test/built-ins/Temporal/PlainDateTime/prototype/yearOfWeek/prop-desc.js: - default: "TypeError: undefined is not an object (evaluating 'descriptor.get')" - strict mode: "TypeError: undefined is not an object (evaluating 'descriptor.get')" -test/built-ins/Temporal/PlainMonthDay/from/argument-string-calendar-case-insensitive.js: - default: 'RangeError: Temporal.PlainMonthDay.from: invalid date string 11-18[+01:00][u-ca=ISO8601]' - strict mode: 'RangeError: Temporal.PlainMonthDay.from: invalid date string 11-18[+01:00][u-ca=ISO8601]' -test/built-ins/Temporal/PlainMonthDay/from/iso-year-used-only-for-overflow.js: - default: 'RangeError: year is out of range' - strict mode: 'RangeError: year is out of range' -test/built-ins/Temporal/PlainMonthDay/from/order-of-operations.js: - default: 'Test262Error: Actual [] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] should have the same contents. item fields are read before TypeError is thrown for primitive options' - strict mode: 'Test262Error: Actual [] and expected [get fields.calendar, get fields.day, get fields.day.valueOf, call fields.day.valueOf, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] should have the same contents. item fields are read before TypeError is thrown for primitive options' -test/built-ins/Temporal/PlainMonthDay/prototype/with/iso-year-used-only-for-overflow.js: - default: 'RangeError: year is out of range' - strict mode: 'RangeError: year is out of range' -test/built-ins/Temporal/PlainTime/argument-convert.js: - default: 'Test262Error: hour string Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: hour string Expected a RangeError to be thrown but no exception was thrown at all' + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js: default: 'Test262Error: Actual [get overflow, get overflow.toString, call overflow.toString] and expected [] should have the same contents. options read after ISO string parsing' strict mode: 'Test262Error: Actual [get overflow, get overflow.toString, call overflow.toString] and expected [] should have the same contents. options read after ISO string parsing' @@ -454,51 +163,12 @@ test/built-ins/Temporal/PlainTime/from/options-wrong-type.js: test/built-ins/Temporal/PlainTime/from/order-of-operations.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" -test/built-ins/Temporal/PlainTime/prototype/toString/options-read-before-algorithmic-validation.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. all options should be read first' -test/built-ins/Temporal/PlainTime/prototype/toString/order-of-operations.js: - default: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' - strict mode: 'Test262Error: Actual [get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString] and expected [get options.fractionalSecondDigits, get options.fractionalSecondDigits.toString, call options.fractionalSecondDigits.toString, get options.roundingMode, get options.roundingMode.toString, call options.roundingMode.toString, get options.smallestUnit, get options.smallestUnit.toString, call options.smallestUnit.toString] should have the same contents. order of operations' -test/built-ins/Temporal/PlainYearMonth/from/argument-string-calendar-case-insensitive.js: - default: 'RangeError: Temporal.PlainYearMonth.from: invalid date string 1976-11[u-ca=ISO8601]' - strict mode: 'RangeError: Temporal.PlainYearMonth.from: invalid date string 1976-11[u-ca=ISO8601]' -test/built-ins/Temporal/PlainYearMonth/from/month-code-wrong-type.js: - default: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' - strict mode: 'Test262Error: month code 5 should be rejected Expected a TypeError but got a RangeError' -test/built-ins/Temporal/PlainYearMonth/from/order-of-operations.js: - default: 'Test262Error: Actual [] and expected [get fields.calendar, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] should have the same contents. item fields are read before TypeError is thrown for primitive options' - strict mode: 'Test262Error: Actual [] and expected [get fields.calendar, get fields.month, get fields.month.valueOf, call fields.month.valueOf, get fields.monthCode, get fields.monthCode.toString, call fields.monthCode.toString, get fields.year, get fields.year.valueOf, call fields.year.valueOf] should have the same contents. item fields are read before TypeError is thrown for primitive options' -test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-lower-units.js: - default: 'Test262Error: adding a unit lower than months should throw, no options Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: adding a unit lower than months should throw, no options Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainYearMonth/prototype/add/options-read-before-algorithmic-validation.js: - default: 'Test262Error: exception thrown when attempting to add too-low unit Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: exception thrown when attempting to add too-low unit Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow.js: - default: 'RangeError: date time is out of range of ECMAScript representation' - strict mode: 'RangeError: date time is out of range of ECMAScript representation' -test/built-ins/Temporal/PlainYearMonth/prototype/add/subtract-from-last-representable-month.js: - default: 'RangeError: date time is out of range of ECMAScript representation' - strict mode: 'RangeError: date time is out of range of ECMAScript representation' -test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-half-boundary.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-lower-units.js: - default: 'Test262Error: subtracting a unit lower than months should throw, no options Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: subtracting a unit lower than months should throw, no options Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-read-before-algorithmic-validation.js: - default: 'Test262Error: exception thrown when attempting to add too-low unit Expected a RangeError to be thrown but no exception was thrown at all' - strict mode: 'Test262Error: exception thrown when attempting to add too-low unit Expected a RangeError to be thrown but no exception was thrown at all' -test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow.js: - default: 'RangeError: date time is out of range of ECMAScript representation' - strict mode: 'RangeError: date time is out of range of ECMAScript representation' -test/built-ins/Temporal/PlainYearMonth/prototype/subtract/subtract-from-last-representable-month.js: - default: 'RangeError: date time is out of range of ECMAScript representation' - strict mode: 'RangeError: date time is out of range of ECMAScript representation' -test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-half-boundary.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' +test/built-ins/Temporal/PlainYearMonth/prototype/since/exact-multiple-of-larger-unit.js: + default: 'Test262Error: P1Y months..years ceil: months result: Expected SameValue(«2», «0») to be true' + strict mode: 'Test262Error: P1Y months..years ceil: months result: Expected SameValue(«2», «0») to be true' +test/built-ins/Temporal/PlainYearMonth/prototype/until/exact-multiple-of-larger-unit.js: + default: 'Test262Error: P1Y months..years ceil: months result: Expected SameValue(«2», «0») to be true' + strict mode: 'Test262Error: P1Y months..years ceil: months result: Expected SameValue(«2», «0») to be true' test/built-ins/Temporal/getOwnPropertyNames.js: default: 'Test262Error: ZonedDateTime' strict mode: 'Test262Error: ZonedDateTime' @@ -517,90 +187,18 @@ test/built-ins/Uint8Array/prototype/setFromBase64/trailing-garbage-empty.js: test/built-ins/Uint8Array/prototype/setFromBase64/trailing-garbage.js: default: 'SyntaxError: Uint8Array.prototype.setFromBase64 requires a valid base64 string' strict mode: 'SyntaxError: Uint8Array.prototype.setFromBase64 requires a valid base64 string' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-format-weekday-long.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' test/intl402/DateTimeFormat/prototype/format/temporal-objects-format-with-era.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-ignore-timezone.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-no-time-clip-non-latin-numerals.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-no-time-clip-weekday.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-no-time-clip.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-objects-not-overlapping-options.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plaindate-formatting-datetime-style.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plaindate-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plaindatetime-formatting-datetime-style.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plaindatetime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plainmonthday-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' - strict mode: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' + default: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' + strict mode: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' test/intl402/DateTimeFormat/prototype/format/temporal-plaintime-formatting-datetime-style.js: - default: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' - strict mode: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plaintime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' - strict mode: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' -test/intl402/DateTimeFormat/prototype/format/temporal-plainyearmonth-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' - strict mode: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' + default: 'Test262Error: dateStyle = full, timeStyle = full Expected SameValue(«"12:34:56 AM"», «"12:34:56 AM Greenwich Mean Time"») to be true' + strict mode: 'Test262Error: dateStyle = full, timeStyle = full Expected SameValue(«"12:34:56 AM"», «"12:34:56 AM Greenwich Mean Time"») to be true' test/intl402/DateTimeFormat/prototype/format/temporal-zoneddatetime-not-supported.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" test/intl402/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville')')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville')')" -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-format-with-era.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-ignore-timezone.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-no-time-clip-weekday.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-no-time-clip.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-not-overlapping-options.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-objects-throws-with-different-calendars.js: - default: 'Test262Error: Expected a RangeError but got a TypeError' - strict mode: 'Test262Error: Expected a RangeError but got a TypeError' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-plaindate-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-plaindatetime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-plainmonthday-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' - strict mode: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-plaintime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' - strict mode: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' -test/intl402/DateTimeFormat/prototype/formatRange/temporal-plainyearmonth-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' - strict mode: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' test/intl402/DateTimeFormat/prototype/formatRange/temporal-zoneddatetime-not-supported.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" @@ -610,78 +208,21 @@ test/intl402/DateTimeFormat/prototype/formatRange/to-datetime-formattable-with-d test/intl402/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville')')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville')')" -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-format-with-era.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-ignore-timezone.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-no-time-clip-weekday.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-no-time-clip.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-not-overlapping-options.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-throws-with-different-calendars.js: - default: 'Test262Error: Expected a RangeError but got a TypeError' - strict mode: 'Test262Error: Expected a RangeError but got a TypeError' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-plaindate-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-plaindatetime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-plainmonthday-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' - strict mode: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-plaintime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' - strict mode: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' -test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-plainyearmonth-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' - strict mode: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' test/intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-zoneddatetime-not-supported.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" test/intl402/DateTimeFormat/prototype/formatRangeToParts/to-datetime-formattable-with-different-arg-kinds.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-format-with-era.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-ignore-timezone.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-no-time-clip-weekday.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-no-time-clip.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-not-overlapping-options.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-plaindate-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' - strict mode: 'TypeError: Temporal.PlainDate.prototype.valueOf must not be called. To compare PlainDate values, use Temporal.PlainDate.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-plaindatetime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' - strict mode: 'TypeError: Temporal.PlainDateTime.prototype.valueOf must not be called. To compare PlainDateTime values, use Temporal.PlainDateTime.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-plainmonthday-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' - strict mode: 'TypeError: Temporal.PlainMonthDay.prototype.valueOf must not be called. To compare PlainMonthDay values, use Temporal.PlainDate.compare on the corresponding PlainDate objects.' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-plaintime-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' - strict mode: 'TypeError: Temporal.PlainTime.prototype.valueOf must not be called. To compare PlainTime values, use Temporal.PlainTime.compare' -test/intl402/DateTimeFormat/prototype/formatToParts/temporal-plainyearmonth-formatting-timezonename.js: - default: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' - strict mode: 'TypeError: Temporal.PlainYearMonth.prototype.valueOf must not be called. To compare PlainYearMonth values, use Temporal.PlainYearMonth.compare' test/intl402/DateTimeFormat/prototype/formatToParts/temporal-zoneddatetime-not-supported.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone)')" +test/intl402/FallbackSymbol/per-realm.js: + default: 'Test262Error: %Intl%.[[FallbackSymbol]] should be different per-realm Expected SameValue(«Symbol(IntlLegacyConstructedSymbol)», «Symbol(IntlLegacyConstructedSymbol)») to be false' + strict mode: 'Test262Error: %Intl%.[[FallbackSymbol]] should be different per-realm Expected SameValue(«Symbol(IntlLegacyConstructedSymbol)», «Symbol(IntlLegacyConstructedSymbol)») to be false' +test/intl402/Locale/extensions-grandfathered.js: + default: 'Test262Error: Expected SameValue(«"fr-Cyrl-FR-gaulish-u-nu-latn"», «"fr-Cyrl-FR-u-nu-latn"») to be true' + strict mode: 'Test262Error: Expected SameValue(«"fr-Cyrl-FR-gaulish-u-nu-latn"», «"fr-Cyrl-FR-u-nu-latn"») to be true' test/intl402/NumberFormat/prototype/format/unit-ja-JP.js: default: 'Test262Error: Expected SameValue(«"時速-987キロメートル"», «"時速 -987 キロメートル"») to be true' strict mode: 'Test262Error: Expected SameValue(«"時速-987キロメートル"», «"時速 -987 キロメートル"») to be true' @@ -694,9 +235,18 @@ test/intl402/NumberFormat/prototype/formatToParts/unit-ja-JP.js: test/intl402/NumberFormat/prototype/formatToParts/unit-zh-TW.js: default: 'Test262Error: undefined: length Expected SameValue(«3», «4») to be true' strict mode: 'Test262Error: undefined: length Expected SameValue(«3», «4») to be true' +test/intl402/PluralRules/compactDisplay-undefined-unless-notation-compact.js: + default: 'Test262Error: compactDisplay (compact, long) Expected SameValue(«undefined», «"long"») to be true' + strict mode: 'Test262Error: compactDisplay (compact, long) Expected SameValue(«undefined», «"long"») to be true' +test/intl402/PluralRules/constructor-option-read-order.js: + default: 'Test262Error: Actual [get options.localeMatcher, get options.type, get options.notation, get options.minimumIntegerDigits, get options.minimumFractionDigits, get options.maximumFractionDigits, get options.minimumSignificantDigits, get options.maximumSignificantDigits, get options.roundingIncrement, get options.roundingMode, get options.roundingPriority, get options.trailingZeroDisplay] and expected [get options.localeMatcher, get options.type, get options.notation, get options.compactDisplay, get options.minimumIntegerDigits, get options.minimumFractionDigits, get options.maximumFractionDigits, get options.minimumSignificantDigits, get options.maximumSignificantDigits, get options.roundingIncrement, get options.roundingMode, get options.roundingPriority, get options.trailingZeroDisplay] should have the same contents. Intl.PluralRules options read order' + strict mode: 'Test262Error: Actual [get options.localeMatcher, get options.type, get options.notation, get options.minimumIntegerDigits, get options.minimumFractionDigits, get options.maximumFractionDigits, get options.minimumSignificantDigits, get options.maximumSignificantDigits, get options.roundingIncrement, get options.roundingMode, get options.roundingPriority, get options.trailingZeroDisplay] and expected [get options.localeMatcher, get options.type, get options.notation, get options.compactDisplay, get options.minimumIntegerDigits, get options.minimumFractionDigits, get options.maximumFractionDigits, get options.minimumSignificantDigits, get options.maximumSignificantDigits, get options.roundingIncrement, get options.roundingMode, get options.roundingPriority, get options.trailingZeroDisplay] should have the same contents. Intl.PluralRules options read order' +test/intl402/PluralRules/constructor-options-throwing-getters.js: + default: 'Test262Error: Exception from compactDisplay getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Exception from compactDisplay getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' test/intl402/Temporal/Duration/compare/relativeto-sub-minute-offset.js: - default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/intl402/Temporal/Duration/compare/twenty-five-hour-day.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(941184000_000_000_000n, \"America/Vancouver\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(941184000_000_000_000n, \"America/Vancouver\")')" @@ -704,8 +254,8 @@ test/intl402/Temporal/Duration/prototype/round/adjust-rounded-duration-days.js: default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" test/intl402/Temporal/Duration/prototype/round/dst-balancing-result.js: - default: "TypeError: Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime is not a function. (In 'Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime(timeZone)', 'Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime' is undefined)" - strict mode: "TypeError: Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime is not a function. (In 'Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime(timeZone)', 'Temporal.PlainDateTime.from(\"2000-04-02\").toZonedDateTime' is undefined)" + default: 'Error: Temporal.PlainDateTime.prototype.toZonedDateTime is not yet implemented' + strict mode: 'Error: Temporal.PlainDateTime.prototype.toZonedDateTime is not yet implemented' test/intl402/Temporal/Duration/prototype/round/dst-rounding-result.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(" @@ -713,20 +263,17 @@ test/intl402/Temporal/Duration/prototype/round/relativeto-dst-back-transition.js default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" test/intl402/Temporal/Duration/prototype/round/relativeto-sub-minute-offset.js: - default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' - strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/intl402/Temporal/Duration/prototype/round/rounding-increment-relativeto.js: default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" test/intl402/Temporal/Duration/prototype/round/rounding-with-largestunit.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, \"UTC\")')" -test/intl402/Temporal/Duration/prototype/toLocaleString/returns-same-results-as-DurationFormat.js: - default: 'Test262Error: locale="undefined", options="undefined", duration=""P1Y2M3W4DT5H6M7.00800901S"" Expected SameValue(«"P1Y2M3W4DT5H6M7.00800901S"», «"1 yr, 2 mths, 3 wks, 4 days, 5 hr, 6 min, 7 sec, 8 ms, 9 μs, 10 ns"») to be true' - strict mode: 'Test262Error: locale="undefined", options="undefined", duration=""P1Y2M3W4DT5H6M7.00800901S"" Expected SameValue(«"P1Y2M3W4DT5H6M7.00800901S"», «"1 yr, 2 mths, 3 wks, 4 days, 5 hr, 6 min, 7 sec, 8 ms, 9 μs, 10 ns"») to be true' test/intl402/Temporal/Duration/prototype/total/dst-balancing-result.js: - default: "TypeError: Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime is not a function. (In 'Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime(\"Pacific/Apia\")', 'Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime' is undefined)" - strict mode: "TypeError: Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime is not a function. (In 'Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime(\"Pacific/Apia\")', 'Temporal.PlainDateTime.from(\"2011-12-29T12:00\").toZonedDateTime' is undefined)" + default: 'Error: Temporal.PlainDateTime.prototype.toZonedDateTime is not yet implemented' + strict mode: 'Error: Temporal.PlainDateTime.prototype.toZonedDateTime is not yet implemented' test/intl402/Temporal/Duration/prototype/total/dst-day-length.js: default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(" strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(" @@ -737,26 +284,20 @@ test/intl402/Temporal/Duration/prototype/total/relativeto-dst-back-transition.js default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" test/intl402/Temporal/Duration/prototype/total/relativeto-sub-minute-offset.js: - default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' - strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' -test/intl402/Temporal/Instant/prototype/toLocaleString/basic.js: - default: "TypeError: undefined is not an object (evaluating 'parts.find(({ type }) => type === expectedType).value')" - strict mode: "TypeError: undefined is not an object (evaluating 'parts.find(({ type }) => type === expectedType).value')" + default: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' + strict mode: 'RangeError: relativeTo as ZonedDateTime string is not yet implemented' test/intl402/Temporal/Instant/prototype/toLocaleString/default-includes-time-not-time-zone-name.js: - default: 'Test262Error: Instant formatted with no options 12/26/2024 should include hour' - strict mode: 'Test262Error: Instant formatted with no options 12/26/2024 should include hour' + default: 'Test262Error: Instant formatted with no options 12/26/2024, 11:46:40 AM UTC should not include time zone name' + strict mode: 'Test262Error: Instant formatted with no options 12/26/2024, 11:46:40 AM UTC should not include time zone name' test/intl402/Temporal/Instant/prototype/toLocaleString/era.js: - default: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A"», «"12/31/1969 A, 4:00:00 PM"») to be true' - strict mode: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A"», «"12/31/1969 A, 4:00:00 PM"») to be true' -test/intl402/Temporal/Instant/prototype/toLocaleString/hourcycle.js: - default: 'Test262Error: output for hour12: false should include 00:00:00 Expected SameValue(«false», «true») to be true' - strict mode: 'Test262Error: output for hour12: false should include 00:00:00 Expected SameValue(«false», «true») to be true' -test/intl402/Temporal/Instant/prototype/toLocaleString/lone-options-accepted.js: - default: 'Test262Error: Instant.toLocaleString should format lone option {"timeZoneName":"short"} Expected SameValue(«"12/26/2024, PST"», «"12/26/2024, 3:46:40 AM PST"») to be true' - strict mode: 'Test262Error: Instant.toLocaleString should format lone option {"timeZoneName":"short"} Expected SameValue(«"12/26/2024, PST"», «"12/26/2024, 3:46:40 AM PST"») to be true' + default: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' + strict mode: 'Test262Error: toLocaleString on an Instant with era option should return the same results as toLocaleString on the same Date with the same options Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' +test/intl402/Temporal/Instant/prototype/toLocaleString/option-timezonename-short.js: + default: 'Test262Error: expected "11/18/1976, 9:23:30 AM EST" to be shorter than "11/18/1976, 9:23:30 AM EST".' + strict mode: 'Test262Error: expected "11/18/1976, 9:23:30 AM EST" to be shorter than "11/18/1976, 9:23:30 AM EST".' test/intl402/Temporal/Instant/prototype/toLocaleString/respect-timezone-after-formatting-plaindatetime.js: - default: 'Test262Error: Expected SameValue(«"12/31/1969 A"», «"12/31/1969 A, 4:00:00 PM"») to be true' - strict mode: 'Test262Error: Expected SameValue(«"12/31/1969 A"», «"12/31/1969 A, 4:00:00 PM"») to be true' + default: 'Test262Error: Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' + strict mode: 'Test262Error: Expected SameValue(«"12/31/1969 A, 4:00:00 PM PST"», «"12/31/1969 A, 4:00:00 PM"») to be true' test/language/destructuring/binding/keyed-destructuring-property-reference-target-evaluation-order-with-bindings.js: default: 'Test262Error: Actual [binding::source, binding::sourceKey, sourceKey, get source, binding::defaultValue, binding::varTarget] and expected [binding::source, binding::sourceKey, sourceKey, binding::varTarget, get source, binding::defaultValue] should have the same contents. ' test/language/eval-code/direct/arrow-fn-body-cntns-arguments-func-decl-arrow-func-declare-arguments-assign-incl-def-param-arrow-arguments.js: @@ -776,8 +317,8 @@ test/language/eval-code/direct/arrow-fn-no-pre-existing-arguments-bindings-are-p test/language/eval-code/direct/arrow-fn-no-pre-existing-arguments-bindings-are-present-arrow-func-declare-arguments-assign.js: default: 'Test262Error: globalThis.arguments unchanged Expected SameValue(«"param"», «undefined») to be true' test/language/expressions/assignment/fn-name-lhs-cover.js: - default: "Test262Error: obj['name'] descriptor value should be ; obj['name'] value should be " - strict mode: "Test262Error: obj['name'] descriptor value should be ; obj['name'] value should be " + default: 'Test262Error: name descriptor value should be ; name value should be ' + strict mode: 'Test262Error: name descriptor value should be ; name value should be ' test/language/expressions/call/tco-non-eval-function-dynamic.js: default: 'RangeError: Maximum call stack size exceeded.' test/language/expressions/call/tco-non-eval-function.js: @@ -839,9 +380,6 @@ test/language/statements/async-generator/yield-star-return-then-getter-ticks.js: strict mode: 'Test262:AsyncTestFailure:Test262Error: Test262Error: Actual [start, tick 1, tick 2, get then, tick 3, get return, get then] and expected [start, tick 1, get then, tick 2, get return, get then, tick 3] should have the same contents. Ticks for return with thenable getter' test/language/statements/class/elements/private-class-field-on-nonextensible-objects.js: strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' -test/language/statements/class/subclass/default-constructor-spread-override.js: - default: 'Test262Error: @@iterator invoked' - strict mode: 'Test262Error: @@iterator invoked' test/language/statements/class/subclass/private-class-field-on-nonextensible-return-override.js: strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' test/language/statements/for-await-of/head-lhs-async.js: @@ -865,11 +403,20 @@ test/staging/sm/ArrayBuffer/slice-species.js: default: 'Test262Error: Expected SameValue(«function ArrayBuffer() {' strict mode: 'Test262Error: Expected SameValue(«function ArrayBuffer() {' test/staging/sm/Date/to-temporal-instant.js: - default: "TypeError: min.toZonedDateTimeISO is not a function. (In 'min.toZonedDateTimeISO('UTC')', 'min.toZonedDateTimeISO' is undefined)" - strict mode: "TypeError: min.toZonedDateTimeISO is not a function. (In 'min.toZonedDateTimeISO('UTC')', 'min.toZonedDateTimeISO' is undefined)" + default: 'TypeError: Temporal.Instant.prototype.toZonedDateTimeISO is not yet implemented' + strict mode: 'TypeError: Temporal.Instant.prototype.toZonedDateTimeISO is not yet implemented' test/staging/sm/Date/two-digit-years.js: default: 'Test262Error: Expected SameValue(«NaN», «957164400000») to be true' strict mode: 'Test262Error: Expected SameValue(«NaN», «957164400000») to be true' +test/staging/sm/Error/constructor-proto.js: + default: 'Test262Error: Expected SameValue(«function () {' + strict mode: 'Test262Error: Expected SameValue(«function () {' +test/staging/sm/Error/prototype-properties.js: + default: 'Test262Error: Expected SameValue(«"constructor,message,name,toString"», «"constructor,message,name"») to be true' + strict mode: 'Test262Error: Expected SameValue(«"constructor,message,name,toString"», «"constructor,message,name"») to be true' +test/staging/sm/Error/prototype.js: + default: 'Test262Error: Expected SameValue(«[object Object]», «Error») to be true' + strict mode: 'Test262Error: Expected SameValue(«[object Object]», «Error») to be true' test/staging/sm/Function/arguments-parameter-shadowing.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' test/staging/sm/Function/function-name-assignment.js: @@ -897,9 +444,6 @@ test/staging/sm/RegExp/unicode-class-braced.js: test/staging/sm/TypedArray/slice-memcpy.js: default: 'Test262Error: Actual [1, 2, 1, 2, 3, 4] and expected [1, 2, 1, 2, 1, 2] should have the same contents. ' strict mode: 'Test262Error: Actual [1, 2, 1, 2, 3, 4] and expected [1, 2, 1, 2, 1, 2] should have the same contents. ' -test/staging/sm/class/defaultConstructorDerivedSpread.js: - default: 'Error: unexpected call' - strict mode: 'Error: unexpected call' test/staging/sm/class/superPropOrdering.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' diff --git a/JSTests/test262/harness/assert.js b/JSTests/test262/harness/assert.js index 7ced0cd0b412..b4827d2f5ac0 100644 --- a/JSTests/test262/harness/assert.js +++ b/JSTests/test262/harness/assert.js @@ -3,10 +3,52 @@ /*--- description: | Collection of assertion functions used throughout test262 -defines: [assert] +defines: + - assert + - formatIdentityFreeValue + - formatSimpleValue + - isNegativeZero + - isPrimitive ---*/ +function isNegativeZero(value) { + return value === 0 && 1 / value === -Infinity; +} + +function isPrimitive(value) { + return !value || (typeof value !== 'object' && typeof value !== 'function'); +} + +function formatIdentityFreeValue(value) { + switch (value === null ? 'null' : typeof value) { + case 'string': + return typeof JSON !== "undefined" ? JSON.stringify(value) : '"' + value + '"'; + case 'bigint': + return String(value) + "n"; + case 'number': + if (isNegativeZero(value)) return '-0'; + // falls through + case 'boolean': + case 'undefined': + case 'null': + return String(value); + } +} + +function formatSimpleValue(value) { + var basic = formatIdentityFreeValue(value); + if (basic) return basic; + try { + return String(value); + } catch (err) { + if (err.name === 'TypeError') { + return Object.prototype.toString.call(value); + } + throw err; + } +} + function assert(mustBeTrue, message) { if (mustBeTrue === true) { return; @@ -101,10 +143,6 @@ assert.throws = function (expectedErrorConstructor, func, message) { throw new Test262Error(message); }; -function isPrimitive(value) { - return !value || (typeof value !== 'object' && typeof value !== 'function'); -} - assert.compareArray = function (actual, expected, message) { message = message === undefined ? '' : message; @@ -113,15 +151,15 @@ assert.compareArray = function (actual, expected, message) { } if (isPrimitive(actual)) { - assert(false, `Actual argument [${actual}] shouldn't be primitive. ${message}`); + assert(false, "Actual argument [" + actual + "] shouldn't be primitive. " + String(message)); } else if (isPrimitive(expected)) { - assert(false, `Expected argument [${expected}] shouldn't be primitive. ${message}`); + assert(false, "Expected argument [" + expected + "] shouldn't be primitive. " + String(message)); } var result = compareArray(actual, expected); if (result) return; var format = compareArray.format; - assert(false, `Actual ${format(actual)} and expected ${format(expected)} should have the same contents. ${message}`); + assert(false, "Actual " + format(actual) + " and expected " + format(expected) + " should have the same contents. " + String(message)); }; function compareArray(a, b) { @@ -137,34 +175,9 @@ function compareArray(a, b) { } compareArray.format = function (arrayLike) { - return `[${Array.prototype.map.call(arrayLike, String).join(', ')}]`; + return "[" + Array.prototype.map.call(arrayLike, String).join(", ") + "]"; }; -assert._formatIdentityFreeValue = function formatIdentityFreeValue(value) { - switch (value === null ? 'null' : typeof value) { - case 'string': - return typeof JSON !== "undefined" ? JSON.stringify(value) : `"${value}"`; - case 'bigint': - return `${value}n`; - case 'number': - if (value === 0 && 1 / value === -Infinity) return '-0'; - // falls through - case 'boolean': - case 'undefined': - case 'null': - return String(value); - } -}; +assert._formatIdentityFreeValue = formatIdentityFreeValue; -assert._toString = function (value) { - var basic = assert._formatIdentityFreeValue(value); - if (basic) return basic; - try { - return String(value); - } catch (err) { - if (err.name === 'TypeError') { - return Object.prototype.toString.call(value); - } - throw err; - } -}; +assert._toString = formatSimpleValue; diff --git a/JSTests/test262/harness/nativeErrors.js b/JSTests/test262/harness/nativeErrors.js new file mode 100644 index 000000000000..dab13c329fc2 --- /dev/null +++ b/JSTests/test262/harness/nativeErrors.js @@ -0,0 +1,52 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: | + Arrays of language-specified Error constructors, plus a helper that + constructs a sample instance with appropriate arguments for the + constructor's signature. + + `nativeErrors` contains every Error constructor whose first argument + is a `message` string: %Error% and the six NativeErrors. + + `allErrorConstructors` additionally includes %AggregateError% and + %SuppressedError% when present in the host. Their constructors have + different signatures (`(errors, message)` and + `(error, suppressed, message)` respectively), so tests that just + iterate as `new Ctor(message)` should prefer `nativeErrors`; tests + that need to cover every Error-like constructor should use + `allErrorConstructors` together with `makeNativeError`. +defines: [nativeErrors, allErrorConstructors, makeNativeError] +---*/ + +var nativeErrors = [ + Error, + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError +]; + +var allErrorConstructors = nativeErrors.slice(); +if (typeof AggregateError !== 'undefined') { + allErrorConstructors.push(AggregateError); +} +if (typeof SuppressedError !== 'undefined') { + allErrorConstructors.push(SuppressedError); +} + +function makeNativeError(Ctor, useNew) { + if (typeof AggregateError !== 'undefined' && Ctor === AggregateError) { + return useNew + ? new AggregateError([new Error('inner')], 'msg') + : AggregateError([new Error('inner')], 'msg'); + } + if (typeof SuppressedError !== 'undefined' && Ctor === SuppressedError) { + return useNew + ? new SuppressedError(new Error('inner'), new Error('suppressed'), 'msg') + : SuppressedError(new Error('inner'), new Error('suppressed'), 'msg'); + } + return useNew ? new Ctor('msg') : Ctor('msg'); +} diff --git a/JSTests/test262/harness/propertyHelper.js b/JSTests/test262/harness/propertyHelper.js index 51cc80c88089..0acccfe87f0c 100644 --- a/JSTests/test262/harness/propertyHelper.js +++ b/JSTests/test262/harness/propertyHelper.js @@ -7,6 +7,7 @@ description: | defines: - verifyProperty - verifyCallableProperty + - verifyAccessorProperty - verifyEqualTo # deprecated - verifyWritable # deprecated - verifyNotWritable # deprecated @@ -16,6 +17,7 @@ defines: - verifyNotConfigurable # deprecated - verifyPrimordialProperty - verifyPrimordialCallableProperty + - verifyPrimordialAccessorProperty ---*/ // @ts-check @@ -37,6 +39,7 @@ var nonIndexNumericPropertyName = Math.pow(2, 32) - 1; * @param {string|symbol} name * @param {PropertyDescriptor|undefined} desc * @param {object} [options] + * @param {boolean} [options.label] * @param {boolean} [options.restore] revert mutations from verifying writable/configurable */ function verifyProperty(obj, name, desc, options) { @@ -44,26 +47,23 @@ function verifyProperty(obj, name, desc, options) { arguments.length > 2, 'verifyProperty should receive at least 3 arguments: obj, name, and descriptor' ); + var label = options && options.label || String(name); var originalDesc = __getOwnPropertyDescriptor(obj, name); - var nameStr = String(name); // Allows checking for undefined descriptor if it's explicitly given. if (desc === undefined) { assert.sameValue( originalDesc, undefined, - "obj['" + nameStr + "'] descriptor should be undefined" + label + " descriptor should be undefined" ); // desc and originalDesc are both undefined, problem solved; return true; } - assert( - __hasOwnProperty(obj, name), - "obj should have an own property " + nameStr - ); + assert(__hasOwnProperty(obj, name), label + " should be an own property"); assert.notSameValue( desc, @@ -86,7 +86,7 @@ function verifyProperty(obj, name, desc, options) { names[i] === "configurable" || names[i] === "get" || names[i] === "set", - "Invalid descriptor field: " + names[i], + "Invalid descriptor field: " + names[i] ); } @@ -94,17 +94,17 @@ function verifyProperty(obj, name, desc, options) { if (__hasOwnProperty(desc, 'value')) { if (!isSameValue(desc.value, originalDesc.value)) { - __push(failures, "obj['" + nameStr + "'] descriptor value should be " + desc.value); + __push(failures, label + " descriptor value should be " + String(desc.value)); } if (!isSameValue(desc.value, obj[name])) { - __push(failures, "obj['" + nameStr + "'] value should be " + desc.value); + __push(failures, label + " value should be " + String(desc.value)); } } if (__hasOwnProperty(desc, 'enumerable') && desc.enumerable !== undefined) { if (desc.enumerable !== originalDesc.enumerable || desc.enumerable !== isEnumerable(obj, name)) { - __push(failures, "obj['" + nameStr + "'] descriptor should " + (desc.enumerable ? '' : 'not ') + "be enumerable"); + __push(failures, label + " descriptor should " + (desc.enumerable ? '' : 'not ') + "be enumerable"); } } @@ -113,14 +113,14 @@ function verifyProperty(obj, name, desc, options) { if (__hasOwnProperty(desc, 'writable') && desc.writable !== undefined) { if (desc.writable !== originalDesc.writable || desc.writable !== isWritable(obj, name)) { - __push(failures, "obj['" + nameStr + "'] descriptor should " + (desc.writable ? '' : 'not ') + "be writable"); + __push(failures, label + " descriptor should " + (desc.writable ? '' : 'not ') + "be writable"); } } if (__hasOwnProperty(desc, 'configurable') && desc.configurable !== undefined) { if (desc.configurable !== originalDesc.configurable || desc.configurable !== isConfigurable(obj, name)) { - __push(failures, "obj['" + nameStr + "'] descriptor should " + (desc.configurable ? '' : 'not ') + "be configurable"); + __push(failures, label + " descriptor should " + (desc.configurable ? '' : 'not ') + "be configurable"); } } @@ -219,13 +219,17 @@ function isWritable(obj, name, verifyProp, value) { * @param {number} functionLength * @param {PropertyDescriptor} [desc] defaults to data property conventions (writable, non-enumerable, configurable) * @param {object} [options] + * @param {boolean} [options.label] + * @param {typeof verifyProperty} [options.verifyProperty] * @param {boolean} [options.restore] revert mutations from verifying writable/configurable */ function verifyCallableProperty(obj, name, functionName, functionLength, desc, options) { - var value = obj[name]; + var label = options && options.label || String(name); + var propertyVerifier = options && options.verifyProperty || verifyProperty; + + var value = obj && obj[name]; - assert.sameValue(typeof value, "function", - "obj['" + String(name) + "'] descriptor should be a function"); + assert.sameValue(typeof value, "function", label + " should be a function"); // Every other data property described in clauses 19 through 28 and in // Annex B.2 has the attributes { [[Writable]]: true, [[Enumerable]]: false, @@ -242,7 +246,7 @@ function verifyCallableProperty(obj, name, functionName, functionLength, desc, o desc.value = value; } - verifyProperty(obj, name, desc, options); + propertyVerifier(obj, name, desc, options); if (functionName === undefined) { if (typeof name === "symbol") { @@ -256,24 +260,125 @@ function verifyCallableProperty(obj, name, functionName, functionLength, desc, o // [[Configurable]]: true }. // https://tc39.es/ecma262/multipage/ecmascript-standard-built-in-objects.html#sec-ecmascript-standard-built-in-objects // https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-setfunctionname - verifyProperty(value, "name", { + propertyVerifier(value, "name", { value: functionName, writable: false, enumerable: false, configurable: desc.configurable - }, options); + }, { label: label + " name", restore: options && options.restore }); // Unless otherwise specified, the "length" property of a built-in function // object has the attributes { [[Writable]]: false, [[Enumerable]]: false, // [[Configurable]]: true }. // https://tc39.es/ecma262/multipage/ecmascript-standard-built-in-objects.html#sec-ecmascript-standard-built-in-objects // https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-setfunctionlength - verifyProperty(value, "length", { + propertyVerifier(value, "length", { value: functionLength, writable: false, enumerable: false, configurable: desc.configurable - }, options); + }, { label: label + " length", restore: options && options.restore }); +} + +/** + * Verify that there is an accessor property associated with `obj[name]` and + * following the conventions for built-in objects. + * + * @param {object} obj + * @param {string|symbol} name + * @param {object} desc + * @param {boolean} [desc.enumerable] defaults to accessor property conventions (non-enumerable) + * @param {boolean} [desc.configurable] defaults to accessor property conventions (configurable) + * @param {undefined | Function | {name?: string|symbol, length?: number}} [desc.get] if an object, + * absent fields default to getter conventions (name derived from the property key with a "get " + * prefix, length 0) + * @param {undefined | Function | {name?: string|symbol, length?: number}} [desc.set] if an object, + * absent fields default to getter conventions (name derived from the property key with a "set " + * prefix, length 1) + * @param {object} [options] + * @param {boolean} [options.label] + * @param {typeof verifyProperty} [options.verifyProperty] + * @param {typeof verifyCallableProperty} [options.verifyCallableProperty] + * @param {boolean} [options.restore] revert mutations from verifying property attributes + */ +function verifyAccessorProperty(obj, name, desc, options) { + var checkGet = __hasOwnProperty(desc, "get"); + var checkSet = __hasOwnProperty(desc, "set"); + assert( + checkGet || checkSet, + 'verifyAccessorProperty requires at least one of "get" and "set"' + ); + var label = options && options.label || String(name); + var propertyVerifier = options && options.verifyProperty || verifyProperty; + var callabilityVerifier = options && options.verifyCallableProperty || verifyCallableProperty; + + var originalDesc = __getOwnPropertyDescriptor(obj, name); + + // Every built-in function object, including constructors, has a "name" + // property whose value is a String. Unless otherwise specified, this value is + // the name that is given to the function in this specification. Functions + // that are identified as anonymous functions use the empty String as the + // value of the "name" property. For functions that are specified as + // properties of objects, the name value is the property name string used to + // access the function. Functions that are specified as get or set accessor + // functions of built-in properties have "get" or "set" (respectively) passed + // to the prefix parameter when calling CreateBuiltinFunction. + // + // The value of the "name" property is explicitly specified for each built-in + // functions whose property key is a Symbol value. If such an explicitly + // specified value starts with the prefix "get " or "set " and the function + // for which it is specified is a get or set accessor function of a built-in + // property, the value without the prefix is passed to the name parameter, and + // the value "get" or "set" (respectively) is passed to the prefix parameter + // when calling CreateBuiltinFunction. + // https://tc39.es/ecma262/multipage/ecmascript-standard-built-in-objects.html + if (checkGet) { + var expectGetter = desc.get; + var getterLabel = label + " getter"; + if (expectGetter === undefined || typeof expectGetter === "function") { + assert.sameValue(originalDesc.get, expectGetter, getterLabel); + } else { + var getterName = expectGetter.name; + if (getterName === undefined) { + getterName = "get " + (typeof name === "symbol" ? "[" + name.description + "]" : name); + } + var getterLength = expectGetter.length !== undefined ? expectGetter.length : 0; + var getterOptions = { label: getterLabel }; + callabilityVerifier(originalDesc, "get", getterName, getterLength, {}, getterOptions); + } + } + if (checkSet) { + var expectSetter = desc.set; + var setterLabel = label + " setter"; + if (expectSetter === undefined || typeof expectSetter === "function") { + assert.sameValue(originalDesc.set, expectSetter, setterLabel); + } else { + var setterName = expectSetter.name; + if (setterName === undefined) { + setterName = "set " + (typeof name === "symbol" ? "[" + name.description + "]" : name); + } + var setterLength = expectSetter.length !== undefined ? expectSetter.length : 1; + var setterOptions = { label: setterLabel }; + callabilityVerifier(originalDesc, "set", setterName, setterLength, {}, setterOptions); + } + } + + // Every accessor property described in clauses 19 through 28 and in Annex B.2 + // has the attributes { [[Enumerable]]: false, [[Configurable]]: true } unless + // otherwise specified. + // https://tc39.es/ecma262/multipage/ecmascript-standard-built-in-objects.html + var resolvedDesc = { get: originalDesc.get, set: originalDesc.set }; + if (!__hasOwnProperty(desc, "enumerable")) { + resolvedDesc.enumerable = false; + } else if (desc.enumerable !== undefined) { + resolvedDesc.enumerable = desc.enumerable; + } + if (!__hasOwnProperty(desc, "configurable")) { + resolvedDesc.configurable = true; + } else if (desc.configurable !== undefined) { + resolvedDesc.configurable = desc.configurable; + } + propertyVerifier(obj, name, resolvedDesc, options); } /** @@ -367,5 +472,39 @@ var verifyPrimordialProperty = verifyProperty; * Use this function to verify the primordial function-valued properties. * For non-primordial functions, use verifyCallableProperty. * See: https://github.com/tc39/how-we-work/blob/main/terminology.md#primordial + * + * @type {typeof verifyCallableProperty} */ -var verifyPrimordialCallableProperty = verifyCallableProperty; +function verifyPrimordialCallableProperty(obj, name, functionName, functionLength, desc, options) { + var resolvedOptions = { + verifyProperty: options && options.verifyProperty !== undefined + ? options.verifyProperty + : verifyPrimordialProperty + }; + if (options && options.label !== undefined) resolvedOptions.label = options.label; + if (options && options.restore !== undefined) resolvedOptions.restore = options.restore; + + return verifyCallableProperty(obj, name, functionName, functionLength, desc, resolvedOptions); +} + +/** + * Use this function to verify the primordial accessor properties. + * For non-primordial functions, use verifyAccessorProperty. + * See: https://github.com/tc39/how-we-work/blob/main/terminology.md#primordial + * + * @type {typeof verifyAccessorProperty} + */ +function verifyPrimordialAccessorProperty(obj, name, desc, options) { + var resolvedOptions = { + verifyProperty: options && options.verifyProperty !== undefined + ? options.verifyProperty + : verifyPrimordialProperty, + verifyCallableProperty: options && options.verifyCallableProperty !== undefined + ? options.verifyCallableProperty + : verifyPrimordialCallableProperty + }; + if (options && options.label !== undefined) resolvedOptions.label = options.label; + if (options && options.restore !== undefined) resolvedOptions.restore = options.restore; + + return verifyAccessorProperty(obj, name, desc, resolvedOptions); +} diff --git a/JSTests/test262/harness/proxyTrapsHelper.js b/JSTests/test262/harness/proxyTrapsHelper.js index 3bd0256b07a3..5fa3501dcccb 100644 --- a/JSTests/test262/harness/proxyTrapsHelper.js +++ b/JSTests/test262/harness/proxyTrapsHelper.js @@ -7,9 +7,10 @@ description: | defines: [allowProxyTraps] ---*/ -function allowProxyTraps(overrides) { +function allowProxyTraps(overrides, label) { + var prefix = typeof label === 'string' && label.length > 0 ? label + ': ' : ''; function throwTest262Error(msg) { - return function () { throw new Test262Error(msg); }; + return function () { Test262Error.thrower(prefix + msg); }; } if (!overrides) { overrides = {}; } return { diff --git a/JSTests/test262/harness/sta.js b/JSTests/test262/harness/sta.js index c95ed7a264c5..d291a94f4623 100644 --- a/JSTests/test262/harness/sta.js +++ b/JSTests/test262/harness/sta.js @@ -11,6 +11,7 @@ defines: [Test262Error, $DONOTEVALUATE] function Test262Error(message) { + if (!(this instanceof Test262Error)) return new Test262Error(message); this.message = message || ""; } diff --git a/JSTests/test262/harness/temporalHelpers.js b/JSTests/test262/harness/temporalHelpers.js index fb2d3a3fb910..7216cc551fc1 100644 --- a/JSTests/test262/harness/temporalHelpers.js +++ b/JSTests/test262/harness/temporalHelpers.js @@ -113,6 +113,23 @@ var TemporalHelpers = { ], }, + + /** + * Apple's fork of ICU contains code for these calendars, but they are not yet + * allowed to be supported in AvailableCalendars. See + * https://github.com/tc39/ecma402/blob/main/meetings/notes-2025-12-04.md#datetimeformatconstructor-options-calendar-islamic-fallbackjs-should-allow-other-fallback-values-4677 + */ + NotYetSupportedCalendars: [ + "bangla", + "gujarati", + "kannada", + "marathi", + "odia", + "tamil", + "telugu", + "vikram", + ], + /* * Return the canonical era code. */ diff --git a/JSTests/test262/harness/testTypedArray.js b/JSTests/test262/harness/testTypedArray.js index e55e626213b9..a6418c2f70bf 100644 --- a/JSTests/test262/harness/testTypedArray.js +++ b/JSTests/test262/harness/testTypedArray.js @@ -63,10 +63,6 @@ var allTypedArrayConstructors = typedArrayConstructors.concat(bigIntArrayConstru */ var TypedArray = Object.getPrototypeOf(Int8Array); -function isPrimitive(val) { - return !val || (typeof val !== "object" && typeof val !== "function"); -} - function makePassthrough(TA, primitiveOrIterable) { return primitiveOrIterable; } @@ -106,7 +102,7 @@ function makeArrayBuffer(TA, primitiveOrIterable) { return new TA(arr).buffer; } -var makeResizableArrayBuffer, makeGrownArrayBuffer, makeShrunkArrayBuffer; +var makeResizableArrayBuffer, makeGrownArrayBuffer, makeShrunkArrayBuffer, makeImmutableArrayBuffer; if (ArrayBuffer.prototype.resize) { var copyIntoArrayBuffer = function(destBuffer, srcBuffer) { var destView = new Uint8Array(destBuffer); @@ -156,6 +152,17 @@ if (ArrayBuffer.prototype.resize) { return shrunk; }; } +if (ArrayBuffer.prototype.transferToImmutable) { + makeImmutableArrayBuffer = function makeImmutableArrayBuffer(TA, primitiveOrIterable) { + if (isPrimitive(primitiveOrIterable)) { + var n = Number(primitiveOrIterable) * TA.BYTES_PER_ELEMENT; + if (!(n >= 0 && n < 9007199254740992)) return primitiveOrIterable; + return (new ArrayBuffer(n)).transferToImmutable(); + } + var mutable = makeArrayBuffer(TA, primitiveOrIterable); + return mutable.transferToImmutable(); + }; +} var typedArrayCtorArgFactories = [makePassthrough, makeArray, makeArrayLike]; if (makeIterable) typedArrayCtorArgFactories.push(makeIterable); @@ -163,9 +170,10 @@ typedArrayCtorArgFactories.push(makeArrayBuffer); if (makeResizableArrayBuffer) typedArrayCtorArgFactories.push(makeResizableArrayBuffer); if (makeGrownArrayBuffer) typedArrayCtorArgFactories.push(makeGrownArrayBuffer); if (makeShrunkArrayBuffer) typedArrayCtorArgFactories.push(makeShrunkArrayBuffer); +if (makeImmutableArrayBuffer) typedArrayCtorArgFactories.push(makeImmutableArrayBuffer); /** - * @typedef {"passthrough" | "arraylike" | "iterable" | "arraybuffer" | "resizable"} typedArrayArgFactoryFeature + * @typedef {"passthrough" | "arraylike" | "iterable" | "arraybuffer" | "resizable" | "immutable"} typedArrayArgFactoryFeature */ /** @@ -193,7 +201,8 @@ function ctorArgFactoryMatchesSome(argFactory, features) { argFactory === makeArrayBuffer || argFactory === makeResizableArrayBuffer || argFactory === makeGrownArrayBuffer || - argFactory === makeShrunkArrayBuffer + argFactory === makeShrunkArrayBuffer || + argFactory === makeImmutableArrayBuffer ) { return true; } @@ -207,6 +216,9 @@ function ctorArgFactoryMatchesSome(argFactory, features) { return true; } break; + case "immutable": + if (argFactory === makeImmutableArrayBuffer) return true; + break; default: throw Test262Error("unknown feature: " + features[i]); } @@ -321,9 +333,19 @@ var nonAtomicsFriendlyTypedArrayConstructors = floatArrayConstructors.concat([Ui * * @param {typedArrayConstructorCallback} f - the function to call for each typed array constructor. * @param {Array} selected - An optional Array with filtered typed arrays + * @param {typedArrayArgFactoryFeature[]} [includeArgFactories] - for selecting + * initial constructor argument factory functions, rather than starting with + * all argument factories + * @param {typedArrayArgFactoryFeature[]} [excludeArgFactories] - for excluding + * constructor argument factory functions, after an initial selection */ -function testWithNonAtomicsFriendlyTypedArrayConstructors(f) { - testWithTypedArrayConstructors(f, nonAtomicsFriendlyTypedArrayConstructors); +function testWithNonAtomicsFriendlyTypedArrayConstructors(f, includeArgFactories, excludeArgFactories) { + testWithAllTypedArrayConstructors( + f, + nonAtomicsFriendlyTypedArrayConstructors, + includeArgFactories, + excludeArgFactories + ); } /** @@ -331,16 +353,26 @@ function testWithNonAtomicsFriendlyTypedArrayConstructors(f) { * * @param {typedArrayConstructorCallback} f - the function to call for each typed array constructor. * @param {Array} selected - An optional Array with filtered typed arrays + * @param {typedArrayArgFactoryFeature[]} [includeArgFactories] - for selecting + * initial constructor argument factory functions, rather than starting with + * all argument factories + * @param {typedArrayArgFactoryFeature[]} [excludeArgFactories] - for excluding + * constructor argument factory functions, after an initial selection */ -function testWithAtomicsFriendlyTypedArrayConstructors(f) { - testWithTypedArrayConstructors(f, [ - Int32Array, - Int16Array, - Int8Array, - Uint32Array, - Uint16Array, - Uint8Array, - ]); +function testWithAtomicsFriendlyTypedArrayConstructors(f, includeArgFactories, excludeArgFactories) { + testWithAllTypedArrayConstructors( + f, + [ + Int32Array, + Int16Array, + Int8Array, + Uint32Array, + Uint16Array, + Uint8Array, + ], + includeArgFactories, + excludeArgFactories + ); } /** @@ -367,7 +399,7 @@ function testTypedArrayConversions(byteConversionValues, fn) { } fn(TA, value, exp, initial); }); - }); + }, null, ["passthrough"]); } /** diff --git a/JSTests/test262/latest-changes-summary.txt b/JSTests/test262/latest-changes-summary.txt index 4f051b7b5ccc..9e3b2d521acf 100644 --- a/JSTests/test262/latest-changes-summary.txt +++ b/JSTests/test262/latest-changes-summary.txt @@ -1,483 +1,780 @@ -A test/built-ins/AsyncDisposableStack/prototype/Symbol.toStringTag.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/adds-value-onDisposeAsync.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/allows-any-value.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/puts-value-onDisposeAsync-on-top-of-stack.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/returns-value.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/throws-if-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/adopt/throws-if-onDisposeAsync-not-callable.js -A test/built-ins/AsyncDisposableStack/prototype/constructor.js -A test/built-ins/AsyncDisposableStack/prototype/defer/adds-onDisposeAsync.js -A test/built-ins/AsyncDisposableStack/prototype/defer/puts-onDisposeAsync-on-top-of-stack.js -A test/built-ins/AsyncDisposableStack/prototype/defer/returns-undefined.js -A test/built-ins/AsyncDisposableStack/prototype/defer/throws-if-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/defer/throws-if-onDisposeAsync-not-callable.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/Symbol.asyncDispose-method-not-async.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/disposes-resources-in-reverse-order.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/does-not-reinvoke-disposers-if-already-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/does-not-reinvoke-disposers-if-dispose-already-started.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/does-not-reject-if-already-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/explicit-await-for-null.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/explicit-await-for-undefined.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/explicit-await-skipped-when-empty.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/rejects-with-error-as-is-if-only-one-error-during-disposal.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/rejects-with-suppressederror-if-multiple-errors-during-disposal.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/resolves-to-undefined.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/returns-promise.js -A test/built-ins/AsyncDisposableStack/prototype/disposeAsync/sets-state-to-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/disposed/returns-false-when-not-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/disposed/returns-true-when-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/move/does-not-dispose-resources.js -A test/built-ins/AsyncDisposableStack/prototype/move/returns-new-asyncdisposablestack-that-contains-moved-resources.js -A test/built-ins/AsyncDisposableStack/prototype/move/returns-new-asyncdisposablestack-that-is-still-pending.js -A test/built-ins/AsyncDisposableStack/prototype/move/returns-new-asyncdisposablestack.js -A test/built-ins/AsyncDisposableStack/prototype/move/sets-state-to-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/move/still-returns-new-asyncdisposablestack-when-subclassed.js -A test/built-ins/AsyncDisposableStack/prototype/move/throws-if-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/use/Symbol.asyncDispose-getter.js -A test/built-ins/AsyncDisposableStack/prototype/use/Symbol.dispose-getter.js -A test/built-ins/AsyncDisposableStack/prototype/use/adds-async-disposable-value.js -A test/built-ins/AsyncDisposableStack/prototype/use/adds-sync-disposable-value.js -A test/built-ins/AsyncDisposableStack/prototype/use/allows-null-value.js -A test/built-ins/AsyncDisposableStack/prototype/use/allows-undefined-value.js -A test/built-ins/AsyncDisposableStack/prototype/use/gets-value-Symbol.asyncDispose-property-once.js -A test/built-ins/AsyncDisposableStack/prototype/use/gets-value-Symbol.dispose-property-after-trying-Symbol.asyncDispose.js -A test/built-ins/AsyncDisposableStack/prototype/use/gets-value-Symbol.dispose-property-once.js -A test/built-ins/AsyncDisposableStack/prototype/use/puts-value-on-top-of-stack.js -A test/built-ins/AsyncDisposableStack/prototype/use/returns-value.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-disposed.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-Symbol.asyncDispose-property-is-null-or-undefined.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-Symbol.asyncDispose-property-not-callable.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-Symbol.dispose-property-is-null-or-undefined.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-Symbol.dispose-property-not-callable.js -A test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-missing-Symbol.asyncDispose-and-Symbol.dispose.js -M test/built-ins/AsyncDisposableStack/prototype/use/throws-if-value-not-object.js -A test/built-ins/DisposableStack/prototype/adopt/throws-if-disposed.js -M test/built-ins/DisposableStack/prototype/constructor.js -A test/built-ins/DisposableStack/prototype/defer/throws-if-disposed.js -A test/built-ins/Number/MAX_VALUE/value.js -A test/built-ins/Number/MIN_VALUE/value.js -A test/built-ins/Promise/allKeyed/arg-is-function.js -A test/built-ins/Promise/allKeyed/arg-not-object-reject-bigint.js -A test/built-ins/Promise/allKeyed/arg-not-object-reject.js -A test/built-ins/Promise/allKeyed/ctx-non-ctor.js -A test/built-ins/Promise/allKeyed/key-order-preserved.js -A test/built-ins/Promise/allKeyed/non-enumerable-properties-ignored.js -A test/built-ins/Promise/allKeyed/prototype-keys-ignored.js -A test/built-ins/Promise/allKeyed/reject-deferred.js -A test/built-ins/Promise/allKeyed/reject-immed.js -A test/built-ins/Promise/allKeyed/resolve-not-callable-reject-with-typeerror.js -A test/built-ins/Promise/allKeyed/resolves-empty-object.js -A test/built-ins/Promise/allKeyed/symbol-keys.js -A test/built-ins/Promise/allSettledKeyed/arg-is-function.js -A test/built-ins/Promise/allSettledKeyed/arg-not-object-reject-bigint.js -A test/built-ins/Promise/allSettledKeyed/arg-not-object-reject.js -A test/built-ins/Promise/allSettledKeyed/ctx-non-ctor.js -A test/built-ins/Promise/allSettledKeyed/key-order-preserved.js -A test/built-ins/Promise/allSettledKeyed/non-enumerable-properties-ignored.js -A test/built-ins/Promise/allSettledKeyed/prototype-keys-ignored.js -A test/built-ins/Promise/allSettledKeyed/resolve-not-callable-reject-with-typeerror.js -A test/built-ins/Promise/allSettledKeyed/resolved-all-fulfilled.js -A test/built-ins/Promise/allSettledKeyed/resolved-all-mixed.js -A test/built-ins/Promise/allSettledKeyed/resolved-all-rejected.js -A test/built-ins/Promise/allSettledKeyed/resolves-empty-object.js -A test/built-ins/Promise/allSettledKeyed/symbol-keys.js -M test/built-ins/Temporal/Duration/compare/order-of-operations.js -M test/built-ins/Temporal/Duration/compare/relativeto-argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/Duration/prototype/days/basic.js -A test/built-ins/Temporal/Duration/prototype/hours/basic.js -A test/built-ins/Temporal/Duration/prototype/microseconds/basic.js -A test/built-ins/Temporal/Duration/prototype/milliseconds/basic.js -A test/built-ins/Temporal/Duration/prototype/minutes/basic.js -A test/built-ins/Temporal/Duration/prototype/months/basic.js -A test/built-ins/Temporal/Duration/prototype/nanoseconds/nanoseconds.js -M test/built-ins/Temporal/Duration/prototype/round/order-of-operations.js -M test/built-ins/Temporal/Duration/prototype/round/relativeto-argument-string-calendar-invalid-iso-string.js +M harness/assert.js +A harness/nativeErrors.js +M harness/propertyHelper.js +M harness/proxyTrapsHelper.js +M harness/sta.js +M harness/temporalHelpers.js +M harness/testTypedArray.js +M test/built-ins/ArrayBuffer/isView/arg-is-typedarray-buffer.js +M test/built-ins/ArrayBuffer/isView/arg-is-typedarray-constructor.js +M test/built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js +M test/built-ins/ArrayBuffer/isView/arg-is-typedarray.js +M test/built-ins/ArrayBuffer/isView/invoked-as-a-fn.js +A test/built-ins/ArrayBuffer/prototype/immutable/prop-desc.js +A test/built-ins/ArrayBuffer/prototype/immutable/return-immutable.js +A test/built-ins/ArrayBuffer/prototype/immutable/this-has-no-arraybufferdata-internal.js +A test/built-ins/ArrayBuffer/prototype/immutable/this-is-not-object.js +A test/built-ins/ArrayBuffer/prototype/immutable/this-is-sharedarraybuffer.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/argument-coercion.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/modify-source-after-return.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/not-a-constructor.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/prop-desc.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-becomes-detached.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-grows.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-has-no-arraybufferdata-internal.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-detached.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-object.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-sharedarraybuffer.js +A test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-shrinks.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/new-length-coercion.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/not-a-constructor.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/prop-desc.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-has-no-arraybufferdata-internal.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-detachable.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-object.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-sharedarraybuffer.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-larger.js +A test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-same-or-smaller.js +M test/built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js +M test/built-ins/Atomics/add/bad-range.js +M test/built-ins/Atomics/add/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/add/good-views.js +A test/built-ins/Atomics/add/immutable-buffer.js +M test/built-ins/Atomics/add/non-shared-bufferdata.js +M test/built-ins/Atomics/add/non-shared-int-views-throws.js +M test/built-ins/Atomics/and/bad-range.js +M test/built-ins/Atomics/and/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/and/good-views.js +A test/built-ins/Atomics/and/immutable-buffer.js +M test/built-ins/Atomics/and/non-shared-bufferdata.js +M test/built-ins/Atomics/and/non-shared-int-views-throws.js +M test/built-ins/Atomics/compareExchange/bad-range.js +M test/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/compareExchange/good-views.js +A test/built-ins/Atomics/compareExchange/immutable-buffer.js +M test/built-ins/Atomics/compareExchange/non-shared-bufferdata.js +M test/built-ins/Atomics/compareExchange/non-shared-int-views-throws.js +M test/built-ins/Atomics/exchange/bad-range.js +M test/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/exchange/good-views.js +A test/built-ins/Atomics/exchange/immutable-buffer.js +M test/built-ins/Atomics/exchange/non-shared-bufferdata.js +M test/built-ins/Atomics/exchange/non-shared-int-views-throws.js +D test/built-ins/Atomics/exchange/nonshared-int-views.js +M test/built-ins/Atomics/isLockFree/bigint/expected-return-value.js +M test/built-ins/Atomics/load/bad-range.js +M test/built-ins/Atomics/load/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/load/good-views.js +M test/built-ins/Atomics/load/non-shared-bufferdata.js +M test/built-ins/Atomics/load/non-shared-int-views-throws.js +A test/built-ins/Atomics/notify/immutable-buffer-returns-0.js +M test/built-ins/Atomics/or/bad-range.js +M test/built-ins/Atomics/or/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/or/good-views.js +A test/built-ins/Atomics/or/immutable-buffer.js +M test/built-ins/Atomics/or/non-shared-bufferdata.js +M test/built-ins/Atomics/or/non-shared-int-views-throws.js +M test/built-ins/Atomics/store/bad-range.js +M test/built-ins/Atomics/store/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/store/good-views.js +A test/built-ins/Atomics/store/immutable-buffer.js +M test/built-ins/Atomics/store/non-shared-bufferdata.js +M test/built-ins/Atomics/store/non-shared-int-views-throws.js +M test/built-ins/Atomics/sub/bad-range.js +M test/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/sub/good-views.js +A test/built-ins/Atomics/sub/immutable-buffer.js +M test/built-ins/Atomics/sub/non-shared-bufferdata.js +M test/built-ins/Atomics/sub/non-shared-int-views-throws.js +M test/built-ins/Atomics/xor/bad-range.js +M test/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js +M test/built-ins/Atomics/xor/good-views.js +A test/built-ins/Atomics/xor/immutable-buffer.js +M test/built-ins/Atomics/xor/non-shared-bufferdata.js +M test/built-ins/Atomics/xor/non-shared-int-views-throws.js +A test/built-ins/Error/prototype/stack/getter-cross-realm.js +A test/built-ins/Error/prototype/stack/getter-data-property-shadows.js +A test/built-ins/Error/prototype/stack/getter-error-as-prototype.js +A test/built-ins/Error/prototype/stack/getter-error-instance.js +A test/built-ins/Error/prototype/stack/getter-error-prototype.js +A test/built-ins/Error/prototype/stack/getter-foreign-new-target.js +A test/built-ins/Error/prototype/stack/getter-no-error-data.js +A test/built-ins/Error/prototype/stack/getter-not-a-constructor.js +A test/built-ins/Error/prototype/stack/getter-receiver-is-proxy.js +A test/built-ins/Error/prototype/stack/getter-subclass.js +A test/built-ins/Error/prototype/stack/getter-this-not-object.js +A test/built-ins/Error/prototype/stack/instance-no-own-stack.js +A test/built-ins/Error/prototype/stack/instance-not-enumerable.js +A test/built-ins/Error/prototype/stack/prop-desc.js +A test/built-ins/Error/prototype/stack/setter-creates-own-property.js +A test/built-ins/Error/prototype/stack/setter-cross-realm.js +A test/built-ins/Error/prototype/stack/setter-delete-round-trip.js +A test/built-ins/Error/prototype/stack/setter-empty-string.js +A test/built-ins/Error/prototype/stack/setter-existing-own-property.js +A test/built-ins/Error/prototype/stack/setter-no-argument.js +A test/built-ins/Error/prototype/stack/setter-non-error-receiver.js +A test/built-ins/Error/prototype/stack/setter-non-extensible-receiver.js +A test/built-ins/Error/prototype/stack/setter-non-string-value.js +A test/built-ins/Error/prototype/stack/setter-non-writable-stack.js +A test/built-ins/Error/prototype/stack/setter-not-a-constructor.js +A test/built-ins/Error/prototype/stack/setter-own-accessor.js +A test/built-ins/Error/prototype/stack/setter-proxy-trap-rejects.js +A test/built-ins/Error/prototype/stack/setter-proxy-trap-throws.js +A test/built-ins/Error/prototype/stack/setter-proxy-wrapping-prototype.js +A test/built-ins/Error/prototype/stack/setter-receiver-is-null-proto.js +A test/built-ins/Error/prototype/stack/setter-receiver-is-other-prototype.js +A test/built-ins/Error/prototype/stack/setter-receiver-is-prototype.js +A test/built-ins/Error/prototype/stack/setter-receiver-is-proxy.js +A test/built-ins/Error/prototype/stack/setter-this-not-object.js +A test/built-ins/Error/prototype/stack/setter-via-assignment.js +A test/built-ins/Iterator/zip/iterator-zip-iteration-strict-checks-remaining-done.js +A test/built-ins/Iterator/zip/result-arrays-are-fresh.js +A test/built-ins/Iterator/zipKeyed/iterator-zip-iteration-strict-checks-remaining-done.js +A test/built-ins/Iterator/zipKeyed/result-objects-are-fresh.js +M test/built-ins/NativeErrors/cause_property_native_error.js +M test/built-ins/NativeErrors/message_property_native_error.js +M test/built-ins/Object/isExtensible/15.2.3.13-0-3.js +A test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-plaindate.js +A test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-zoned.js R100 test/built-ins/Temporal/Duration/prototype/round/relativeTo-ignores-incorrect-properties.js test/built-ins/Temporal/Duration/prototype/round/relativeto-ignores-incorrect-properties.js +A test/built-ins/Temporal/Duration/prototype/round/relativeto-plaindate-large-time-component-out-of-range.js R100 test/built-ins/Temporal/Duration/prototype/round/relativeTo-required-properties.js test/built-ins/Temporal/Duration/prototype/round/relativeto-required-properties.js -A test/built-ins/Temporal/Duration/prototype/round/rounding-increment-relativeto.js -M test/built-ins/Temporal/Duration/prototype/round/rounding-increments.js -A test/built-ins/Temporal/Duration/prototype/round/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/Duration/prototype/seconds/basic.js -A test/built-ins/Temporal/Duration/prototype/sign/basic.js -M test/built-ins/Temporal/Duration/prototype/toString/options-undefined.js -M test/built-ins/Temporal/Duration/prototype/total/order-of-operations.js -M test/built-ins/Temporal/Duration/prototype/total/relativeto-argument-string-calendar-invalid-iso-string.js +A test/built-ins/Temporal/Duration/prototype/round/relativeto-rounding-near-minimum-date.js +A test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-large-time-component-out-of-range.js R100 test/built-ins/Temporal/Duration/prototype/total/relativeTo-must-have-required-properties.js test/built-ins/Temporal/Duration/prototype/total/relativeto-must-have-required-properties.js -A test/built-ins/Temporal/Duration/prototype/total/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/Duration/prototype/weeks/basic.js -A test/built-ins/Temporal/Duration/prototype/years/basic.js -A test/built-ins/Temporal/Instant/compare/argument-string-too-many-decimals.js -M test/built-ins/Temporal/Instant/compare/no-fractional-minutes-hours.js -A test/built-ins/Temporal/Instant/from/argument-string-too-many-decimals.js -M test/built-ins/Temporal/Instant/from/no-fractional-minutes-hours.js -A test/built-ins/Temporal/Instant/prototype/equals/argument-string-too-many-decimals.js -M test/built-ins/Temporal/Instant/prototype/equals/no-fractional-minutes-hours.js -A test/built-ins/Temporal/Instant/prototype/round/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/Instant/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/Instant/prototype/since/largestunit-undefined.js -M test/built-ins/Temporal/Instant/prototype/since/no-fractional-minutes-hours.js -M test/built-ins/Temporal/Instant/prototype/since/options-undefined.js -M test/built-ins/Temporal/Instant/prototype/since/order-of-operations.js -M test/built-ins/Temporal/Instant/prototype/since/roundingincrement-undefined.js -M test/built-ins/Temporal/Instant/prototype/since/smallestunit-undefined.js -M test/built-ins/Temporal/Instant/prototype/toString/options-undefined.js -M test/built-ins/Temporal/Instant/prototype/toString/timezone-string-datetime.js -M test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js -M test/built-ins/Temporal/Instant/prototype/toString/timezone-string-multiple-offsets.js -M test/built-ins/Temporal/Instant/prototype/toString/timezone-string.js -A test/built-ins/Temporal/Instant/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/Instant/prototype/until/largestunit-undefined.js -M test/built-ins/Temporal/Instant/prototype/until/no-fractional-minutes-hours.js -M test/built-ins/Temporal/Instant/prototype/until/options-undefined.js -M test/built-ins/Temporal/Instant/prototype/until/order-of-operations.js -M test/built-ins/Temporal/Instant/prototype/until/roundingincrement-undefined.js -M test/built-ins/Temporal/Instant/prototype/until/smallestunit-undefined.js -M test/built-ins/Temporal/PlainDate/calendar-invalid-iso-string.js -M test/built-ins/Temporal/PlainDate/compare/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDate/compare/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/from/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDate/from/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/from/options-undefined.js -M test/built-ins/Temporal/PlainDate/from/order-of-operations.js -M test/built-ins/Temporal/PlainDate/prototype/add/options-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/add/order-of-operations.js -A test/built-ins/Temporal/PlainDate/prototype/calendarId/basic.js -M test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainDate/prototype/era/basic.js -A test/built-ins/Temporal/PlainDate/prototype/eraYear/basic.js -M test/built-ins/Temporal/PlainDate/prototype/since/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDate/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/since/order-of-operations.js -M test/built-ins/Temporal/PlainDate/prototype/since/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/subtract/options-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/subtract/order-of-operations.js -M test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-object.js -A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js -M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js -A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/prototype/until/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDate/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/until/order-of-operations.js -M test/built-ins/Temporal/PlainDate/prototype/until/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/with/options-undefined.js -M test/built-ins/Temporal/PlainDate/prototype/with/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/calendar-invalid-iso-string.js -M test/built-ins/Temporal/PlainDateTime/compare/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDateTime/compare/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDateTime/from/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDateTime/from/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDateTime/from/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/from/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/from/overflow-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/add/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/add/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-undefined.js -A test/built-ins/Temporal/PlainDateTime/prototype/calendarId/basic.js -M test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainDateTime/prototype/era/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/eraYear/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/hour/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/microsecond/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/millisecond/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/minute/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/nanosecond/basic.js -A test/built-ins/Temporal/PlainDateTime/prototype/round/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/PlainDateTime/prototype/second/basic.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/subtract/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/with/copy-properties-not-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/with/options-undefined.js -M test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js -M test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-undefined.js -A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainMonthDay/calendar-invalid-iso-string.js -M test/built-ins/Temporal/PlainMonthDay/from/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainMonthDay/from/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainMonthDay/from/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainMonthDay/from/iso-year-used-only-for-overflow.js -M test/built-ins/Temporal/PlainMonthDay/from/options-undefined.js -M test/built-ins/Temporal/PlainMonthDay/from/order-of-operations.js -A test/built-ins/Temporal/PlainMonthDay/prototype/calendarId/basic.js -M test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-too-many-decimals.js -D test/built-ins/Temporal/PlainMonthDay/prototype/month/unsupported.js -M test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-undefined.js -M test/built-ins/Temporal/PlainMonthDay/prototype/with/copy-properties-not-undefined.js -A test/built-ins/Temporal/PlainMonthDay/prototype/with/iso-year-used-only-for-overflow.js -M test/built-ins/Temporal/PlainMonthDay/prototype/with/options-undefined.js -M test/built-ins/Temporal/PlainMonthDay/prototype/with/order-of-operations.js -A test/built-ins/Temporal/PlainTime/compare/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainTime/from/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainTime/from/options-undefined.js -M test/built-ins/Temporal/PlainTime/from/order-of-operations.js -A test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainTime/prototype/hour/basic.js -A test/built-ins/Temporal/PlainTime/prototype/microsecond/basic.js -A test/built-ins/Temporal/PlainTime/prototype/millisecond/basic.js -A test/built-ins/Temporal/PlainTime/prototype/minute/basic.js -A test/built-ins/Temporal/PlainTime/prototype/nanosecond/basic.js -A test/built-ins/Temporal/PlainTime/prototype/round/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/PlainTime/prototype/second/basic.js -A test/built-ins/Temporal/PlainTime/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainTime/prototype/since/largestunit-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/since/options-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/since/order-of-operations.js -M test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js -A test/built-ins/Temporal/PlainTime/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainTime/prototype/until/largestunit-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/until/order-of-operations.js -M test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/with/copy-properties-not-undefined.js -M test/built-ins/Temporal/PlainTime/prototype/with/order-of-operations.js -M test/built-ins/Temporal/PlainTime/prototype/with/overflow-undefined.js -M test/built-ins/Temporal/PlainYearMonth/calendar-invalid-iso-string.js -M test/built-ins/Temporal/PlainYearMonth/compare/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainYearMonth/compare/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainYearMonth/compare/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainYearMonth/from/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainYearMonth/from/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainYearMonth/from/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainYearMonth/from/options-undefined.js -M test/built-ins/Temporal/PlainYearMonth/from/order-of-operations.js -M test/built-ins/Temporal/PlainYearMonth/prototype/add/order-of-operations.js -A test/built-ins/Temporal/PlainYearMonth/prototype/calendarId/basic.js -M test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-too-many-decimals.js -A test/built-ins/Temporal/PlainYearMonth/prototype/era/basic.js -A test/built-ins/Temporal/PlainYearMonth/prototype/eraYear/basic.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/options-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/order-of-operations.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/order-of-operations.js -M test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-calendar-annotation.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/options-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/order-of-operations.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingincrement-undefined.js -A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-half-boundary.js -M test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/with/options-undefined.js -M test/built-ins/Temporal/PlainYearMonth/prototype/with/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/calendar-invalid-iso-string.js -M test/built-ins/Temporal/ZonedDateTime/compare/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/ZonedDateTime/compare/argument-string-too-many-decimals.js -M test/built-ins/Temporal/ZonedDateTime/compare/no-fractional-minutes-hours.js -A test/built-ins/Temporal/ZonedDateTime/from/argument-object.js -M test/built-ins/Temporal/ZonedDateTime/from/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/ZonedDateTime/from/argument-string-too-many-decimals.js -A test/built-ins/Temporal/ZonedDateTime/from/argument-string.js -M test/built-ins/Temporal/ZonedDateTime/from/offset-undefined.js -M test/built-ins/Temporal/ZonedDateTime/from/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/from/overflow-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/add/add-large-subseconds.js -M test/built-ins/Temporal/ZonedDateTime/prototype/add/options-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/add/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/calendarId/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/dayOfWeek/basic.js -M test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-too-many-decimals.js -M test/built-ins/Temporal/ZonedDateTime/prototype/equals/no-fractional-minutes-hours.js -A test/built-ins/Temporal/ZonedDateTime/prototype/era/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/eraYear/basic.js -M test/built-ins/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/direction-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/hour/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/microsecond/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/millisecond/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/minute/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/nanosecond/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/offsetNanoseconds/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/round/string-shorthand-no-object-prototype-pollution.js -A test/built-ins/Temporal/ZonedDateTime/prototype/second/basic.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-too-many-decimals.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/no-fractional-minutes-hours.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/options-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingincrement-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-half-boundary.js -M test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/startOfDay/basic.js -M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/subtract-large-subseconds.js -A test/built-ins/Temporal/ZonedDateTime/prototype/timeZoneId/basic.js -A test/built-ins/Temporal/ZonedDateTime/prototype/toPlainDateTime/basic.js -D test/built-ins/Temporal/ZonedDateTime/prototype/toPlainDateTime/pre-epoch.js -M test/built-ins/Temporal/ZonedDateTime/prototype/toString/calendarname-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/toString/offset-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/toString/timezonename-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-calendar-invalid-iso-string.js -A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-too-many-decimals.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/no-fractional-minutes-hours.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/options-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingincrement-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-half-boundary.js -M test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/with/offset-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/with/options-undefined.js -M test/built-ins/Temporal/ZonedDateTime/prototype/with/order-of-operations.js -M test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-undefined.js -A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-too-many-decimals.js -M test/built-ins/WeakMap/prototype/getOrInsert/name.js -M test/built-ins/WeakMap/prototype/has/returns-false-when-symbol-key-not-present.js -M test/built-ins/WeakSet/prototype/has/returns-false-when-symbol-value-not-present.js -A test/intl402/Temporal/Duration/prototype/round/rounding-increment-relativeto.js -A test/intl402/Temporal/Instant/prototype/toLocaleString/datestyle-not-adjusted-when-no-conflicting-options.js -A test/intl402/Temporal/PlainDate/prototype/add/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/add/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/add/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/calendarId/basic.js -A test/intl402/Temporal/PlainDate/prototype/era/basic.js -A test/intl402/Temporal/PlainDate/prototype/eraYear/basic.js -A test/intl402/Temporal/PlainDate/prototype/subtract/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/subtract/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/subtract/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/PlainDate/prototype/toLocaleString/datestyle-not-adjusted-when-no-conflicting-options.js -M test/intl402/Temporal/PlainDate/prototype/toString/options-undefined.js -A test/intl402/Temporal/PlainDateTime/prototype/add/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/add/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/add/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/calendarId/basic.js -A test/intl402/Temporal/PlainDateTime/prototype/era/basic.js -A test/intl402/Temporal/PlainDateTime/prototype/eraYear/basic.js -A test/intl402/Temporal/PlainDateTime/prototype/subtract/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/subtract/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/subtract/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/PlainDateTime/prototype/toLocaleString/datestyle-not-adjusted-when-no-conflicting-options.js -A test/intl402/Temporal/PlainMonthDay/from/chinese-dangi-leap-month-with-year-from-options-bag-overflow-reject.js -A test/intl402/Temporal/PlainMonthDay/from/chinese-dangi-leap-month-with-year-from-options-bag.js -A test/intl402/Temporal/PlainMonthDay/from/chinese-dangi-leap-month-with-year-from-plaindate-overflow-reject.js -A test/intl402/Temporal/PlainMonthDay/from/dont-calculate-month-info-for-out-of-range-year.js -A test/intl402/Temporal/PlainMonthDay/prototype/calendarId/basic.js -A test/intl402/Temporal/PlainYearMonth/prototype/add/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainYearMonth/prototype/add/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainYearMonth/prototype/add/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/PlainYearMonth/prototype/calendarId/basic.js -A test/intl402/Temporal/PlainYearMonth/prototype/era/basic.js -A test/intl402/Temporal/PlainYearMonth/prototype/eraYear/basic.js -A test/intl402/Temporal/PlainYearMonth/prototype/subtract/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/PlainYearMonth/prototype/subtract/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/PlainYearMonth/prototype/subtract/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/add/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/add/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/add/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/calendarId/basic.js -A test/intl402/Temporal/ZonedDateTime/prototype/era/basic.js -A test/intl402/Temporal/ZonedDateTime/prototype/eraYear/basic.js -R100 test/built-ins/Temporal/ZonedDateTime/prototype/round/round-dst-boundaries.js test/intl402/Temporal/ZonedDateTime/prototype/round/round-dst-boundaries.js -A test/intl402/Temporal/ZonedDateTime/prototype/subtract/leap-month-chinese-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/subtract/leap-month-dangi-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/subtract/leap-month-hebrew-numerical-months.js -A test/intl402/Temporal/ZonedDateTime/prototype/timeZoneId/basic.js -A test/intl402/Temporal/ZonedDateTime/prototype/toLocaleString/datestyle-not-adjusted-when-no-conflicting-options.js -A test/language/expressions/dynamic-import/import-attributes/2nd-param-with-type-text.js -A test/language/expressions/dynamic-import/import-defer/import-defer-transitive-async-module/promise-prototype-then-not-called.js -A test/language/import/import-attributes/text-empty.js -A test/language/import/import-attributes/text-empty_FIXTURE -A test/language/import/import-attributes/text-javascript.js -A test/language/import/import-attributes/text-javascript_FIXTURE.js -A test/language/import/import-attributes/text-self.js -A test/language/import/import-attributes/text-string.js -A test/language/import/import-attributes/text-string_FIXTURE -A test/language/import/import-attributes/text-via-namespace.js -A test/language/import/import-attributes/text-via-namespace_FIXTURE -A test/language/import/import-defer/deferred-namespace-object/deferred_ns_export_FIXTURE.js -A test/language/import/import-defer/deferred-namespace-object/dep2_FIXTURE.js -A test/language/import/import-defer/deferred-namespace-object/reexport-deferred-ns-evaluation.js -A test/language/import/import-defer/deferred-namespace-object/setup_FIXTURE.js -A test/language/import/import-defer/evaluation-triggers/ignore-exported-then-super-property-set-exported.js -A test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-super-property-set-exported.js -D test/language/import/import-defer/evaluation-triggers/ignore-super-property-set-exported.js -D test/language/import/import-defer/evaluation-triggers/ignore-super-property-set-not-exported.js -A test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-super-property-set-exported.js -A test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-super-property-set-exported.js -A test/language/import/import-defer/evaluation-triggers/trigger-exported-string-super-property-set-exported.js -A test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-super-property-set-exported.js -A test/language/module-code/instn-star-iee-multi-cycle-same-name-a_FIXTURE.js -A test/language/module-code/instn-star-iee-multi-cycle-same-name-b_FIXTURE.js -A test/language/module-code/instn-star-iee-multi-cycle-same-name-c_FIXTURE.js -A test/language/module-code/instn-star-iee-multi-cycle-same-name-d_FIXTURE.js -A test/language/module-code/instn-star-iee-multi-cycle-same-name.js -A test/language/module-code/instn-star-iee-single-cycle-same-name-a_FIXTURE.js -A test/language/module-code/instn-star-iee-single-cycle-same-name-b_FIXTURE.js -A test/language/module-code/instn-star-iee-single-cycle-same-name-c_FIXTURE.js -A test/language/module-code/instn-star-iee-single-cycle-same-name.js -A test/language/module-code/namespace/internals/super-access-to-tdz-binding.js -A test/language/module-code/namespace/internals/super-set-to-tdz-binding-with-accessor.js -A test/staging/set-is-subset-of-empty-index.js -M test/staging/sm/Atomics/cross-compartment.js -M test/staging/sm/Atomics/detached-buffers.js -M test/staging/sm/DataView/detach-after-construction.js -M test/staging/sm/DataView/get-set-index-range.js -M test/staging/sm/TypedArray/constructor-buffer-sequence.js -M test/staging/sm/TypedArray/constructor-non-detached.js -M test/staging/sm/TypedArray/detached-array-buffer-checks.js -M test/staging/sm/TypedArray/fill-detached.js -M test/staging/sm/TypedArray/from_typedarray_fastpath_detached.js -M test/staging/sm/TypedArray/set-detached-bigint.js -M test/staging/sm/TypedArray/set-detached.js -M test/staging/sm/TypedArray/set-with-receiver.js -M test/staging/sm/TypedArray/slice-detached.js -M test/staging/sm/TypedArray/sort-negative-nan.js -M test/staging/sm/TypedArray/sort_errors.js -M test/staging/sm/TypedArray/subarray.js -M test/staging/sm/TypedArray/test-integrity-level-detached.js -M test/staging/sm/TypedArray/toLocaleString-detached.js -M test/staging/sm/TypedArray/toReversed-detached.js -M test/staging/sm/TypedArray/toSorted-detached.js -M test/staging/sm/TypedArray/toString.js -M test/staging/sm/TypedArray/with-detached.js -M test/staging/sm/TypedArray/with.js -M test/staging/sm/extensions/ArrayBuffer-slice-arguments-detaching.js -M test/staging/sm/extensions/DataView-construct-arguments-detaching.js -M test/staging/sm/extensions/DataView-set-arguments-detaching.js -M test/staging/sm/extensions/TypedArray-set-object-funky-length-detaches.js -M test/staging/sm/extensions/TypedArray-subarray-arguments-detaching.js -M test/staging/sm/extensions/element-setting-ToNumber-detaches.js -M test/staging/sm/extensions/typedarray-copyWithin-arguments-detaching.js -M test/staging/sm/extensions/typedarray-set-detach.js -M test/staging/sm/object/values-entries-typedarray.js \ No newline at end of file +A test/built-ins/Temporal/Duration/prototype/total/relativeto-plaindate-large-time-component-out-of-range.js +A test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-large-time-component-out-of-range.js +A test/built-ins/Temporal/PlainDate/prototype/since/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/PlainDate/prototype/since/rounding-near-minimum-date.js +A test/built-ins/Temporal/PlainDate/prototype/until/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/PlainDate/prototype/until/rounding-near-minimum-date.js +A test/built-ins/Temporal/PlainDateTime/prototype/since/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/PlainDateTime/prototype/since/rounding-near-minimum-date.js +A test/built-ins/Temporal/PlainDateTime/prototype/until/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/PlainDateTime/prototype/until/rounding-near-minimum-date.js +A test/built-ins/Temporal/PlainYearMonth/prototype/since/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/PlainYearMonth/prototype/until/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/ZonedDateTime/prototype/since/exact-multiple-of-larger-unit.js +A test/built-ins/Temporal/ZonedDateTime/prototype/until/exact-multiple-of-larger-unit.js +M test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/return-typedarrayname.js +M test/built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js +M test/built-ins/TypedArray/prototype/Symbol.toStringTag/return-typedarrayname.js +M test/built-ins/TypedArray/prototype/buffer/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/buffer/BigInt/return-buffer.js +M test/built-ins/TypedArray/prototype/buffer/detached-buffer.js +M test/built-ins/TypedArray/prototype/buffer/return-buffer.js +M test/built-ins/TypedArray/prototype/byteLength/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/byteLength/detached-buffer.js +M test/built-ins/TypedArray/prototype/byteOffset/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/byteOffset/BigInt/return-byteoffset.js +M test/built-ins/TypedArray/prototype/byteOffset/detached-buffer.js +M test/built-ins/TypedArray/prototype/byteOffset/return-byteoffset.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-target.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-target.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-target.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-target-and-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-and-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-start-and-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-this.js +M test/built-ins/TypedArray/prototype/copyWithin/BigInt/undefined-end.js +M test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js +M test/built-ins/TypedArray/prototype/copyWithin/byteoffset.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached-prototype.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start-detached.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js +M test/built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js +M test/built-ins/TypedArray/prototype/copyWithin/detached-buffer.js +A test/built-ins/TypedArray/prototype/copyWithin/immutable-buffer.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-end.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-start.js +M test/built-ins/TypedArray/prototype/copyWithin/negative-target.js +M test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js +M test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js +M test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js +M test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target-is-symbol.js +M test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js +M test/built-ins/TypedArray/prototype/copyWithin/return-this.js +M test/built-ins/TypedArray/prototype/copyWithin/undefined-end.js +M test/built-ins/TypedArray/prototype/entries/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/entries/detached-buffer.js +M test/built-ins/TypedArray/prototype/entries/return-itor.js +M test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/every/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/every/BigInt/returns-true-if-every-cb-returns-true.js +M test/built-ins/TypedArray/prototype/every/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/every/detached-buffer.js +M test/built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js +M test/built-ins/TypedArray/prototype/every/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/fill/BigInt/coerced-indexes.js +M test/built-ins/TypedArray/prototype/fill/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-conversion-once.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-custom-start-and-end.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric-throw.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-end.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-start.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-symbol-throws.js +M test/built-ins/TypedArray/prototype/fill/BigInt/fill-values.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end-as-symbol.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-set-value.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start-as-symbol.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/fill/BigInt/return-this.js +M test/built-ins/TypedArray/prototype/fill/coerced-end-detach.js +M test/built-ins/TypedArray/prototype/fill/coerced-indexes.js +M test/built-ins/TypedArray/prototype/fill/coerced-start-detach.js +M test/built-ins/TypedArray/prototype/fill/coerced-value-detach.js +M test/built-ins/TypedArray/prototype/fill/detached-buffer.js +M test/built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js +M test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js +M test/built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js +M test/built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js +M test/built-ins/TypedArray/prototype/fill/fill-values-relative-end.js +M test/built-ins/TypedArray/prototype/fill/fill-values-relative-start.js +M test/built-ins/TypedArray/prototype/fill/fill-values-symbol-throws.js +M test/built-ins/TypedArray/prototype/fill/fill-values.js +A test/built-ins/TypedArray/prototype/fill/immutable-buffer.js +M test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end-as-symbol.js +M test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js +M test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start-as-symbol.js +M test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/fill/return-this.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-ctor.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-species.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/filter/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/filter/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/filter/detached-buffer.js +A test/built-ins/TypedArray/prototype/filter/speciesctor-destination-backed-by-immutable-buffer.js +M test/built-ins/TypedArray/prototype/filter/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/find/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/find/BigInt/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/find/BigInt/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/find/BigInt/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/find/BigInt/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/find/detached-buffer.js +M test/built-ins/TypedArray/prototype/find/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/find/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findIndex/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findIndex/detached-buffer.js +M test/built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findIndex/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findLast/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findLast/detached-buffer.js +M test/built-ins/TypedArray/prototype/findLast/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findLast/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findLast/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findLast/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findLastIndex/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/findLastIndex/detached-buffer.js +M test/built-ins/TypedArray/prototype/findLastIndex/predicate-call-changes-value.js +M test/built-ins/TypedArray/prototype/findLastIndex/predicate-is-not-callable-throws.js +M test/built-ins/TypedArray/prototype/findLastIndex/predicate-may-detach-buffer.js +M test/built-ins/TypedArray/prototype/findLastIndex/predicate-not-called-on-empty-array.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/arraylength-internal.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/forEach/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/forEach/arraylength-internal.js +M test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/forEach/detached-buffer.js +M test/built-ins/TypedArray/prototype/forEach/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-false-for-zero.js +M test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-true-for-undefined.js +M test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/includes/BigInt/length-zero-returns-false.js +M test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-false-for-zero.js +M test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-true-for-undefined.js +M test/built-ins/TypedArray/prototype/includes/detached-buffer.js +M test/built-ins/TypedArray/prototype/includes/length-zero-returns-false.js +M test/built-ins/TypedArray/prototype/includes/searchelement-not-integer.js +M test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +M test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +M test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/indexOf/BigInt/length-zero-returns-minus-one.js +M test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +M test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +M test/built-ins/TypedArray/prototype/indexOf/detached-buffer.js +M test/built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js +M test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer-during-fromIndex-returns-single-comma.js +M test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/join/BigInt/empty-instance-empty-string.js +M test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator-symbol.js +M test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator.js +M test/built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js +M test/built-ins/TypedArray/prototype/join/detached-buffer-during-fromIndex-returns-single-comma.js +M test/built-ins/TypedArray/prototype/join/detached-buffer.js +M test/built-ins/TypedArray/prototype/join/empty-instance-empty-string.js +M test/built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js +M test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator-symbol.js +M test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js +M test/built-ins/TypedArray/prototype/keys/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/keys/BigInt/return-itor.js +M test/built-ins/TypedArray/prototype/keys/detached-buffer.js +M test/built-ins/TypedArray/prototype/keys/return-itor.js +M test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +M test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +M test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/length-zero-returns-minus-one.js +M test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +M test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +M test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js +M test/built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js +M test/built-ins/TypedArray/prototype/length/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/length/detached-buffer.js +M test/built-ins/TypedArray/prototype/map/BigInt/arraylength-internal.js +M test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/map/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/map/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/map/arraylength-internal.js +M test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js +M test/built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/map/detached-buffer.js +A test/built-ins/TypedArray/prototype/map/speciesctor-destination-backed-by-immutable-buffer.js +M test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/map/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/map/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/map/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-return-initialvalue.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-with-no-initialvalue-throws.js +M test/built-ins/TypedArray/prototype/reduce/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/reduce/detached-buffer.js +M test/built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js +M test/built-ins/TypedArray/prototype/reduce/empty-instance-with-no-initialvalue-throws.js +M test/built-ins/TypedArray/prototype/reduce/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-return-initialvalue.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-with-no-initialvalue-throws.js +M test/built-ins/TypedArray/prototype/reduceRight/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js +M test/built-ins/TypedArray/prototype/reduceRight/detached-buffer.js +M test/built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js +M test/built-ins/TypedArray/prototype/reduceRight/empty-instance-with-no-initialvalue-throws.js +M test/built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/reverse/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/reverse/BigInt/preserves-non-numeric-properties.js +M test/built-ins/TypedArray/prototype/reverse/detached-buffer.js +A test/built-ins/TypedArray/prototype/reverse/immutable-buffer.js +M test/built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-negative-integer-offset-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-offset-tointeger.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-primitive-toobject.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-length.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-value.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length-symbol.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value-symbol.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset-symbol.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-toobject-offset.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values-in-order.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-tonumber-value-type-conversions.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-values-are-not-cached.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/boolean-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/null-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/number-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-big.js +M test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-not-big-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/string-nan-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/string-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/symbol-tobigint.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-negative-integer-offset-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-offset-tointeger.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type-sab.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type-sab.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-same-buffer-same-type.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-byteoffset-internal.js +M test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/set/BigInt/undefined-tobigint.js +M test/built-ins/TypedArray/prototype/set/array-arg-negative-integer-offset-throws.js +M test/built-ins/TypedArray/prototype/set/array-arg-offset-tointeger.js +M test/built-ins/TypedArray/prototype/set/array-arg-primitive-toobject.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-value.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length-symbol.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value-symbol.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset-symbol.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset.js +M test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-toobject-offset.js +M test/built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js +M test/built-ins/TypedArray/prototype/set/array-arg-set-values.js +M test/built-ins/TypedArray/prototype/set/array-arg-src-tonumber-value-type-conversions.js +M test/built-ins/TypedArray/prototype/set/array-arg-src-values-are-not-cached.js +M test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js +M test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js +M test/built-ins/TypedArray/prototype/set/bit-precision.js +A test/built-ins/TypedArray/prototype/set/immutable-buffer.js +M test/built-ins/TypedArray/prototype/set/src-typedarray-big-throws.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-negative-integer-offset-throws.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-offset-tointeger.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type-sab.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type-sab.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-same-type.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-other-targettype.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-same-targettype.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-get-ctor.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-speciesctor-get-species-custom-ctor-throws.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-other-targettype.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-same-targettype.js +M test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end-symbol.js +M test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start-symbol.js +M test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/slice/BigInt/set-values-from-different-ctor-type.js +M test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-other-targettype.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-same-targettype.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-get-ctor.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-speciesctor-get-species-custom-ctor-throws.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js +M test/built-ins/TypedArray/prototype/slice/detached-buffer.js +M test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end-symbol.js +M test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start-symbol.js +M test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js +M test/built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js +A test/built-ins/TypedArray/prototype/slice/speciesctor-destination-backed-by-immutable-buffer.js +M test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/slice/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/slice/speciesctor-return-same-buffer-with-offset.js +M test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/some/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/some/BigInt/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js +M test/built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js +M test/built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js +M test/built-ins/TypedArray/prototype/some/detached-buffer.js +M test/built-ins/TypedArray/prototype/some/values-are-not-cached.js +M test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-call-throws.js +M test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-calls.js +M test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-is-undefined.js +M test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-nonfunction-call-throws.js +M test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/sort/BigInt/return-same-instance.js +M test/built-ins/TypedArray/prototype/sort/BigInt/sortcompare-with-no-tostring.js +M test/built-ins/TypedArray/prototype/sort/BigInt/sorted-values.js +M test/built-ins/TypedArray/prototype/sort/comparefn-call-throws.js +M test/built-ins/TypedArray/prototype/sort/comparefn-calls.js +M test/built-ins/TypedArray/prototype/sort/comparefn-is-undefined.js +M test/built-ins/TypedArray/prototype/sort/comparefn-nonfunction-call-throws.js +M test/built-ins/TypedArray/prototype/sort/detached-buffer.js +A test/built-ins/TypedArray/prototype/sort/immutable-buffer.js +M test/built-ins/TypedArray/prototype/sort/return-same-instance.js +M test/built-ins/TypedArray/prototype/sort/sort-tonumber.js +M test/built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js +M test/built-ins/TypedArray/prototype/sort/sorted-values-nan.js +M test/built-ins/TypedArray/prototype/sort/sorted-values.js +M test/built-ins/TypedArray/prototype/sort/stability.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/result-is-new-instance-with-shared-buffer.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin-symbol.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end-symbol.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/subarray/byteoffset-with-detached-buffer.js +M test/built-ins/TypedArray/prototype/subarray/detached-buffer.js +M test/built-ins/TypedArray/prototype/subarray/result-is-new-instance-with-shared-buffer.js +M test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin-symbol.js +M test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin.js +M test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end-symbol.js +M test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end.js +M test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-abrupt.js +M test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js +M test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js +M test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js +M test/built-ins/TypedArray/prototype/toLocaleString/BigInt/calls-tostring-from-each-value.js +M test/built-ins/TypedArray/prototype/toLocaleString/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/toLocaleString/BigInt/empty-instance-returns-empty-string.js +M test/built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js +M test/built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js +M test/built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js +M test/built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js +M test/built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js +M test/built-ins/TypedArray/prototype/toLocaleString/return-result.js +M test/built-ins/TypedArray/prototype/toReversed/ignores-species.js +M test/built-ins/TypedArray/prototype/toReversed/length-property-ignored.js +M test/built-ins/TypedArray/prototype/toReversed/this-value-invalid.js +M test/built-ins/TypedArray/prototype/toSorted/ignores-species.js +M test/built-ins/TypedArray/prototype/toSorted/length-property-ignored.js +M test/built-ins/TypedArray/prototype/toSorted/this-value-invalid.js +M test/built-ins/TypedArray/prototype/toString/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/toString/detached-buffer.js +M test/built-ins/TypedArray/prototype/values/BigInt/detached-buffer.js +M test/built-ins/TypedArray/prototype/values/detached-buffer.js +M test/built-ins/TypedArray/prototype/values/return-itor.js +M test/built-ins/TypedArray/prototype/with/BigInt/early-type-coercion-bigint.js +M test/built-ins/TypedArray/prototype/with/early-type-coercion.js +M test/built-ins/TypedArray/prototype/with/ignores-species.js +M test/built-ins/TypedArray/prototype/with/length-property-ignored.js +M test/built-ins/TypedArrayConstructors/from/BigInt/custom-ctor-returns-other-instance.js +A test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-immutable-arraybuffer.js +M test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-other-instance.js +M test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js +M test/built-ins/TypedArrayConstructors/internals/Set/BigInt/boolean-tobigint.js +M test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js +M test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js +M test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js +M test/built-ins/TypedArrayConstructors/internals/Set/BigInt/string-tobigint.js +M test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js +M test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js +M test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js +M test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js +M test/built-ins/TypedArrayConstructors/of/BigInt/custom-ctor-returns-other-instance.js +A test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-immutable-arraybuffer.js +M test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js +A test/built-ins/Uint8Array/prototype/setFromBase64/throws-when-target-is-backed-by-immutable-arraybuffer.js +A test/built-ins/Uint8Array/prototype/setFromHex/throws-when-target-is-backed-by-immutable-arraybuffer.js +M test/harness/verifyProperty-value-error.js +M test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js +M test/intl402/Collator/constructor-options-throwing-getters.js +M test/intl402/Collator/default-options-object-prototype.js +M test/intl402/Collator/proto-from-ctor-realm.js +M test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default.js +M test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js +M test/intl402/Collator/unicode-ext-seq-in-private-tag.js +M test/intl402/Collator/unicode-ext-seq-with-attribute.js +M test/intl402/Collator/usage-de.js +A test/intl402/DateTimeFormat/constructor-options-calendar-future-fallback.js +D test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js +D test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js +D test/intl402/DateTimeFormat/constructor-options-order-timedate-style.js +M test/intl402/DateTimeFormat/constructor-options-order.js +M test/intl402/DateTimeFormat/constructor-options-style-conflict.js +D test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js +D test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js +D test/intl402/DateTimeFormat/constructor-options-throwing-getters-timedate-style.js +M test/intl402/DateTimeFormat/constructor-options-throwing-getters.js +M test/intl402/DateTimeFormat/constructor-options-toobject.js +M test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js +A test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-property.js +M test/intl402/DateTimeFormat/intl-legacy-constructed-symbol.js +M test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js +M test/intl402/DateTimeFormat/timezone-case-insensitive.js +M test/intl402/DateTimeFormat/timezone-legacy-non-iana.js +M test/intl402/DateTimeFormat/timezone-not-canonicalized.js +D test/intl402/DurationFormat/constructor-option-read-order.js +M test/intl402/DurationFormat/constructor-options-order.js +A test/intl402/FallbackSymbol/description.js +A test/intl402/FallbackSymbol/per-realm.js +M test/intl402/Locale/constructor-options-throwing-getters.js +M test/intl402/Number/prototype/toLocaleString/default-options-object-prototype.js +M test/intl402/NumberFormat/casing-numbering-system-options.js +M test/intl402/NumberFormat/constructor-compactDisplay-compact.js +M test/intl402/NumberFormat/constructor-compactDisplay-no-compact.js +M test/intl402/NumberFormat/constructor-default-value.js +M test/intl402/NumberFormat/constructor-locales-arraylike.js +M test/intl402/NumberFormat/constructor-locales-get-tostring.js +M test/intl402/NumberFormat/constructor-locales-hasproperty.js +M test/intl402/NumberFormat/constructor-locales-string.js +M test/intl402/NumberFormat/constructor-locales-toobject.js +M test/intl402/NumberFormat/constructor-notation.js +D test/intl402/NumberFormat/constructor-numberingSystem-order.js +M test/intl402/NumberFormat/constructor-option-read-order.js +M test/intl402/NumberFormat/constructor-options-numberingSystem-invalid.js +M test/intl402/NumberFormat/constructor-options-roundingMode-invalid.js +D test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-increment.js +D test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-mode.js +D test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-priority.js +D test/intl402/NumberFormat/constructor-options-throwing-getters-trailing-zero-display.js +M test/intl402/NumberFormat/constructor-options-throwing-getters.js +M test/intl402/NumberFormat/constructor-options-toobject.js +M test/intl402/NumberFormat/constructor-order.js +M test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js +M test/intl402/NumberFormat/constructor-roundingIncrement.js +M test/intl402/NumberFormat/constructor-signDisplay-negative.js +M test/intl402/NumberFormat/constructor-signDisplay.js +M test/intl402/NumberFormat/constructor-trailingZeroDisplay-invalid.js +M test/intl402/NumberFormat/constructor-trailingZeroDisplay.js +M test/intl402/NumberFormat/constructor-unit.js +M test/intl402/NumberFormat/constructor-unitDisplay.js +M test/intl402/NumberFormat/default-options-object-prototype.js +M test/intl402/NumberFormat/intl-legacy-constructed-symbol-on-unwrap.js +A test/intl402/NumberFormat/intl-legacy-constructed-symbol-property.js +M test/intl402/NumberFormat/intl-legacy-constructed-symbol.js +M test/intl402/NumberFormat/numbering-system-options.js +M test/intl402/NumberFormat/test-option-useGrouping-extended.js +M test/intl402/NumberFormat/throws-for-maximumFractionDigits-over-limit.js +M test/intl402/NumberFormat/throws-for-maximumFractionDigits-under-limit.js +M test/intl402/NumberFormat/throws-for-minimumFractionDigits-over-limit.js +M test/intl402/NumberFormat/throws-for-minimumFractionDigits-under-limit.js +A test/intl402/PluralRules/compactDisplay-undefined-unless-notation-compact.js +M test/intl402/PluralRules/constructor-option-read-order.js +M test/intl402/PluralRules/constructor-options-throwing-getters.js +M test/intl402/PluralRules/default-options-object-prototype.js +M test/intl402/PluralRules/notation.js +M test/intl402/PluralRules/proto-from-ctor-realm.js +M test/intl402/PluralRules/prototype/select/tainting.js +M test/intl402/String/prototype/localeCompare/default-options-object-prototype.js +A test/intl402/Temporal/PlainDate/compare/future-calendar.js +A test/intl402/Temporal/PlainDate/from/future-calendar.js +A test/intl402/Temporal/PlainDate/future-calendar.js +A test/intl402/Temporal/PlainDate/prototype/equals/future-calendar.js +A test/intl402/Temporal/PlainDate/prototype/withCalendar/future-calendar.js +A test/intl402/Temporal/PlainDateTime/compare/future-calendar.js +A test/intl402/Temporal/PlainDateTime/from/future-calendar.js +A test/intl402/Temporal/PlainDateTime/future-calendar.js +A test/intl402/Temporal/PlainDateTime/prototype/equals/future-calendar.js +A test/intl402/Temporal/PlainDateTime/prototype/withCalendar/future-calendar.js +A test/intl402/Temporal/PlainMonthDay/from/future-calendar.js +A test/intl402/Temporal/PlainMonthDay/future-calendar.js +A test/intl402/Temporal/PlainMonthDay/prototype/equals/future-calendar.js +M test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString/basic.js +A test/intl402/Temporal/PlainYearMonth/compare/future-calendar.js +A test/intl402/Temporal/PlainYearMonth/from/future-calendar.js +A test/intl402/Temporal/PlainYearMonth/future-calendar.js +A test/intl402/Temporal/PlainYearMonth/prototype/equals/future-calendar.js +A test/intl402/Temporal/ZonedDateTime/compare/future-calendar.js +A test/intl402/Temporal/ZonedDateTime/from/future-calendar.js +A test/intl402/Temporal/ZonedDateTime/future-calendar.js +A test/intl402/Temporal/ZonedDateTime/prototype/equals/future-calendar.js +M test/intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js +A test/intl402/Temporal/ZonedDateTime/prototype/round/same-date-starts-twice.js +M test/intl402/Temporal/ZonedDateTime/prototype/startOfDay/same-date-starts-twice.js +A test/intl402/Temporal/ZonedDateTime/prototype/withCalendar/future-calendar.js +M test/language/expressions/class/elements/private-methods/prod-private-async-generator.js +M test/language/expressions/class/elements/private-methods/prod-private-async-method.js +M test/language/expressions/class/elements/private-methods/prod-private-generator.js +M test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js +M test/language/expressions/class/elements/private-methods/prod-private-method.js +A test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-1_FIXTURE.js +A test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-2_FIXTURE.js +A test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-reexport_FIXTURE.js +A test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-source-and-export.js +A test/language/module-code/source-phase-import/reexport-source-binding-named-import.js +A test/language/module-code/source-phase-import/reexport-source-binding-namespace-get.js +A test/language/module-code/source-phase-import/reexport-source-binding_FIXTURE.js +M test/language/statements/class/elements/private-methods/prod-private-async-generator.js +M test/language/statements/class/elements/private-methods/prod-private-async-method.js +M test/language/statements/class/elements/private-methods/prod-private-generator.js +M test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js +M test/language/statements/class/elements/private-methods/prod-private-method.js +M test/staging/sm/Error/constructor-proto.js +M test/staging/sm/Error/prototype-properties.js +M test/staging/sm/Error/prototype.js +M test/staging/sm/Function/builtin-no-construct.js +M test/staging/sm/Function/builtin-no-prototype.js \ No newline at end of file diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-buffer.js b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-buffer.js index 8222634cc461..884d43dbef34 100644 --- a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-buffer.js +++ b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-buffer.js @@ -15,8 +15,8 @@ features: [TypedArray] includes: [testTypedArray.js] ---*/ -testWithTypedArrayConstructors(function(ctor) { - var sample = new ctor().buffer; +testWithAllTypedArrayConstructors(function(ctor, makeCtorArg) { + var sample = new ctor(makeCtorArg(0)).buffer; assert.sameValue(ArrayBuffer.isView(sample), false); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-constructor.js b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-constructor.js index edad6efeb7af..f04ce6a05f69 100644 --- a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-constructor.js +++ b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-constructor.js @@ -15,6 +15,6 @@ features: [TypedArray] includes: [testTypedArray.js] ---*/ -testWithTypedArrayConstructors(function(ctor) { +testWithAllTypedArrayConstructors(function(ctor) { assert.sameValue(ArrayBuffer.isView(ctor), false); }, null, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js index 9c280b12397e..4341f83421e0 100644 --- a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js +++ b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js @@ -15,10 +15,10 @@ features: [class, TypedArray] includes: [testTypedArray.js] ---*/ -testWithTypedArrayConstructors(function(ctor) { +testWithAllTypedArrayConstructors(function(ctor, makeCtorArg) { class TA extends ctor {} - var sample = new TA(); + var sample = new TA(makeCtorArg(0)); assert(ArrayBuffer.isView(sample)); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray.js b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray.js index 713d51f07e65..4d6d1e691906 100644 --- a/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray.js +++ b/JSTests/test262/test/built-ins/ArrayBuffer/isView/arg-is-typedarray.js @@ -15,8 +15,8 @@ features: [TypedArray] includes: [testTypedArray.js] ---*/ -testWithTypedArrayConstructors(function(ctor) { - var sample = new ctor(); +testWithAllTypedArrayConstructors(function(ctor, makeCtorArg) { + var sample = new ctor(makeCtorArg(0)); assert.sameValue(ArrayBuffer.isView(sample), true); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/isView/invoked-as-a-fn.js b/JSTests/test262/test/built-ins/ArrayBuffer/isView/invoked-as-a-fn.js index 4024087f045f..d8678e9b3889 100644 --- a/JSTests/test262/test/built-ins/ArrayBuffer/isView/invoked-as-a-fn.js +++ b/JSTests/test262/test/built-ins/ArrayBuffer/isView/invoked-as-a-fn.js @@ -17,10 +17,10 @@ includes: [testTypedArray.js] var isView = ArrayBuffer.isView; -testWithTypedArrayConstructors(function(ctor) { - var sample = new ctor(); +testWithAllTypedArrayConstructors(function(ctor, makeCtorArg) { + var sample = new ctor(makeCtorArg(0)); assert.sameValue(isView(sample), true, "instance of TypedArray"); -}, null, ["passthrough"]); +}); var dv = new DataView(new ArrayBuffer(1), 0, 0); assert.sameValue(isView(dv), true, "instance of DataView"); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/prop-desc.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/prop-desc.js new file mode 100644 index 000000000000..dcdb5fb90c41 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/prop-desc.js @@ -0,0 +1,30 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-arraybuffer.prototype.immutable +description: Checks the "immutable" property of ArrayBuffer.prototype. +info: | + ArrayBuffer.prototype.immutable is an accessor property whose set accessor + function is undefined. + + ECMAScript Standard Built-in Objects + ... + For functions that are specified as properties of objects, the name value is + the property name string used to access the function. Functions that are + specified as get or set accessor functions of built-in properties have "get" + or "set" (respectively) passed to the prefix parameter when calling + CreateBuiltinFunction. + ... + Every accessor property described in clauses 19 through 28 and in Annex B.2 + has the attributes { [[Enumerable]]: false, [[Configurable]]: true } unless + otherwise specified. If only a get accessor function is described, the set + accessor function is the default value, undefined. +features: [immutable-arraybuffer] +includes: [propertyHelper.js] +---*/ + +verifyPrimordialAccessorProperty(ArrayBuffer.prototype, "immutable", { + get: { name: "get immutable", length: 0 }, + set: undefined, +}, { label: "ArrayBuffer.prototype.immutable" }); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/return-immutable.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/return-immutable.js new file mode 100644 index 000000000000..04abdc0b534f --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/return-immutable.js @@ -0,0 +1,28 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-arraybuffer.prototype.immutable +description: Return value according to the [[ArrayBufferIsImmutable]] internal slot. +info: | + get ArrayBuffer.prototype.immutable + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. + 4. Return IsImmutableBuffer(O). + + IsImmutableBuffer ( arrayBuffer ) + 1. If arrayBuffer has an [[ArrayBufferIsImmutable]] internal slot, return true. + 2. Return false. +features: [ArrayBuffer, immutable-arraybuffer] +includes: [detachArrayBuffer.js] +---*/ + +var ab = new ArrayBuffer(1); +assert.sameValue(ab.immutable, false); + +var iab = ab.transferToImmutable(); +assert.sameValue(iab.immutable, true); + +$DETACHBUFFER(ab); +assert.sameValue(ab.immutable, false); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-has-no-arraybufferdata-internal.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-has-no-arraybufferdata-internal.js new file mode 100644 index 000000000000..e6d6d4184463 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-has-no-arraybufferdata-internal.js @@ -0,0 +1,45 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-arraybuffer.prototype.immutable +description: > + Throws a TypeError exception when `this` does not have a [[ArrayBufferData]] + internal slot +info: | + get ArrayBuffer.prototype.immutable + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +features: [DataView, Int8Array, ArrayBuffer, immutable-arraybuffer] +---*/ + +var getter = Object.getOwnPropertyDescriptor( + ArrayBuffer.prototype, "immutable" +).get; + +assert.sameValue(typeof getter, "function", "Getter must exist."); + +var badReceivers = [ + ["plain object", {}], + ["array", []], + ["function", function(){}], + ["ArrayBuffer.prototype", ArrayBuffer.prototype], + ["TypedArray", new Int8Array(8)], + ["DataView", new DataView(new ArrayBuffer(8), 0)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + assert.throws(TypeError, function() { + getter.call(value); + }, label); +} + +assert.throws(TypeError, function() { + ArrayBuffer.prototype.immutable; +}, "invoked as prototype property access"); + +assert.throws(TypeError, function() { + getter(); +}, "invoked as function"); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-not-object.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-not-object.js new file mode 100644 index 000000000000..fbc7370e839a --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-not-object.js @@ -0,0 +1,39 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-arraybuffer.prototype.immutable +description: Throws a TypeError exception when `this` is not an object +info: | + get ArrayBuffer.prototype.immutable + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +features: [ArrayBuffer, immutable-arraybuffer] +---*/ + +var getter = Object.getOwnPropertyDescriptor( + ArrayBuffer.prototype, "immutable" +).get; + +assert.sameValue(typeof getter, "function", "Getter must exist."); + +var badReceivers = [ + ["undefined", undefined], + ["null", null], + ["number", 42], + ["string", "1"], + ["true", true], + ["false", false], + typeof Symbol === "undefined" ? undefined : ["unique symbol", Symbol("s")], + typeof Symbol === "undefined" || !Symbol.for ? undefined : ["registered symbol", Symbol.for("s")], + typeof BigInt === "undefined" ? undefined : ["bigint", BigInt(1)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + if (!badReceivers[i]) continue; + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + assert.throws(TypeError, function() { + getter.call(value); + }, label); +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-sharedarraybuffer.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-sharedarraybuffer.js new file mode 100644 index 000000000000..44c33243eacc --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/immutable/this-is-sharedarraybuffer.js @@ -0,0 +1,24 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-arraybuffer.prototype.immutable +description: Throws a TypeError exception when `this` is a SharedArrayBuffer +info: | + get ArrayBuffer.prototype.immutable + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +features: [SharedArrayBuffer, ArrayBuffer, immutable-arraybuffer] +---*/ + +var getter = Object.getOwnPropertyDescriptor( + ArrayBuffer.prototype, "immutable" +).get; + +assert.sameValue(typeof getter, "function", "Getter must exist."); + +var sab = new SharedArrayBuffer(4); +assert.throws(TypeError, function() { + getter.call(sab); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/argument-coercion.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/argument-coercion.js new file mode 100644 index 000000000000..d860b4073ac2 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/argument-coercion.js @@ -0,0 +1,373 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: > + Requested start and end are coerced to integers and checked for validity, then + (if valid) an immutable ArrayBuffer with the correct length and contents is + returned +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + ... + 5. Let len be O.[[ArrayBufferByteLength]]. + 6. Let bounds be ? ResolveBounds(len, start, end). + 7. Let first be bounds.[[From]]. + 8. Let final be bounds.[[To]]. + 9. Let newLen be max(final - first, 0). + ... + 12. Let fromBuf be O.[[ArrayBufferData]]. + 13. Let currentLen be O.[[ArrayBufferByteLength]]. + 14. If currentLen < final, throw a RangeError exception. + 15. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newLen, fromBuf, first, newLen). + 16. Return newBuffer. + + ResolveBounds ( len, start, end ) + 1. Let relativeStart be ? ToIntegerOrInfinity(start). + 2. If relativeStart = -∞, let from be 0. + 3. Else if relativeStart < 0, let from be max(len + relativeStart, 0). + 4. Else, let from be min(relativeStart, len). + 5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + 6. If relativeEnd = -∞, let to be 0. + 7. Else if relativeEnd < 0, let to be max(len + relativeEnd, 0). + 8. Else, let to be min(relativeEnd, len). + 9. Return the Record { [[From]]: from, [[To]]: to }. + + ToIntegerOrInfinity ( argument ) + 1. Let number be ? ToNumber(argument). + 2. If number is one of NaN, +0𝔽, or -0𝔽, return 0. + 3. If number is +∞𝔽, return +∞. + 4. If number is -∞𝔽, return -∞. + 5. Return truncate(ℝ(number)). +features: [immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var ab = new ArrayBuffer(8); +assert.sameValue(ab.sliceToImmutable().byteLength, 8, + "Must default to receiver byteLength."); +ab = new ArrayBuffer(8); +assert.sameValue(ab.sliceToImmutable(undefined, undefined).byteLength, 8, + "Must default (undefined, undefined) to receiver byteLength."); + +function make32ByteArrayBuffer() { + var ab = new ArrayBuffer(32); + var view = new Uint8Array(ab); + for (var i = 0; i < 8; i++) view[i] = i + 1; + return ab; +} + +var goodInputs = [ + // Unmodified non-negative integral numbers + [0, 0], + [1, 1], + [10, 10], + // Truncated non-negative integral numbers + [0.9, 0], + [1.9, 1], + [-0.9, 0], + // Negative integral numbers + [-1, -1], + [-1.9, -1], + [-2.9, -2], + // Coerced to integral numbers + [-0, 0], + [null, 0], + [false, 0], + [true, 1], + ["", 0], + ["8", 8], + ["+9", 9], + ["-9", -9], + ["10e0", 10], + ["+1.1E+1", 11], + ["+.12e2", 12], + ["130e-1", 13], + ["0b1110", 14], + ["0XF", 15], + ["0xf", 15], + ["0o20", 16], + // Coerced to NaN and mapped to 0 + [NaN, 0], + ["7up", 0], + ["1_0", 0], + ["0x00_ff", 0], + // Clamped + [-32, 0], + ["-32", 0], + [-Infinity, 0], + ["-Infinity", 0], + [33, 32], + ["33", 32], + [9007199254740992, 32], // Math.pow(2, 53) = 9007199254740992 + ["9007199254740992", 32], // Math.pow(2, 53) = 9007199254740992 + [Infinity, 32], + ["Infinity", 32] +]; + +for (var i = 0; i < goodInputs.length; i++) { + var rawStart = goodInputs[i][0]; + var intStart = goodInputs[i][1]; + for (var j = 0; j < goodInputs.length; j++) { + var rawEnd = goodInputs[j][0]; + var intEnd = goodInputs[j][1]; + var intLength = Math.max( + 0, + (intEnd >= 0 ? intEnd : 32 + intEnd) - (intStart >= 0 ? intStart : 32 + intStart) + ); + var source = make32ByteArrayBuffer(); + var expectContents = Array.from(new Uint8Array(source)).slice(rawStart, rawEnd); + var dest = source.sliceToImmutable(rawStart, rawEnd); + var label = "sliceToImmutable(" + formatSimpleValue(rawStart) + ", " + formatSimpleValue(rawEnd) + ")"; + assert.sameValue(dest.byteLength, intLength, label + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, label + " contents"); + assert.sameValue(dest.immutable, true, label + ".immutable"); + } +} + +var whitespace = "\t\v\f\uFEFF\u3000\n\r\u2028\u2029"; +function pad(rawInput) { + if (typeof rawInput === "string") { + return { skip: false, string: whitespace + rawInput + whitespace }; + } else if (typeof rawInput === "number") { + return { + skip: false, + string: whitespace + (isNegativeZero(rawInput) ? "-0" : rawInput) + whitespace + }; + } + return { skip: true }; +} +for (var i = 0; i < goodInputs.length; i++) { + var rawStart = goodInputs[i][0]; + var intStart = goodInputs[i][1]; + var paddedStart = pad(rawStart); + if (paddedStart.skip) continue; + for (var j = 0; j < goodInputs.length; j++) { + var rawEnd = goodInputs[j][0]; + var intEnd = goodInputs[j][1]; + var paddedEnd = pad(rawEnd); + if (paddedEnd.skip) continue; + var intLength = Math.max( + 0, + (intEnd >= 0 ? intEnd : 32 + intEnd) - (intStart >= 0 ? intStart : 32 + intStart) + ); + var source = make32ByteArrayBuffer(); + var expectContents = Array.from(new Uint8Array(source)).slice(rawStart, rawEnd); + var dest = source.sliceToImmutable(paddedStart.string, paddedEnd.string); + var label = "sliceToImmutable(" + formatSimpleValue(paddedStart.string) + ", " + formatSimpleValue(paddedEnd.string) + ")"; + assert.sameValue(dest.byteLength, intLength, label + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, label + " contents"); + assert.sameValue(dest.immutable, true, label + ".immutable"); + } +} + +for (var i = 0; i < goodInputs.length; i++) { + var rawStart = goodInputs[i][0]; + var intStart = goodInputs[i][1]; + for (var j = 0; j < goodInputs.length; j++) { + var rawEnd = goodInputs[j][0]; + var intEnd = goodInputs[j][1]; + var intLength = Math.max( + 0, + (intEnd >= 0 ? intEnd : 32 + intEnd) - (intStart >= 0 ? intStart : 32 + intStart) + ); + + var calls = []; + + var badStartValueOf = false; + var badStartToString = false; + var objStart = { + valueOf() { + calls.push("start.valueOf"); + return badStartValueOf ? {} : rawStart; + }, + toString() { + calls.push("start.toString"); + return badStartToString ? {} : rawStart; + } + }; + var badEndValueOf = false; + var badEndToString = false; + var objEnd = { + valueOf() { + calls.push("end.valueOf"); + return badEndValueOf ? {} : rawEnd; + }, + toString() { + calls.push("end.toString"); + return badEndToString ? {} : rawEnd; + } + }; + function reprArgs(startMethodName, endMethodName) { + var startRepr = "{ " + startMethodName + ": () => " + formatSimpleValue(rawStart) + " }"; + var endRepr = "{ " + endMethodName + ": () => " + formatSimpleValue(rawEnd) + " }"; + return "(" + startRepr + ", " + endRepr + ")"; + } + + var source = make32ByteArrayBuffer(); + var expectContents = Array.from(new Uint8Array(source)).slice(rawStart, rawEnd); + var dest = source.sliceToImmutable(objStart, objEnd); + assert.sameValue(dest.byteLength, intLength, + "sliceToImmutable" + reprArgs("valueOf", "valueOf") + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, + "sliceToImmutable" + reprArgs("valueOf", "valueOf") + " contents"); + assert.sameValue(dest.immutable, true, + "sliceToImmutable" + reprArgs("valueOf", "valueOf") + ".immutable"); + assert.compareArray(calls, ["start.valueOf", "end.valueOf"], + "sliceToImmutable" + reprArgs("valueOf", "valueOf") + " calls"); + + badStartValueOf = true; + calls = []; + source = make32ByteArrayBuffer(); + dest = source.sliceToImmutable(objStart, objEnd); + assert.sameValue(dest.byteLength, intLength, + "sliceToImmutable" + reprArgs("toString", "valueOf") + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, + "sliceToImmutable" + reprArgs("toString", "valueOf") + " contents"); + assert.sameValue(dest.immutable, true, + "sliceToImmutable" + reprArgs("toString", "valueOf") + ".immutable"); + assert.compareArray(calls, ["start.valueOf", "start.toString", "end.valueOf"], + "sliceToImmutable" + reprArgs("toString", "valueOf") + " calls"); + + badEndValueOf = true; + calls = []; + source = make32ByteArrayBuffer(); + dest = source.sliceToImmutable(objStart, objEnd); + assert.sameValue(dest.byteLength, intLength, + "sliceToImmutable" + reprArgs("toString", "toString") + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, + "sliceToImmutable" + reprArgs("toString", "toString") + " contents"); + assert.sameValue(dest.immutable, true, + "sliceToImmutable" + reprArgs("toString", "toString") + ".immutable"); + assert.compareArray(calls, ["start.valueOf", "start.toString", "end.valueOf", "end.toString"], + "sliceToImmutable" + reprArgs("toString", "toString") + " calls"); + + badEndToString = true; + if (typeof Symbol === undefined || !Symbol.toPrimitive) continue; + calls = []; + objEnd[Symbol.toPrimitive] = function(hint) { + calls.push("end[Symbol.toPrimitive](" + hint + ")"); + return rawEnd; + }; + source = make32ByteArrayBuffer(); + dest = source.sliceToImmutable(objStart, objEnd); + assert.sameValue(dest.byteLength, intLength, + "sliceToImmutable" + reprArgs("toString", "[Symbol.toPrimitive]") + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, + "sliceToImmutable" + reprArgs("toString", "[Symbol.toPrimitive]") + " contents"); + assert.sameValue(dest.immutable, true, + "sliceToImmutable" + reprArgs("toString", "[Symbol.toPrimitive]") + ".immutable"); + assert.compareArray( + calls, + ["start.valueOf", "start.toString", "end[Symbol.toPrimitive](number)"], + "sliceToImmutable" + reprArgs("toString", "[Symbol.toPrimitive]") + " calls" + ); + + badStartToString = true; + calls = []; + objStart[Symbol.toPrimitive] = function(hint) { + calls.push("start[Symbol.toPrimitive](" + hint + ")"); + return rawStart; + }; + source = make32ByteArrayBuffer(); + dest = source.sliceToImmutable(objStart, objEnd); + assert.sameValue(dest.byteLength, intLength, + "sliceToImmutable" + reprArgs("[Symbol.toPrimitive]", "[Symbol.toPrimitive]") + ".byteLength"); + assert.compareArray(new Uint8Array(dest), expectContents, + "sliceToImmutable" + reprArgs("[Symbol.toPrimitive]", "[Symbol.toPrimitive]") + " contents"); + assert.sameValue(dest.immutable, true, + "sliceToImmutable" + reprArgs("[Symbol.toPrimitive]", "[Symbol.toPrimitive]") + ".immutable"); + assert.compareArray( + calls, + ["start[Symbol.toPrimitive](number)", "end[Symbol.toPrimitive](number)"], + "sliceToImmutable" + reprArgs("[Symbol.toPrimitive]", "[Symbol.toPrimitive]") + " calls"); + } +} + +function CustomError() {} + +var badInputs = [ + // non-numbers + typeof Symbol === undefined ? undefined : [Symbol("1"), TypeError], + typeof Symbol === undefined || !Symbol.for ? undefined : [Symbol.for("1"), TypeError], + typeof BigInt === undefined ? undefined : [BigInt(1), TypeError], + // thrower + [ + { + valueOf() { + throw new CustomError(); + }, + toString() { + return "{ valueOf: throwError }"; + }, + }, + CustomError + ] +]; + +for (var i = 0; i < badInputs.length; i++) { + if (!badInputs[i]) continue; + var rawBad = badInputs[i][0]; + var expectedErr = badInputs[i][1]; + + var ab = make32ByteArrayBuffer(); + var rawGood = goodInputs[i % goodInputs.length][0]; + var calls = []; + var objGood = { + valueOf() { + calls.push("good.valueOf"); + return rawGood; + } + }; + assert.throws( + expectedErr, + function() { + ab.sliceToImmutable(rawBad, objGood); + }, + "sliceToImmutable(" + formatSimpleValue(rawBad) + ", { valueOf: () => " + formatSimpleValue(rawGood) + " })" + ); + assert.compareArray(calls, [], + "sliceToImmutable(" + formatSimpleValue(rawBad) + ", { valueOf: () => " + formatSimpleValue(rawGood) + " }) calls"); + + calls = []; + assert.throws( + expectedErr, + function() { + ab.sliceToImmutable(objGood, rawBad); + }, + "sliceToImmutable({ valueOf: () => " + formatSimpleValue(rawGood) + " }, " + formatSimpleValue(rawBad) + ")" + ); + assert.compareArray(calls, ["good.valueOf"], + "sliceToImmutable({ valueOf: () => " + formatSimpleValue(rawGood) + " }, " + formatSimpleValue(rawBad) + ") calls"); +} + +var calls = []; +var objBad = { + toString() { + calls.push("toString"); + return {}; + }, + valueOf() { + calls.push("valueOf"); + return {}; + } +}; +ab = make32ByteArrayBuffer(); +assert.throws(TypeError, function() { + ab.sliceToImmutable(objBad); +}, "sliceToImmutable(badOrdinaryToPrimitive)"); +assert.compareArray(calls, ["valueOf", "toString"], + "sliceToImmutable(badOrdinaryToPrimitive) calls"); +if (typeof Symbol !== undefined && Symbol.toPrimitive) { + calls = []; + objBad[Symbol.toPrimitive] = function(hint) { + calls.push("Symbol.toPrimitive(" + hint + ")"); + return {}; + }; + ab = make32ByteArrayBuffer(); + assert.throws(TypeError, function() { + ab.sliceToImmutable(objBad); + }, "sliceToImmutable(badExoticToPrimitive)"); + assert.compareArray(calls, ["Symbol.toPrimitive(number)"], + "sliceToImmutable(badExoticToPrimitive) calls"); +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/modify-source-after-return.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/modify-source-after-return.js new file mode 100644 index 000000000000..0268158df478 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/modify-source-after-return.js @@ -0,0 +1,37 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Unaffected by post-hoc manipulation of the source +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + ... + 15. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newLen, fromBuf, first, newLen). + 16. Return newBuffer. +features: [immutable-arraybuffer] +includes: [compareArray.js, detachArrayBuffer.js] +---*/ + +var source = new ArrayBuffer(8, { maxByteLength: 8 }); +var view = new Uint8Array(source); +for (var i = 0; i < 8; i++) view[i] = i + 1; + +var dest = source.sliceToImmutable(); +var expectContents = [1, 2, 3, 4, 5, 6, 7, 8]; +var destView = new Uint8Array(dest); +assert.compareArray(destView, expectContents); + +view[0] = 86; +assert.compareArray(destView, expectContents, "after source overwrite"); +assert.compareArray(new Uint8Array(dest), expectContents, "new view after source overwrite"); + +if (source.resize) { + source.resize(4); + assert.compareArray(destView, expectContents, "after resize"); + assert.compareArray(new Uint8Array(dest), expectContents, "new view after resize"); +} + +$DETACHBUFFER(source); +assert.compareArray(destView, expectContents, "after detach"); +assert.compareArray(new Uint8Array(dest), expectContents, "new view after detach"); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/not-a-constructor.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/not-a-constructor.js new file mode 100644 index 000000000000..8823ba523995 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/not-a-constructor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: ArrayBuffer.prototype.sliceToImmutable is not a constructor function +info: | + ECMAScript Standard Built-in Objects + ... + Built-in function objects that are not identified as constructors do not + implement the [[Construct]] internal method unless otherwise specified in the + description of a particular function. +features: [Reflect.construct, immutable-arraybuffer] +includes: [isConstructor.js] +---*/ + +assert(!isConstructor(ArrayBuffer.prototype.sliceToImmutable), + "ArrayBuffer.prototype.sliceToImmutable is not a constructor"); + +var arrayBuffer = new ArrayBuffer(8); +assert.throws(TypeError, function() { + new arrayBuffer.sliceToImmutable(); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/prop-desc.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/prop-desc.js new file mode 100644 index 000000000000..367f292436a1 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/prop-desc.js @@ -0,0 +1,27 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Checks the "sliceToImmutable" property of ArrayBuffer.prototype +info: | + ECMAScript Standard Built-in Objects + ... + Every built-in function object, including constructors, has a "length" + property whose value is a non-negative integral Number. Unless otherwise + specified, this value is the number of required parameters shown in the + subclause heading for the function description. Optional parameters and rest + parameters are not included in the parameter count. + ... + For functions that are specified as properties of objects, the name value is + the property name string used to access the function. +features: [immutable-arraybuffer] +includes: [propertyHelper.js] +---*/ + +verifyPrimordialCallableProperty( + ArrayBuffer.prototype, + "sliceToImmutable", + "sliceToImmutable", + 2 +); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-becomes-detached.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-becomes-detached.js new file mode 100644 index 000000000000..bca411f04fa9 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-becomes-detached.js @@ -0,0 +1,50 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Throws if receiver is detached by bounds resolution +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + ... + 6. Let bounds be ? ResolveBounds(len, start, end). + ... + 10. NOTE: Side-effects of the above steps may have detached or resized O. + 11. If IsDetachedBuffer(O) is true, throw a TypeError exception. + + ResolveBounds ( len, start, end ) + 1. Let relativeStart be ? ToIntegerOrInfinity(start). + 2. If relativeStart = -∞, let from be 0. + 3. Else if relativeStart < 0, let from be max(len + relativeStart, 0). + 4. Else, let from be min(relativeStart, len). + 5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + 6. If relativeEnd = -∞, let to be 0. + 7. Else if relativeEnd < 0, let to be max(len + relativeEnd, 0). + 8. Else, let to be min(relativeEnd, len). + 9. Return the Record { [[From]]: from, [[To]]: to }. +features: [immutable-arraybuffer] +includes: [compareArray.js, detachArrayBuffer.js] +---*/ + +var fn = ArrayBuffer.prototype.sliceToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var ab = new ArrayBuffer(8); +var calls = []; +var objStart = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } +}; +var objEnd = { + valueOf() { + $DETACHBUFFER(ab); + calls.push("end.valueOf"); + return 1; + } +}; +assert.throws(TypeError, function() { + ab.sliceToImmutable(objStart, objEnd); +}); +assert.compareArray(calls, ["start.valueOf", "end.valueOf"]); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-grows.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-grows.js new file mode 100644 index 000000000000..11a412cb1fe1 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-grows.js @@ -0,0 +1,54 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Calculates bounds from original length if receiver grows. +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + ... + 5. Let len be O.[[ArrayBufferByteLength]]. + 6. Let bounds be ? ResolveBounds(len, start, end). + 7. Let first be bounds.[[From]]. + 8. Let final be bounds.[[To]]. + 9. Let newLen be max(final - first, 0). + ... + 12. Let fromBuf be O.[[ArrayBufferData]]. + 13. Let currentLen be O.[[ArrayBufferByteLength]]. + 14. If currentLen < final, throw a RangeError exception. + 15. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newLen, fromBuf, first, newLen). + 16. Return newBuffer. + + ResolveBounds ( len, start, end ) + 1. Let relativeStart be ? ToIntegerOrInfinity(start). + 2. If relativeStart = -∞, let from be 0. + 3. Else if relativeStart < 0, let from be max(len + relativeStart, 0). + 4. Else, let from be min(relativeStart, len). + 5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + 6. If relativeEnd = -∞, let to be 0. + 7. Else if relativeEnd < 0, let to be max(len + relativeEnd, 0). + 8. Else, let to be min(relativeEnd, len). + 9. Return the Record { [[From]]: from, [[To]]: to }. +features: [resizable-arraybuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var source = new ArrayBuffer(10, { maxByteLength: 12 }); +var view = new Uint8Array(source); +for (var i = 0; i < 10; i++) view[i] = i + 1; + +var start = { + valueOf() { + source.resize(11); + return -7; + } +}; +var end = { + valueOf() { + source.resize(12); + return -4; + } +}; +var dest = source.sliceToImmutable(start, end); +assert.compareArray(new Uint8Array(dest), [4, 5, 6]); +assert.sameValue(source.byteLength, 12); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-has-no-arraybufferdata-internal.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-has-no-arraybufferdata-internal.js new file mode 100644 index 000000000000..ef4a4fd25265 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-has-no-arraybufferdata-internal.js @@ -0,0 +1,66 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: > + Throws a TypeError exception when `this` does not have a [[ArrayBufferData]] + internal slot +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +features: [DataView, Int8Array, ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.sliceToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; +var start = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } +}; +var end = { + valueOf() { + calls.push("end.valueOf"); + return 1; + } +}; + +var badReceivers = [ + ["plain object", {}], + ["array", []], + ["function", function(){}], + ["ArrayBuffer.prototype", ArrayBuffer.prototype], + ["TypedArray", new Int8Array(8)], + ["DataView", new DataView(new ArrayBuffer(8), 0)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + calls = []; + assert.throws(TypeError, function() { + fn.call(value, start, end); + }, label); + assert.compareArray(calls, [], + "[" + label + " receiver] Must verify internal slots before reading arguments."); +} + +calls = []; +assert.throws(TypeError, function() { + ArrayBuffer.prototype.sliceToImmutable(start, end); +}, "invoked as prototype method"); +assert.compareArray(calls, [], + "[invoked as prototype method] Must verify internal slots before reading arguments."); + +calls = []; +assert.throws(TypeError, function() { + fn(start, end); +}, "invoked as function"); +assert.compareArray(calls, [], + "[invoked as function] Must verify internal slots before reading arguments."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-detached.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-detached.js new file mode 100644 index 000000000000..dc8435c16052 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-detached.js @@ -0,0 +1,38 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: > + Throws a TypeError exception when `this` is already detached +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. + 4. If IsDetachedBuffer(O) is true, throw a TypeError exception. +features: [immutable-arraybuffer] +includes: [compareArray.js, detachArrayBuffer.js] +---*/ + +var calls = []; +var start = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } +}; +var end = { + valueOf() { + calls.push("end.valueOf"); + return 1; + } +}; + +var detached = new ArrayBuffer(8); +$DETACHBUFFER(detached); +assert.throws(TypeError, function() { + detached.sliceToImmutable(start, end); +}); +assert.compareArray(calls, [], + "Must verify non-detachment before reading arguments."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-object.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-object.js new file mode 100644 index 000000000000..c1727076cca5 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-not-object.js @@ -0,0 +1,53 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Throws a TypeError exception when `this` is not an object +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +features: [ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.sliceToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; +var start = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } +}; +var end = { + valueOf() { + calls.push("end.valueOf"); + return 1; + } +}; + +var badReceivers = [ + ["undefined", undefined], + ["null", null], + ["number", 42], + ["string", "1"], + ["true", true], + ["false", false], + typeof Symbol === "undefined" ? undefined : ["unique symbol", Symbol("1")], + typeof Symbol === "undefined" || !Symbol.for ? undefined : ["registered symbol", Symbol.for("1")], + typeof BigInt === "undefined" ? undefined : ["bigint", BigInt(1)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + calls = []; + assert.throws(TypeError, function() { + fn.call(value, start, end); + }, label); + assert.compareArray(calls, [], + "[" + label + " receiver] Must verify internal slots before reading arguments."); +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-sharedarraybuffer.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-sharedarraybuffer.js new file mode 100644 index 000000000000..13b1e3cdfb71 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-is-sharedarraybuffer.js @@ -0,0 +1,38 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Throws a TypeError exception when `this` is a SharedArrayBuffer +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + 1. Let O be the this value. + 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +features: [SharedArrayBuffer, ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.sliceToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; +var start = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } +}; +var end = { + valueOf() { + calls.push("end.valueOf"); + return 1; + } +}; + +var sab = new SharedArrayBuffer(4); +assert.throws(TypeError, function() { + fn.call(sab, start, end); +}); +assert.compareArray(calls, [], + "Must verify non-SharedArrayBuffer receiver before reading arguments."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-shrinks.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-shrinks.js new file mode 100644 index 000000000000..98d7d4906bbf --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/sliceToImmutable/this-shrinks.js @@ -0,0 +1,74 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.slicetoimmutable +description: Calculates bounds from original length if receiver shrinks. +info: | + ArrayBuffer.prototype.sliceToImmutable ( start, end ) + ... + 5. Let len be O.[[ArrayBufferByteLength]]. + 6. Let bounds be ? ResolveBounds(len, start, end). + 7. Let first be bounds.[[From]]. + 8. Let final be bounds.[[To]]. + 9. Let newLen be max(final - first, 0). + ... + 12. Let fromBuf be O.[[ArrayBufferData]]. + 13. Let currentLen be O.[[ArrayBufferByteLength]]. + 14. If currentLen < final, throw a RangeError exception. + 15. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newLen, fromBuf, first, newLen). + 16. Return newBuffer. + + ResolveBounds ( len, start, end ) + 1. Let relativeStart be ? ToIntegerOrInfinity(start). + 2. If relativeStart = -∞, let from be 0. + 3. Else if relativeStart < 0, let from be max(len + relativeStart, 0). + 4. Else, let from be min(relativeStart, len). + 5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + 6. If relativeEnd = -∞, let to be 0. + 7. Else if relativeEnd < 0, let to be max(len + relativeEnd, 0). + 8. Else, let to be min(relativeEnd, len). + 9. Return the Record { [[From]]: from, [[To]]: to }. +features: [resizable-arraybuffer, immutable-arraybuffer] +includes: [compareArray.js, detachArrayBuffer.js] +---*/ + +var source = new ArrayBuffer(10, { maxByteLength: 10 }); +var view = new Uint8Array(source); +for (var i = 0; i < 10; i++) view[i] = i + 1; + +var startResizeTo = 9; +var endResizeTo = 8; +var start = { + valueOf() { + source.resize(startResizeTo); + return -7; + } +}; +var end = { + valueOf() { + source.resize(endResizeTo); + return -4; + } +}; +var dest = source.sliceToImmutable(start, end); +assert.compareArray(new Uint8Array(dest), [4, 5, 6]); +assert.sameValue(source.byteLength, 8); + +source.resize(10); +endResizeTo = 5; +assert.throws(RangeError, function() { + source.sliceToImmutable(start, end); +}, "resize below resolved end"); + +source.resize(10); +end = { + valueOf() { + source.resize(5); + $DETACHBUFFER(source); + return 6; + } +}; +assert.throws(TypeError, function() { + source.sliceToImmutable(0, end); +}, "Must verify non-detachment before final bounds check"); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/new-length-coercion.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/new-length-coercion.js new file mode 100644 index 000000000000..51d4c035017c --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/new-length-coercion.js @@ -0,0 +1,254 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: Requested length is coerced to an integer and checked for validity +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). + 2. If IsSharedArrayBuffer(arrayBuffer) is true, throw a TypeError exception. + 3. If newLength is undefined, then + a. Let newByteLength be arrayBuffer.[[ArrayBufferByteLength]]. + 4. Else, + a. Let newByteLength be ? ToIndex(newLength). + + ToIndex ( value ) + 1. Let integer be ? ToIntegerOrInfinity(value). + 2. If integer is not in the inclusive interval from 0 to 2**53 - 1, throw a RangeError exception. + 3. Return integer. + + ToIntegerOrInfinity ( argument ) + 1. Let number be ? ToNumber(argument). + 2. If number is one of NaN, +0𝔽, or -0𝔽, return 0. + 3. If number is +∞𝔽, return +∞. + 4. If number is -∞𝔽, return -∞. + 5. Return truncate(ℝ(number)). +features: [immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var ab = new ArrayBuffer(8); +assert.sameValue(ab.transferToImmutable().byteLength, 8, + "Must default to receiver byteLength."); +ab = new ArrayBuffer(8); +assert.sameValue(ab.transferToImmutable(undefined).byteLength, 8, + "Must default undefined to receiver byteLength."); + +var goodLengths = [ + // Unmodified integral numbers + [0, 0], + [1, 1], + [10, 10], + // Truncated integral numbers + [0.9, 0], + [1.9, 1], + [-0.9, 0], + // Coerced to integral numbers + [-0, 0], + [null, 0], + [false, 0], + [true, 1], + ["", 0], + ["8", 8], + ["+9", 9], + ["10e0", 10], + ["+1.1E+1", 11], + ["+.12e2", 12], + ["130e-1", 13], + ["0b1110", 14], + ["0XF", 15], + ["0xf", 15], + ["0o20", 16], + // Coerced to NaN and mapped to 0 + [NaN, 0], + ["7up", 0], + ["1_0", 0], + ["0x00_ff", 0] +]; + +for (var i = 0; i < goodLengths.length; i++) { + var rawLength = goodLengths[i][0]; + var intLength = goodLengths[i][1]; + var ab = new ArrayBuffer(8); + assert.sameValue(ab.transferToImmutable(rawLength).byteLength, intLength, + "transferToImmutable(" + formatSimpleValue(rawLength) + ").byteLength"); +} + +var whitespace = "\t\v\f\uFEFF\u3000\n\r\u2028\u2029"; +for (var i = 0; i < goodLengths.length; i++) { + var rawLength = goodLengths[i][0]; + var intLength = goodLengths[i][1]; + if (typeof rawLength === "number") { + rawLength = isNegativeZero(rawLength) ? "-0" : String(rawLength); + } else if (typeof rawLength !== "string") { + continue; + } + var paddedLength = whitespace + rawLength + whitespace; + var ab = new ArrayBuffer(8); + assert.sameValue(ab.transferToImmutable(paddedLength).byteLength, intLength, + "transferToImmutable(" + formatSimpleValue(paddedLength) + ").byteLength"); +} + +for (var i = 0; i < goodLengths.length; i++) { + var rawLength = goodLengths[i][0]; + var intLength = goodLengths[i][1]; + var calls = []; + var badValueOf = false; + var badToString = false; + var objLength = { + valueOf() { + calls.push("valueOf"); + return badValueOf ? {} : rawLength; + }, + toString() { + calls.push("toString"); + return badToString ? {} : rawLength; + } + }; + + var ab = new ArrayBuffer(8); + assert.sameValue(ab.transferToImmutable(objLength).byteLength, intLength, + "transferToImmutable({ valueOf: () => " + formatSimpleValue(rawLength) + " }).byteLength"); + assert.compareArray(calls, ["valueOf"], + "transferToImmutable({ valueOf: () => " + formatSimpleValue(rawLength) + " }) calls"); + + badValueOf = true; + calls = []; + ab = new ArrayBuffer(8); + assert.sameValue(ab.transferToImmutable(objLength).byteLength, intLength, + "transferToImmutable({ toString: () => " + formatSimpleValue(rawLength) + " }).byteLength"); + assert.compareArray(calls, ["valueOf", "toString"], + "transferToImmutable({ toString: () => " + formatSimpleValue(rawLength) + " }) calls"); + + badToString = true; + if (typeof Symbol === undefined || !Symbol.toPrimitive) continue; + calls = []; + objLength[Symbol.toPrimitive] = function(hint) { + calls.push("Symbol.toPrimitive(" + hint + ")"); + return rawLength; + }; + ab = new ArrayBuffer(8); + assert.sameValue(ab.transferToImmutable(objLength).byteLength, intLength, + "transferToImmutable({ [Symbol.toPrimitive]: () => " + formatSimpleValue(rawLength) + " }).byteLength"); + assert.compareArray(calls, ["Symbol.toPrimitive(number)"], + "transferToImmutable({ [Symbol.toPrimitive]: () => " + formatSimpleValue(rawLength) + " }) calls"); +} + +var badLengths = [ + // Out of range numbers + [-1, RangeError], + [9007199254740992, RangeError], // Math.pow(2, 53) = 9007199254740992 + [Infinity, RangeError], + [-Infinity, RangeError], + // non-numbers + typeof Symbol === undefined ? undefined : [Symbol("1"), TypeError], + typeof Symbol === undefined || !Symbol.for ? undefined : [Symbol.for("1"), TypeError], + typeof BigInt === undefined ? undefined : [BigInt(1), TypeError], +]; + +for (var i = 0; i < badLengths.length; i++) { + if (!badLengths[i]) continue; + var rawLength = badLengths[i][0]; + var expectedErr = badLengths[i][1]; + var ab = new ArrayBuffer(8); + assert.throws(expectedErr, function() { + ab.transferToImmutable(rawLength); + }, "transferToImmutable(" + formatSimpleValue(rawLength) + ")"); +} + +for (var i = 0; i < badLengths.length; i++) { + if (!badLengths[i]) continue; + var rawLength = badLengths[i][0]; + var expectedErr = badLengths[i][1]; + if (typeof rawLength !== "number") continue; + var paddedLength = whitespace + rawLength + whitespace; + var ab = new ArrayBuffer(8); + assert.throws(expectedErr, function() { + ab.transferToImmutable(paddedLength); + }, "transferToImmutable(" + formatSimpleValue(paddedLength) + ")"); +} + +for (var i = 0; i < badLengths.length; i++) { + if (!badLengths[i]) continue; + var rawLength = badLengths[i][0]; + var expectedErr = badLengths[i][1]; + var calls = []; + var badValueOf = false; + var badToString = false; + var objLength = { + valueOf() { + calls.push("valueOf"); + return badValueOf ? {} : rawLength; + }, + toString() { + calls.push("toString"); + return badToString ? {} : rawLength; + } + }; + + var ab = new ArrayBuffer(8); + assert.throws(expectedErr, function() { + ab.transferToImmutable(objLength); + }, "transferToImmutable({ valueOf: () => " + formatSimpleValue(rawLength) + " })"); + assert.compareArray(calls, ["valueOf"], + "transferToImmutable({ valueOf: () => " + formatSimpleValue(rawLength) + " }) calls"); + + badValueOf = true; + calls = []; + ab = new ArrayBuffer(8); + assert.throws(expectedErr, function() { + ab.transferToImmutable(objLength); + }, "transferToImmutable({ toString: () => " + formatSimpleValue(rawLength) + " })"); + assert.compareArray(calls, ["valueOf", "toString"], + "transferToImmutable({ toString: () => " + formatSimpleValue(rawLength) + " }) calls"); + + badToString = true; + if (typeof Symbol === undefined || !Symbol.toPrimitive) continue; + calls = []; + objLength[Symbol.toPrimitive] = function(hint) { + calls.push("Symbol.toPrimitive(" + hint + ")"); + return rawLength; + }; + ab = new ArrayBuffer(8); + assert.throws(expectedErr, function() { + ab.transferToImmutable(objLength); + }, "transferToImmutable({ [Symbol.toPrimitive]: () => " + formatSimpleValue(rawLength) + " })"); + assert.compareArray(calls, ["Symbol.toPrimitive(number)"], + "transferToImmutable({ [Symbol.toPrimitive]: () => " + formatSimpleValue(rawLength) + " }) calls"); +} + +var calls = []; +var objLength = { + toString() { + calls.push("toString"); + return {}; + }, + valueOf() { + calls.push("valueOf"); + return {}; + } +}; +ab = new ArrayBuffer(8); +assert.throws(TypeError, function() { + ab.transferToImmutable(objLength); +}, "transferToImmutable(badOrdinaryToPrimitive)"); +assert.compareArray(calls, ["valueOf", "toString"], + "transferToImmutable(badOrdinaryToPrimitive) calls"); +if (typeof Symbol !== undefined && Symbol.toPrimitive) { + calls = []; + objLength[Symbol.toPrimitive] = function(hint) { + calls.push("Symbol.toPrimitive(" + hint + ")"); + return {}; + }; + ab = new ArrayBuffer(8); + assert.throws(TypeError, function() { + ab.transferToImmutable(objLength); + }, "transferToImmutable(badExoticToPrimitive)"); + assert.compareArray(calls, ["Symbol.toPrimitive(number)"], + "transferToImmutable(badExoticToPrimitive) calls"); +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/not-a-constructor.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/not-a-constructor.js new file mode 100644 index 000000000000..db701b0049fa --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/not-a-constructor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: ArrayBuffer.prototype.transferToImmutable is not a constructor function +info: | + ECMAScript Standard Built-in Objects + ... + Built-in function objects that are not identified as constructors do not + implement the [[Construct]] internal method unless otherwise specified in the + description of a particular function. +features: [Reflect.construct, immutable-arraybuffer] +includes: [isConstructor.js] +---*/ + +assert(!isConstructor(ArrayBuffer.prototype.transferToImmutable), + "ArrayBuffer.prototype.transferToImmutable is not a constructor"); + +var arrayBuffer = new ArrayBuffer(8); +assert.throws(TypeError, function() { + new arrayBuffer.transferToImmutable(); +}); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/prop-desc.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/prop-desc.js new file mode 100644 index 000000000000..76dcb3fe4cfa --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/prop-desc.js @@ -0,0 +1,27 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: Checks the "transferToImmutable" property of ArrayBuffer.prototype +info: | + ECMAScript Standard Built-in Objects + ... + Every built-in function object, including constructors, has a "length" + property whose value is a non-negative integral Number. Unless otherwise + specified, this value is the number of required parameters shown in the + subclause heading for the function description. Optional parameters and rest + parameters are not included in the parameter count. + ... + For functions that are specified as properties of objects, the name value is + the property name string used to access the function. +features: [immutable-arraybuffer] +includes: [propertyHelper.js] +---*/ + +verifyPrimordialCallableProperty( + ArrayBuffer.prototype, + "transferToImmutable", + "transferToImmutable", + 0 +); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-has-no-arraybufferdata-internal.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-has-no-arraybufferdata-internal.js new file mode 100644 index 000000000000..6d96c348a678 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-has-no-arraybufferdata-internal.js @@ -0,0 +1,63 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: > + Throws a TypeError exception when `this` does not have a [[ArrayBufferData]] + internal slot +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). +features: [DataView, Int8Array, ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.transferToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; +var newLength = { + valueOf() { + calls.push("newLength.valueOf"); + return 1; + } +}; + +var badReceivers = [ + ["plain object", {}], + ["array", []], + ["function", function(){}], + ["ArrayBuffer.prototype", ArrayBuffer.prototype], + ["TypedArray", new Int8Array(8)], + ["DataView", new DataView(new ArrayBuffer(8), 0)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + calls = []; + assert.throws(TypeError, function() { + fn.call(value, newLength); + }, label); + assert.compareArray(calls, [], + "[" + label + " receiver] Must verify internal slots before reading arguments."); +} + +calls = []; +assert.throws(TypeError, function() { + ArrayBuffer.prototype.transferToImmutable(newLength); +}, "invoked as prototype method"); +assert.compareArray(calls, [], + "[invoked as prototype method] Must verify internal slots before reading arguments."); + +calls = []; +assert.throws(TypeError, function() { + fn(newLength); +}, "invoked as function"); +assert.compareArray(calls, [], + "[invoked as function] Must verify internal slots before reading arguments."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-detachable.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-detachable.js new file mode 100644 index 000000000000..2dd1eefa81f6 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-detachable.js @@ -0,0 +1,66 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: > + Throws a TypeError exception when `this` is already detached or immutable +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). + 2. If IsSharedArrayBuffer(arrayBuffer) is true, throw a TypeError exception. + 3. If newLength is undefined, then + a. Let newByteLength be arrayBuffer.[[ArrayBufferByteLength]]. + 4. Else, + a. Let newByteLength be ? ToIndex(newLength). + 5. If IsDetachedBuffer(arrayBuffer) is true, throw a TypeError exception. + 6. If IsImmutableBuffer(arrayBuffer) is true, throw a TypeError exception. +features: [immutable-arraybuffer] +includes: [compareArray.js, detachArrayBuffer.js] +---*/ + +var calls = []; +var newLength = { + valueOf() { + calls.push("newLength.valueOf"); + return 1; + } +}; + +var detached = new ArrayBuffer(8); +$DETACHBUFFER(detached); +var immutable = (new ArrayBuffer(8)).transferToImmutable(); + +var badReceivers = [ + ["detached ArrayBuffer", detached], + ["immutable ArrayBuffer", immutable] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + calls = []; + assert.throws(TypeError, function() { + value.transferToImmutable(newLength); + }, label); + assert.compareArray(calls, ["newLength.valueOf"], + "[" + label + "] Must read arguments before verifying detachability."); +} + +calls = []; +var becomesDetached = new ArrayBuffer(8); +assert.throws(TypeError, function() { + becomesDetached.transferToImmutable({ + valueOf() { + calls.push("newLength.valueOf"); + $DETACHBUFFER(becomesDetached); + return 1; + } + }); +}, "becomes detached"); +assert.compareArray(calls, ["newLength.valueOf"], + "[becomes detached] Must read arguments before verifying detachability."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-object.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-object.js new file mode 100644 index 000000000000..3a686ae4a7c7 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-not-object.js @@ -0,0 +1,50 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: Throws a TypeError exception when `this` is not an object +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). +features: [ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.transferToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; +var newLength = { + valueOf() { + calls.push("newLength.valueOf"); + return 1; + } +}; + +var badReceivers = [ + ["undefined", undefined], + ["null", null], + ["number", 42], + ["string", "1"], + ["true", true], + ["false", false], + typeof Symbol === "undefined" ? undefined : ["unique symbol", Symbol("1")], + typeof Symbol === "undefined" || !Symbol.for ? undefined : ["registered symbol", Symbol.for("1")], + typeof BigInt === "undefined" ? undefined : ["bigint", BigInt(1)] +]; + +for (var i = 0; i < badReceivers.length; i++) { + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + calls = []; + assert.throws(TypeError, function() { + fn.call(value, newLength); + }, label); + assert.compareArray(calls, [], + "[" + label + " receiver] Must verify internal slots before reading arguments."); +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-sharedarraybuffer.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-sharedarraybuffer.js new file mode 100644 index 000000000000..53ab24c4789f --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/this-is-sharedarraybuffer.js @@ -0,0 +1,34 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: Throws a TypeError exception when `this` is a SharedArrayBuffer +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). + 2. If IsSharedArrayBuffer(arrayBuffer) is true, throw a TypeError exception. +features: [SharedArrayBuffer, ArrayBuffer, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var fn = ArrayBuffer.prototype.transferToImmutable; +assert.sameValue(typeof fn, "function", "Method must exist."); + +var calls = []; + +var sab = new SharedArrayBuffer(4); +assert.throws(TypeError, function() { + fn.call(sab, { + valueOf() { + calls.push("newLength.valueOf"); + return 1; + } + }); +}); +assert.compareArray(calls, [], + "Must verify non-SharedArrayBuffer receiver before reading arguments."); diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-larger.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-larger.js new file mode 100644 index 000000000000..a99cf7ca1b14 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-larger.js @@ -0,0 +1,79 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: > + `ab.transferToImmutable(largerByteLength)` detaches `ab` and returns an + immutable ArrayBuffer with contents equal to the concatenation of `ab` and + enough zeros to fill the specified length +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). + 2. If IsSharedArrayBuffer(arrayBuffer) is true, throw a TypeError exception. + 3. If newLength is undefined, then + a. Let newByteLength be arrayBuffer.[[ArrayBufferByteLength]]. + 4. Else, + a. Let newByteLength be ? ToIndex(newLength). + 5. If IsDetachedBuffer(arrayBuffer) is true, throw a TypeError exception. + 6. If IsImmutableBuffer(arrayBuffer) is true, throw a TypeError exception. + 7. If arrayBuffer.[[ArrayBufferDetachKey]] is not undefined, throw a TypeError exception. + 8. Let copyLength be min(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]). + 9. If preserveResizability is immutable, then + a. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newByteLength, arrayBuffer.[[ArrayBufferData]], 0, copyLength). + 10. Else, ... + 11. Perform ! DetachArrayBuffer(arrayBuffer). +features: [Uint8Array, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var byteLength = 4; +var newLengths = [5, 8, 9]; +var sourceMakers = [ + function fixed() { + return new ArrayBuffer(byteLength); + }, + ArrayBuffer.prototype.resize && function resizable() { + return new ArrayBuffer(byteLength, { maxByteLength: byteLength * 2 }); + }, + ArrayBuffer.prototype.resize && function shrunk() { + var ab = new ArrayBuffer(byteLength * 2, { maxByteLength: byteLength * 2 }); + ab.resize(byteLength); + return ab; + }, + ArrayBuffer.prototype.resize && function grown() { + var ab = new ArrayBuffer(byteLength / 2, { maxByteLength: byteLength }); + ab.resize(byteLength); + return ab; + } +]; + +for (var i = 0; i < sourceMakers.length; i++) { + if (!sourceMakers[i]) continue; + var name = sourceMakers[i].name; + for (var j = 0; j < newLengths.length; j++) { + var newLength = newLengths[j]; + var label = name + "(" + byteLength + ").transferToImmutable(" + newLength + ")"; + var source = sourceMakers[i](); + var sourceView = new Uint8Array(source); + var expectDestContents = new Array(newLength); + for (var k = 0; k < newLength; k++) { + if (k < byteLength) sourceView[k] = k + 1; + expectDestContents[k] = k < byteLength ? k + 1 : 0; + } + + var dest = source.transferToImmutable(newLength); + assert.sameValue(source.detached, true, label + " source detached"); + assert.sameValue(dest.immutable, true, label + " is immutable"); + assert.sameValue(dest.resizable, false, label + " is not resizable"); + assert.sameValue(dest.byteLength, newLength, label + " byteLength"); + assert.sameValue(dest.maxByteLength, newLength, label + " maxByteLength"); + + var destView = new Uint8Array(dest); + assert.compareArray(destView, expectDestContents, label + " contents"); + } +} diff --git a/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-same-or-smaller.js b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-same-or-smaller.js new file mode 100644 index 000000000000..b0c7e4440804 --- /dev/null +++ b/JSTests/test262/test/built-ins/ArrayBuffer/prototype/transferToImmutable/to-same-or-smaller.js @@ -0,0 +1,76 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-arraybuffer.prototype.transfertoimmutable +description: > + `ab.transferToImmutable(sameOrSmallerByteLength)` detaches `ab` and returns an + immutable ArrayBuffer with contents equal to the specified-length prefix of + `ab` +info: | + ArrayBuffer.prototype.transferToImmutable ( [ newLength ] ) + 1. Let O be the this value. + 2. Return ? ArrayBufferCopyAndDetach(O, newLength, ~immutable~). + + ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability ) + 1. Perform ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]). + 2. If IsSharedArrayBuffer(arrayBuffer) is true, throw a TypeError exception. + 3. If newLength is undefined, then + a. Let newByteLength be arrayBuffer.[[ArrayBufferByteLength]]. + 4. Else, + a. Let newByteLength be ? ToIndex(newLength). + 5. If IsDetachedBuffer(arrayBuffer) is true, throw a TypeError exception. + 6. If IsImmutableBuffer(arrayBuffer) is true, throw a TypeError exception. + 7. If arrayBuffer.[[ArrayBufferDetachKey]] is not undefined, throw a TypeError exception. + 8. Let copyLength be min(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]). + 9. If preserveResizability is immutable, then + a. Let newBuffer be ? AllocateImmutableArrayBuffer(%ArrayBuffer%, newByteLength, arrayBuffer.[[ArrayBufferData]], 0, copyLength). + 10. Else, ... + 11. Perform ! DetachArrayBuffer(arrayBuffer). +features: [Uint8Array, immutable-arraybuffer] +includes: [compareArray.js] +---*/ + +var byteLength = 4; +var sourceMakers = [ + function fixed() { + return new ArrayBuffer(byteLength); + }, + ArrayBuffer.prototype.resize && function resizable() { + return new ArrayBuffer(byteLength, { maxByteLength: byteLength * 2 }); + }, + ArrayBuffer.prototype.resize && function shrunk() { + var ab = new ArrayBuffer(byteLength * 2, { maxByteLength: byteLength * 2 }); + ab.resize(byteLength); + return ab; + }, + ArrayBuffer.prototype.resize && function grown() { + var ab = new ArrayBuffer(byteLength / 2, { maxByteLength: byteLength }); + ab.resize(byteLength); + return ab; + } +]; + +for (var i = 0; i < sourceMakers.length; i++) { + if (!sourceMakers[i]) continue; + var name = sourceMakers[i].name; + for (var j = -1; j <= byteLength; j++) { + var newLength = j < 0 ? undefined : j; + var label = name + "(" + byteLength + ").transferToImmutable(" + newLength + ")"; + var source = sourceMakers[i](); + var sourceView = new Uint8Array(source); + for (var k = 0; k < byteLength; k++) sourceView[k] = k + 1; + var expectDestContents = sourceView.slice(0, newLength); + + var dest = source.transferToImmutable(newLength); + assert.sameValue(source.detached, true, label + " source detached"); + assert.sameValue(dest.immutable, true, label + " is immutable"); + assert.sameValue(dest.resizable, false, label + " is not resizable"); + var resolvedNewLength = newLength === undefined ? byteLength : newLength; + assert.sameValue(dest.byteLength, resolvedNewLength, label + " byteLength"); + assert.sameValue(dest.maxByteLength, resolvedNewLength, label + " maxByteLength"); + + var destView = new Uint8Array(dest); + assert.compareArray(destView, expectDestContents, label + " contents"); + } +} diff --git a/JSTests/test262/test/built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js b/JSTests/test262/test/built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js index da00362a77eb..f0abf09b6f17 100644 --- a/JSTests/test262/test/built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js +++ b/JSTests/test262/test/built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js @@ -13,8 +13,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(TA => { - var typedArray = new TA(5); +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var typedArray = new TA(makeCtorArg(5)); var i = 0; assert.throws(TypeError, () => { for (let key of typedArray.keys()) { @@ -23,4 +23,4 @@ testWithTypedArrayConstructors(TA => { } }); assert.sameValue(i, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/bad-range.js b/JSTests/test262/test/built-ins/Atomics/add/bad-range.js index e01d96c79147..76994f228d4c 100644 --- a/JSTests/test262/test/built-ins/Atomics/add/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/add/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.add(view, IdxGen(view), 10); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/add/bigint/non-shared-bufferdata.js index 1f989deda730..c0ed426b7af9 100644 --- a/JSTests/test262/test/built-ins/Atomics/add/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/add/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.add(view, 0, 1n), 0n, 'Atomics.add(view, 0, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/good-views.js b/JSTests/test262/test/built-ins/Atomics/add/good-views.js index 95f60854d90e..a4cec394f2a9 100644 --- a/JSTests/test262/test/built-ins/Atomics/add/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/add/good-views.js @@ -51,4 +51,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.add(view, Idx, 0), 37, 'Atomics.add(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/add/immutable-buffer.js new file mode 100644 index 000000000000..deac3af56bbe --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/add/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.add +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.add ( typedArray, index, value ) + 1. Let add be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, add). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.add(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/add/non-shared-bufferdata.js index a326fa5f04ff..ca82b20116fb 100644 --- a/JSTests/test262/test/built-ins/Atomics/add/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/add/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.add(view, 0, 1), 0, 'Atomics.add(view, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/add/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/add/non-shared-int-views-throws.js index 4b2958e70616..1a0e9a231b2a 100644 --- a/JSTests/test262/test/built-ins/Atomics/add/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/add/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.add description: > - Atomics.add throws when operating on non-sharable integer TypedArrays + Atomics.add throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.add(view, 0, 1); }, `Atomics.add(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/bad-range.js b/JSTests/test262/test/built-ins/Atomics/and/bad-range.js index 811e39417270..291272363efc 100644 --- a/JSTests/test262/test/built-ins/Atomics/and/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/and/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.and(view, IdxGen(view), 10); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/and/bigint/non-shared-bufferdata.js index df04c89602c6..c677e9cbcfa9 100644 --- a/JSTests/test262/test/built-ins/Atomics/and/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/and/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.and(view, 0, 1n), 0n, 'Atomics.and(view, 0, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/good-views.js b/JSTests/test262/test/built-ins/Atomics/and/good-views.js index 59fbd736c4b4..634e48b6a792 100644 --- a/JSTests/test262/test/built-ins/Atomics/and/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/and/good-views.js @@ -66,4 +66,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.and(view, Idx, 0), 37, 'Atomics.and(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/and/immutable-buffer.js new file mode 100644 index 000000000000..c674c0eaf385 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/and/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.and +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.and ( typedArray, index, value ) + 1. Let and be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, and). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.and(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/and/non-shared-bufferdata.js index a734a08b393e..12fcd57a3dcd 100644 --- a/JSTests/test262/test/built-ins/Atomics/and/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/and/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.and(view, 0, 1), 0, 'Atomics.and(view, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/and/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/and/non-shared-int-views-throws.js index eb655928afb3..74d7d21858c6 100644 --- a/JSTests/test262/test/built-ins/Atomics/and/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/and/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.and description: > - Atomics.and throws when operating on non-sharable integer TypedArrays + Atomics.and throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.and(view, 0, 1); }, `Atomics.and(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/bad-range.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/bad-range.js index 7fbd13a384e4..b3d0819fc0cf 100644 --- a/JSTests/test262/test/built-ins/Atomics/compareExchange/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.compareExchange(view, IdxGen(view), 10, 0); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js index 93b060bfabf2..3322221da8c5 100644 --- a/JSTests/test262/test/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.compareExchange(view, 0, 0n, 1n), 0n, 'Atomics.compareExchange(view, 0, 0n, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/good-views.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/good-views.js index 99a55768041a..03e7c0220e7f 100644 --- a/JSTests/test262/test/built-ins/Atomics/compareExchange/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/good-views.js @@ -71,4 +71,4 @@ testWithTypedArrayConstructors(function(TA) { 'Atomics.compareExchange(view, Idx, 37, 0) returns 37' ); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/immutable-buffer.js new file mode 100644 index 000000000000..41bc1624d30e --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/immutable-buffer.js @@ -0,0 +1,54 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.compareexchange +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var expectedValue = { + valueOf() { + calls.push("expectedValue.valueOf"); + return 0; + } + }; + var replacementValue = { + valueOf() { + calls.push("replacementValue.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.compareExchange(ta, index, expectedValue, replacementValue); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-bufferdata.js index 57d00a34598b..e808423814e0 100644 --- a/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.compareExchange(view, 0, 0, 1), 0, 'Atomics.compareExchange(view, 0, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-int-views-throws.js index 3a4e907946dc..3ef0e4b61260 100644 --- a/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/compareExchange/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.compareexchange description: > - Atomics.compareExchange throws when operating on non-sharable integer TypedArrays + Atomics.compareExchange throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.compareExchange(view, 0, 0, 0); }, `Atomics.compareExchange(new ${TA.name}(buffer), 0, 0, 0) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/bad-range.js b/JSTests/test262/test/built-ins/Atomics/exchange/bad-range.js index a7f47b0bf253..4f1e7b885395 100644 --- a/JSTests/test262/test/built-ins/Atomics/exchange/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/exchange/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.exchange(view, IdxGen(view), 10, 0); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js index be94a42a77d9..1257b4e8828b 100644 --- a/JSTests/test262/test/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/exchange/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.exchange(view, 0, 1n), 0n, 'Atomics.exchange(view, 0, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/good-views.js b/JSTests/test262/test/built-ins/Atomics/exchange/good-views.js index 90b635d893ba..9a3783b1adc1 100644 --- a/JSTests/test262/test/built-ins/Atomics/exchange/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/exchange/good-views.js @@ -52,4 +52,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.exchange(view, Idx, 0), 37, 'Atomics.exchange(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/exchange/immutable-buffer.js new file mode 100644 index 000000000000..77a6cd75fa66 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/exchange/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.exchange +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.exchange ( typedArray, index, value ) + 1. Let second be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, second). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.exchange(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-bufferdata.js index 6fdb39decfb2..de36d4fd17e5 100644 --- a/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.exchange(view, 0, 1), 0, 'Atomics.exchange(view, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-int-views-throws.js index c179d828abb9..5e4bc4447d97 100644 --- a/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/exchange/non-shared-int-views-throws.js @@ -4,14 +4,14 @@ /*--- esid: sec-atomics.exchange description: > - Atomics.exchange throws when operating on non-sharable integer TypedArrays + Atomics.exchange throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.exchange(view, 0, 1); }, `Atomics.exchange(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/exchange/nonshared-int-views.js b/JSTests/test262/test/built-ins/Atomics/exchange/nonshared-int-views.js deleted file mode 100644 index b57c7634cdee..000000000000 --- a/JSTests/test262/test/built-ins/Atomics/exchange/nonshared-int-views.js +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2017 Mozilla Corporation. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-atomics.exchange -description: > - Atomics.exchange throws when operating on non-sharable integer TypedArrays -includes: [testTypedArray.js] -features: [ArrayBuffer, Atomics, TypedArray] ----*/ - -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); - const view = new TA(buffer); - - assert.throws(TypeError, function() { - Atomics.exchange(view, 0, 0); - }, `Atomics.exchange(new ${TA.name}(buffer), 0, 0) throws TypeError`); -}, null, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/isLockFree/bigint/expected-return-value.js b/JSTests/test262/test/built-ins/Atomics/isLockFree/bigint/expected-return-value.js index 3388924cf10a..3a2f7cbc8d20 100644 --- a/JSTests/test262/test/built-ins/Atomics/isLockFree/bigint/expected-return-value.js +++ b/JSTests/test262/test/built-ins/Atomics/isLockFree/bigint/expected-return-value.js @@ -31,5 +31,3 @@ testWithBigIntTypedArrayConstructors(function(TA) { 'Atomics.isLockFree(TA.BYTES_PER_ELEMENT) returns the value of `observed` (Atomics.isLockFree(TA.BYTES_PER_ELEMENT))' ); }, null, ["passthrough"]); - - diff --git a/JSTests/test262/test/built-ins/Atomics/load/bad-range.js b/JSTests/test262/test/built-ins/Atomics/load/bad-range.js index 3a3fecbf7a46..5c2e37c8067a 100644 --- a/JSTests/test262/test/built-ins/Atomics/load/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/load/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.load(view, IdxGen(view)); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/load/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/load/bigint/non-shared-bufferdata.js index d5df77554c51..08d782a91380 100644 --- a/JSTests/test262/test/built-ins/Atomics/load/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/load/bigint/non-shared-bufferdata.js @@ -7,8 +7,8 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/load/good-views.js b/JSTests/test262/test/built-ins/Atomics/load/good-views.js index 69b3d2813002..5615801dcff7 100644 --- a/JSTests/test262/test/built-ins/Atomics/load/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/load/good-views.js @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.load(view, Idx), 37, 'Atomics.load(view, Idx) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/load/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/load/non-shared-bufferdata.js index 51f485ee221e..e15e66057859 100644 --- a/JSTests/test262/test/built-ins/Atomics/load/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/load/non-shared-bufferdata.js @@ -8,10 +8,8 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/load/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/load/non-shared-int-views-throws.js index 1277efb684f5..02437f7ba5ca 100644 --- a/JSTests/test262/test/built-ins/Atomics/load/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/load/non-shared-int-views-throws.js @@ -4,14 +4,14 @@ /*--- esid: sec-atomics.load description: > - Atomics.load throws when operating on non-sharable integer TypedArrays + Atomics.load throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.load(view, 0); }, `Atomics.load(new ${TA.name}(buffer), 0) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/notify/immutable-buffer-returns-0.js b/JSTests/test262/test/built-ins/Atomics/notify/immutable-buffer-returns-0.js new file mode 100644 index 000000000000..f07f0a47fe04 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/notify/immutable-buffer-returns-0.js @@ -0,0 +1,46 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.notify +description: Returns 0 when TA.buffer is immutable +info: | + Atomics.notify ( typedArray, index, count ) + 1. Let taRecord be ? ValidateIntegerTypedArray(typedArray, true). + 2. Let byteIndexInBuffer be ? ValidateAtomicAccess(taRecord, index). + 3. If count is undefined, then + a. Let c be +∞. + 4. Else, + a. Let intCount be ? ToIntegerOrInfinity(count). + b. Let c be max(intCount, 0). + 5. Let buffer be typedArray.[[ViewedArrayBuffer]]. + 6. Let block be buffer.[[ArrayBufferData]]. + 7. If IsSharedArrayBuffer(buffer) is false, return +0𝔽. +features: [ArrayBuffer, Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +var waitableTypedArrayConstructors = [Int32Array]; +if (typeof BigInt64Array !== "undefined") { + waitableTypedArrayConstructors.push(BigInt64Array); +} + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var count = { + valueOf() { + calls.push("count.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.sameValue(Atomics.notify(ta, index, count), 0); + assert.compareArray(calls, ["index.valueOf", "count.valueOf"]); +}, waitableTypedArrayConstructors, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/bad-range.js b/JSTests/test262/test/built-ins/Atomics/or/bad-range.js index c221f203f175..1910e157ba53 100644 --- a/JSTests/test262/test/built-ins/Atomics/or/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/or/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.or(view, IdxGen(view), 10); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/or/bigint/non-shared-bufferdata.js index 6413bbe94072..f5cd4acac7e2 100644 --- a/JSTests/test262/test/built-ins/Atomics/or/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/or/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.or(view, 0, 1n), 0n, 'Atomics.or(view, 0, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/good-views.js b/JSTests/test262/test/built-ins/Atomics/or/good-views.js index bea292a310f0..0f2cb4038e0d 100644 --- a/JSTests/test262/test/built-ins/Atomics/or/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/or/good-views.js @@ -78,4 +78,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.or(view, Idx, 0), 37, 'Atomics.or(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/or/immutable-buffer.js new file mode 100644 index 000000000000..244ed23fa379 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/or/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.or +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.or ( typedArray, index, value ) + 1. Let or be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, or). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.or(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/or/non-shared-bufferdata.js index bdd1060102a9..8bfc4a13f7ae 100644 --- a/JSTests/test262/test/built-ins/Atomics/or/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/or/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.or(view, 0, 1), 0, 'Atomics.or(view, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/or/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/or/non-shared-int-views-throws.js index aa25ae3882d5..dfbbeedfbac4 100644 --- a/JSTests/test262/test/built-ins/Atomics/or/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/or/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.or description: > - Atomics.or throws when operating on non-sharable integer TypedArrays + Atomics.or throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.or(view, 0, 1); }, `Atomics.or(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/store/bad-range.js b/JSTests/test262/test/built-ins/Atomics/store/bad-range.js index 4449f85dcd3e..29f6167cca87 100644 --- a/JSTests/test262/test/built-ins/Atomics/store/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/store/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, IdxGen(view), 10); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/store/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/store/bigint/non-shared-bufferdata.js index 7ee3f779d122..03a68db18e0d 100644 --- a/JSTests/test262/test/built-ins/Atomics/store/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/store/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.store(view, 0, 1n), 1n, 'Atomics.store(view, 0, 1n) returns 1n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/store/good-views.js b/JSTests/test262/test/built-ins/Atomics/store/good-views.js index f84c83ce7ed6..2b2b341d61ae 100644 --- a/JSTests/test262/test/built-ins/Atomics/store/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/store/good-views.js @@ -51,7 +51,7 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.load(view, Idx), 37, 'Atomics.load(view, Idx) returns 37'); }); -}, views); +}, views, ["passthrough"]); function ToInteger(v) { v = +v; diff --git a/JSTests/test262/test/built-ins/Atomics/store/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/store/immutable-buffer.js new file mode 100644 index 000000000000..32cab0ac9f45 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/store/immutable-buffer.js @@ -0,0 +1,48 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.store +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.store ( typedArray, index, value ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.store(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/store/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/store/non-shared-bufferdata.js index 19cd477bef3c..680e3fc41c12 100644 --- a/JSTests/test262/test/built-ins/Atomics/store/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/store/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.store(view, 0, 1), 1, 'Atomics.store(view, 0, 1) returns 1'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/store/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/store/non-shared-int-views-throws.js index 57f0943c6d32..a38b97af5928 100644 --- a/JSTests/test262/test/built-ins/Atomics/store/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/store/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.store description: > - Atomics.store throws when operating on non-sharable integer TypedArrays + Atomics.store throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.store(view, 0, 1); }, `Atomics.store(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/bad-range.js b/JSTests/test262/test/built-ins/Atomics/sub/bad-range.js index 15eabc048a1f..a3e6e17f9e80 100644 --- a/JSTests/test262/test/built-ins/Atomics/sub/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/sub/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.sub(view, IdxGen(view), 10); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js index b07b6931dba1..7fffa5fd1791 100644 --- a/JSTests/test262/test/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/sub/bigint/non-shared-bufferdata.js @@ -7,10 +7,10 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.store(view, 0, 1n), 1n, 'Atomics.store(view, 0, 1n) returns 1n'); assert.sameValue(Atomics.sub(view, 0, 1n), 1n, 'Atomics.sub(view, 0, 1n) returns 1n'); assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/good-views.js b/JSTests/test262/test/built-ins/Atomics/sub/good-views.js index a13b7d15e8e4..5a5b03baad8b 100644 --- a/JSTests/test262/test/built-ins/Atomics/sub/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/sub/good-views.js @@ -51,4 +51,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.sub(view, Idx, 0), 37, 'Atomics.sub(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/sub/immutable-buffer.js new file mode 100644 index 000000000000..f3c7d83e33e0 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/sub/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.sub +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.sub ( typedArray, index, value ) + 1. Let subtract be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, subtract). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.sub(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/sub/non-shared-bufferdata.js index db536ccddceb..40c91a2cd70e 100644 --- a/JSTests/test262/test/built-ins/Atomics/sub/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/sub/non-shared-bufferdata.js @@ -8,12 +8,10 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.store(view, 0, 1), 1, 'Atomics.store(view, 0, 1) returns 1'); assert.sameValue(Atomics.sub(view, 0, 1), 1, 'Atomics.sub(view, 0, 1) returns 1'); assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/sub/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/sub/non-shared-int-views-throws.js index 091b2ef9f3b8..b055bf714acf 100644 --- a/JSTests/test262/test/built-ins/Atomics/sub/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/sub/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.sub description: > - Atomics.sub throws when operating on non-sharable integer TypedArrays + Atomics.sub throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(16); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.sub(view, 0, 1); }, `Atomics.sub(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/bad-range.js b/JSTests/test262/test/built-ins/Atomics/xor/bad-range.js index 0de01cbd9cd8..d1e7aa5e9b79 100644 --- a/JSTests/test262/test/built-ins/Atomics/xor/bad-range.js +++ b/JSTests/test262/test/built-ins/Atomics/xor/bad-range.js @@ -19,4 +19,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.xor(view, IdxGen(view), 0); }); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js index d68d56cac6ac..74b768bc9b88 100644 --- a/JSTests/test262/test/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/xor/bigint/non-shared-bufferdata.js @@ -7,9 +7,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.sameValue(Atomics.xor(view, 0, 1n), 0n, 'Atomics.xor(view, 0, 1n) returns 0n'); assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n'); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/good-views.js b/JSTests/test262/test/built-ins/Atomics/xor/good-views.js index 74198415fe5f..459c64e0086b 100644 --- a/JSTests/test262/test/built-ins/Atomics/xor/good-views.js +++ b/JSTests/test262/test/built-ins/Atomics/xor/good-views.js @@ -79,4 +79,4 @@ testWithTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37); assert.sameValue(Atomics.xor(view, Idx, 0), 37, 'Atomics.xor(view, Idx, 0) returns 37'); }); -}, views); +}, views, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/immutable-buffer.js b/JSTests/test262/test/built-ins/Atomics/xor/immutable-buffer.js new file mode 100644 index 000000000000..e40e51d2a7a3 --- /dev/null +++ b/JSTests/test262/test/built-ins/Atomics/xor/immutable-buffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.xor +description: > + Throws a TypeError exception when the backing buffer is immutable +info: | + Atomics.xor ( typedArray, index, value ) + 1. Let xor be a new read-modify-write modification function... + 2. Return ? AtomicReadModifyWrite(typedArray, index, value, xor). + + AtomicReadModifyWrite ( typedArray, index, value, op ) + 1. Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index, false, ~write~). + + ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex [ , waitable [ , accessMode ] ] ) + 1. If waitable is not present, set waitable to false. + 2. If accessMode is not present, set accessMode to ~read~. + 3. Let taRecord be ? ValidateIntegerTypedArray(typedArray, waitable, accessMode). + + ValidateIntegerTypedArray ( typedArray, waitable [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let taRecord be ? ValidateTypedArray(typedArray, unordered, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + ... + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Atomics, immutable-arraybuffer] +includes: [compareArray.js, testTypedArray.js] +---*/ + +testWithAllTypedArrayConstructors(function(TA, makeCtorArg) { + var calls = []; + var index = { + valueOf() { + calls.push("index.valueOf"); + return 0; + } + }; + var value = { + valueOf() { + calls.push("value.valueOf"); + return 1; + } + }; + + var ta = new TA(makeCtorArg(8)); + assert.throws(TypeError, function() { + Atomics.xor(ta, index, value); + }); + assert.compareArray(calls, []); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/non-shared-bufferdata.js b/JSTests/test262/test/built-ins/Atomics/xor/non-shared-bufferdata.js index 7f2fe1ae2646..ca5e3bb73156 100644 --- a/JSTests/test262/test/built-ins/Atomics/xor/non-shared-bufferdata.js +++ b/JSTests/test262/test/built-ins/Atomics/xor/non-shared-bufferdata.js @@ -8,11 +8,9 @@ description: > includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithAtomicsFriendlyTypedArrayConstructors(TA => { - const view = new TA( - new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4) - ); +testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const view = new TA(makeCtorArg(4)); assert.sameValue(Atomics.xor(view, 0, 1), 0, 'Atomics.xor(view, 0, 1) returns 0'); assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1'); -}, null, ["passthrough"]); +}, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Atomics/xor/non-shared-int-views-throws.js b/JSTests/test262/test/built-ins/Atomics/xor/non-shared-int-views-throws.js index 84dab376692b..6014382047dc 100644 --- a/JSTests/test262/test/built-ins/Atomics/xor/non-shared-int-views-throws.js +++ b/JSTests/test262/test/built-ins/Atomics/xor/non-shared-int-views-throws.js @@ -4,15 +4,15 @@ /*--- esid: sec-atomics.xor description: > - Atomics.xor throws when operating on non-sharable integer TypedArrays + Atomics.xor throws when operating on incompatible TypedArrays includes: [testTypedArray.js] features: [ArrayBuffer, Atomics, TypedArray] ---*/ -testWithNonAtomicsFriendlyTypedArrayConstructors(TA => { - const buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT * 4); +testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => { + const buffer = makeCtorArg(4); const view = new TA(buffer); assert.throws(TypeError, function() { Atomics.xor(view, 0, 1); }, `Atomics.xor(new ${TA.name}(buffer), 0, 1) throws TypeError`); -}, null, ["passthrough"]); +}, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-cross-realm.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-cross-realm.js new file mode 100644 index 000000000000..6aabbadec962 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-cross-realm.js @@ -0,0 +1,51 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + The getter's [[ErrorData]] check is realm-agnostic: a getter from realm A + invoked on an Error instance from realm B returns a String, since the + internal-slot check examines object identity of the slot, not realm origin. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +features: [error-stack-accessor, cross-realm] +---*/ + +var getA = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +var realmB = $262.createRealm().global; + +assert.notSameValue( + Error.prototype, + realmB.Error.prototype, + 'precondition: the two realms have distinct Error.prototype objects' +); + +// (a) Realm A's getter on a realm B Error instance: the instance has +// [[ErrorData]], so the getter returns a string regardless of which realm +// owns the slot. +var errB = new realmB.Error('msg'); +assert.sameValue(typeof getA.call(errB), 'string', 'cross-realm Error instance returns a string'); + +// (b) Realm A's getter on a realm B plain object: no [[ErrorData]], returns +// undefined. +var plainB = new realmB.Object(); +assert.sameValue(getA.call(plainB), undefined, 'cross-realm plain object returns undefined'); + +// (c) Realm A's getter on realm B's Error.prototype: the prototype object +// itself has no [[ErrorData]] slot, so the getter returns undefined. +assert.sameValue(getA.call(realmB.Error.prototype), undefined, 'cross-realm Error.prototype returns undefined'); + +// (d) Realm B's getter on a realm A Error instance: same logic in reverse. +var getB = Object.getOwnPropertyDescriptor(realmB.Error.prototype, 'stack').get; +assert.sameValue(typeof getB, 'function', 'realm B has its own getter'); +assert.notSameValue(getA, getB, 'the two realms have distinct getter functions'); + +var errA = new Error('msg'); +assert.sameValue(typeof getB.call(errA), 'string', 'realm B getter on realm A Error instance returns a string'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-data-property-shadows.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-data-property-shadows.js new file mode 100644 index 000000000000..16736f2d54fb --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-data-property-shadows.js @@ -0,0 +1,37 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + An own data property named "stack" on an Error instance shadows the inherited + accessor when accessed via property lookup. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + Object.defineProperty(err, 'stack', { + value: 'sentinel', + writable: true, + enumerable: true, + configurable: true, + }); + + assert.sameValue(err.stack, 'sentinel', Ctor.name + ': own data property is returned by [[Get]]'); + + // The inherited accessor still produces a string when invoked directly, + // because the algorithm operates on the [[ErrorData]] slot, not on properties. + assert.sameValue(typeof get.call(err), 'string', Ctor.name + ': inherited accessor still returns a string'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-as-prototype.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-as-prototype.js new file mode 100644 index 000000000000..3c8eb6496c01 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-as-prototype.js @@ -0,0 +1,38 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + An object whose prototype is an Error instance does not itself have an + [[ErrorData]] internal slot, so the getter returns undefined. The slot is + not inherited through the prototype chain. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [nativeErrors.js] +features: [error-stack-accessor, __proto__] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var protoErr = new Ctor('outer'); + var o = { __proto__: protoErr }; + + assert.sameValue(get.call(o), undefined, Ctor.name + ': get.call on object with instance as proto'); + + // Property access walks the prototype chain to find the accessor on + // Error.prototype, then calls the getter with this set to the original + // receiver (o). Because o lacks [[ErrorData]], the result is undefined. + assert.sameValue(o.stack, undefined, Ctor.name + ': property access on object with instance as proto'); + + // The inherited instance still produces a string when the getter is invoked + // on it directly. + assert.sameValue(typeof get.call(protoErr), 'string', Ctor.name + ': get.call on the underlying instance'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-instance.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-instance.js new file mode 100644 index 000000000000..aeb820f6738d --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-instance.js @@ -0,0 +1,38 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + Returns a String when called on an Error instance. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +var errors = []; +for (var i = 0; i < allErrorConstructors.length; ++i) { + var Ctor = allErrorConstructors[i]; + errors.push([Ctor.name, makeNativeError(Ctor, true), makeNativeError(Ctor, false)]); +} + +for (var i = 0; i < errors.length; ++i) { + var name = errors[i][0]; + var err = errors[i][1]; + var err2 = errors[i][2]; + + assert.sameValue(typeof get.call(err), 'string', name + ': new Ctor instance via get.call'); + assert.sameValue(typeof err.stack, 'string', name + ': new Ctor instance via property access'); + + assert.sameValue(typeof get.call(err2), 'string', name + ': Ctor called without new'); + + assert.sameValue(typeof get.call(err), 'string', name + ': second call still returns a string'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-prototype.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-prototype.js new file mode 100644 index 000000000000..0aba41d59465 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-error-prototype.js @@ -0,0 +1,42 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + The getter returns undefined when called on Error.prototype itself or any + NativeError prototype: each is an ordinary object that is not an Error + instance and does not have an [[ErrorData]] internal slot. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. + + Properties of the Error Prototype Object + + The Error prototype object: + [...] + is not an Error instance and does not have an [[ErrorData]] internal slot. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +var prototypes = []; +for (var i = 0; i < allErrorConstructors.length; ++i) { + var Ctor = allErrorConstructors[i]; + prototypes.push([Ctor.name + '.prototype', Ctor.prototype]); +} + +for (var i = 0; i < prototypes.length; ++i) { + var label = prototypes[i][0]; + var proto = prototypes[i][1]; + assert.sameValue(get.call(proto), undefined, label); +} + +// Access via the property also returns undefined on Error.prototype. +assert.sameValue(Error.prototype.stack, undefined, 'Error.prototype.stack property access'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-foreign-new-target.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-foreign-new-target.js new file mode 100644 index 000000000000..0661a709e8d2 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-foreign-new-target.js @@ -0,0 +1,46 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + An Error instance constructed with a non-Error new.target acquires the + [[ErrorData]] internal slot from Error's [[Construct]], so the getter + returns a String when invoked directly. Property access via the result + does NOT find the inherited accessor, because the result's [[Prototype]] + is the new.target's prototype, not Error.prototype. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [nativeErrors.js] +features: [error-stack-accessor, Reflect.construct] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +function NotAnError() {} + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var e = Reflect.construct(Ctor, ['msg'], NotAnError); + + assert.sameValue( + Object.getPrototypeOf(e), + NotAnError.prototype, + Ctor.name + ': [[Prototype]] is the new.target prototype' + ); + + // The internal slot is set by Ctor's [[Construct]] regardless of new.target, + // so the getter (called directly) still produces a string. + assert.sameValue(typeof get.call(e), 'string', Ctor.name + ': via get.call'); + + // Property access on the instance does NOT find the inherited accessor: + // Error.prototype is not on e's prototype chain (it's only on Ctor.prototype, + // which is bypassed by the foreign new.target). The lookup walks + // NotAnError.prototype then Object.prototype and returns undefined. + assert.sameValue(e.stack, undefined, Ctor.name + ': property access returns undefined'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-no-error-data.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-no-error-data.js new file mode 100644 index 000000000000..2e6df9fff4e6 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-no-error-data.js @@ -0,0 +1,58 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + Returns undefined when called on an object that does not have an + [[ErrorData]] internal slot. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +var receivers = [ + ['plain object', {}], + ['null-prototype object', { __proto__: null }], + ['array', []], + ['function', function () {}], + ['RegExp', /re/], + ['Date', new Date()], + ['Boolean wrapper', new Boolean(true)], + ['Number wrapper', new Number(0)], + ['String wrapper', new String('')], + typeof ArrayBuffer === 'undefined' ? null : ['ArrayBuffer', new ArrayBuffer(0)], + typeof Map === 'undefined' ? null : ['Map', new Map()], + typeof Set === 'undefined' ? null : ['Set', new Set()], + typeof WeakMap === 'undefined' ? null : ['WeakMap', new WeakMap()], + typeof WeakSet === 'undefined' ? null : ['WeakSet', new WeakSet()], + typeof Promise === 'undefined' ? null : ['Promise', new Promise(function () {})], + typeof Int8Array === 'undefined' ? null : ['TypedArray', new Int8Array()] +]; + +for (var i = 0; i < receivers.length; ++i) { + if (!receivers[i]) continue; + var label = receivers[i][0]; + var value = receivers[i][1]; + assert.sameValue(get.call(value), undefined, label); +} + +// An object that inherits from Error.prototype but lacks [[ErrorData]] still +// returns undefined: the getter checks for the internal slot, not the prototype. +var fakeError = Object.create(Error.prototype); +assert.sameValue(get.call(fakeError), undefined, 'object with Error.prototype on its prototype chain'); + +var fakeErrorWithStack = Object.create(Error.prototype); +Object.defineProperty(fakeErrorWithStack, 'stack', { value: 'imposter', writable: true, enumerable: true, configurable: true }); +assert.sameValue( + get.call(fakeErrorWithStack), + undefined, + 'an existing own "stack" data property is ignored by the getter on a non-Error object' +); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-not-a-constructor.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-not-a-constructor.js new file mode 100644 index 000000000000..2a594897578f --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-not-a-constructor.js @@ -0,0 +1,28 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + get Error.prototype.stack does not implement [[Construct]], is not new-able +info: | + ECMAScript Function Objects + + Built-in function objects that are not identified as constructors do not + implement the [[Construct]] internal method unless otherwise specified in + the description of a particular function. +includes: [isConstructor.js] +features: [error-stack-accessor, Reflect.construct] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +assert.sameValue( + isConstructor(get), + false, + 'isConstructor(get Error.prototype.stack) must return false' +); + +assert.throws(TypeError, function () { + new get(); +}); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-receiver-is-proxy.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-receiver-is-proxy.js new file mode 100644 index 000000000000..a43bf4ce4e8b --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-receiver-is-proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + The getter operates on the receiver's [[ErrorData]] internal slot directly. + When the receiver is a Proxy, the proxy's traps are not consulted: a Proxy + has no [[ErrorData]] internal slot regardless of its target, so the getter + returns undefined. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [proxyTrapsHelper.js] +features: [error-stack-accessor, Proxy, Reflect] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +// (a) Proxy wrapping an Error instance: the Proxy itself has no [[ErrorData]], +// so the getter returns undefined without consulting the wrapped target. No +// proxy traps should fire; allowProxyTraps with no overrides throws +// Test262Error if any do. +assert.sameValue( + get.call(new Proxy(new Error('inner'), allowProxyTraps(null, '(a)'))), + undefined, + 'Proxy wrapping Error returns undefined' +); + +// (b) Property access through the Proxy: the [[Get]] forwards the access to +// the proxy's get trap, but the receiver passed through to the inherited +// accessor on Error.prototype is the proxy itself. Since the proxy lacks +// [[ErrorData]], the getter returns undefined; the get trap fires exactly +// once for the property access. +var stackTrapCalls = 0; +var pB = new Proxy(new Error('inner'), allowProxyTraps({ + get: function (t, key, receiver) { + if (key === 'stack') { + stackTrapCalls += 1; + } + return Reflect.get(t, key, receiver); + } +}, '(b)')); +assert.sameValue(pB.stack, undefined, 'property access on proxy: receiver is proxy, no [[ErrorData]]'); +assert.sameValue(stackTrapCalls, 1, 'get trap fired once for the property access'); + +// (c) Proxy wrapping a non-Error: still undefined. +assert.sameValue( + get.call(new Proxy({}, allowProxyTraps(null, '(c)'))), + undefined, + 'Proxy wrapping plain object returns undefined' +); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-subclass.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-subclass.js new file mode 100644 index 000000000000..fcda36a2f961 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-subclass.js @@ -0,0 +1,29 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + The getter returns a String when called on a subclass of Error or any + NativeError, since subclasses inherit the [[ErrorData]] internal slot. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If E does not have an [[ErrorData]] internal slot, return undefined. + 4. Return an implementation-defined string that represents the stack trace of E. +includes: [nativeErrors.js] +features: [error-stack-accessor, class] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var Sub = class extends Ctor {}; + var e = new Sub('msg'); + + assert.sameValue(typeof get.call(e), 'string', Ctor.name + ': subclass via get.call'); + assert.sameValue(typeof e.stack, 'string', Ctor.name + ': subclass via property access'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/getter-this-not-object.js b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-this-not-object.js new file mode 100644 index 000000000000..b0a61ccdcad7 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/getter-this-not-object.js @@ -0,0 +1,38 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype.stack +description: > + Throws a TypeError if the this value is not an Object. +info: | + get Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +assert.sameValue(typeof get, 'function'); + +var badReceivers = [ + ['undefined', undefined], + ['null', null], + ['true', true], + ['false', false], + ['number', 1], + ['string', ''], + typeof Symbol === 'undefined' ? null : ['symbol', Symbol('s')], + typeof BigInt === 'undefined' ? null : ['bigint', BigInt(0)] +]; + +for (var i = 0; i < badReceivers.length; ++i) { + if (!badReceivers[i]) continue; + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + assert.throws(TypeError, function () { + get.call(value); + }, label); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/instance-no-own-stack.js b/JSTests/test262/test/built-ins/Error/prototype/stack/instance-no-own-stack.js new file mode 100644 index 000000000000..560a4fe34855 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/instance-no-own-stack.js @@ -0,0 +1,53 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-error-instances +description: > + A freshly-constructed Error instance has no own "stack" property; the + property is reached via the inherited accessor on Error.prototype. +info: | + Properties of Error Instances + + Error instances are ordinary objects that inherit properties from the Error + prototype object and have an [[ErrorData]] internal slot whose value is + undefined. + + Error.prototype.stack is an accessor property with attributes + { [[Enumerable]]: false, [[Configurable]]: true }. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + Ctor.name + ': hasOwnProperty("stack") is false' + ); + + assert.sameValue( + Object.getOwnPropertyDescriptor(err, 'stack'), + undefined, + Ctor.name + ': getOwnPropertyDescriptor returns undefined' + ); + + // For NativeErrors, the immediate prototype is e.g. TypeError.prototype, + // which does NOT have its own "stack" property; the accessor lives only on + // Error.prototype, two links up. + if (Ctor !== Error) { + assert.sameValue( + Object.getOwnPropertyDescriptor(Object.getPrototypeOf(err), 'stack'), + undefined, + Ctor.name + ': stack is not an own property of NativeError.prototype' + ); + } + + var desc = Object.getOwnPropertyDescriptor(Error.prototype, 'stack'); + assert.notSameValue(desc, undefined, Ctor.name + ': Error.prototype has the accessor'); + assert.sameValue(typeof desc.get, 'function', Ctor.name + ': accessor get is a function'); + assert.sameValue(typeof desc.set, 'function', Ctor.name + ': accessor set is a function'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/instance-not-enumerable.js b/JSTests/test262/test/built-ins/Error/prototype/stack/instance-not-enumerable.js new file mode 100644 index 000000000000..bda43b428ace --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/instance-not-enumerable.js @@ -0,0 +1,75 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype-stack +description: > + "stack" is a non-enumerable accessor on Error.prototype, and Error instances + do not have an own "stack" property, so "stack" is not visible via + Object.keys, for-in, propertyIsEnumerable, or JSON.stringify. +info: | + Error.prototype.stack is an accessor property with attributes + { [[Enumerable]]: false, [[Configurable]]: true }. + + Properties of Error Instances + + Error instances are ordinary objects that inherit properties from the Error + prototype object and have an [[ErrorData]] internal slot whose value is + undefined. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + assert.sameValue( + Object.keys(err).indexOf('stack'), + -1, + Ctor.name + ': Object.keys does not include "stack"' + ); + + assert.sameValue( + Object.getOwnPropertyNames(err).indexOf('stack'), + -1, + Ctor.name + ': getOwnPropertyNames does not include "stack"' + ); + + var sawStack = false; + for (var key in err) { + if (key === 'stack') { + sawStack = true; + } + } + assert.sameValue(sawStack, false, Ctor.name + ': for-in does not yield "stack"'); + + assert.sameValue( + Object.prototype.propertyIsEnumerable.call(err, 'stack'), + false, + Ctor.name + ': propertyIsEnumerable returns false' + ); + + assert.sameValue( + Object.prototype.propertyIsEnumerable.call(Error.prototype, 'stack'), + false, + Ctor.name + ': Error.prototype.propertyIsEnumerable("stack") is false' + ); + + // JSON.stringify omits non-enumerable / non-own properties; a fresh Error + // instance has no enumerable own properties at all. + assert.sameValue( + JSON.stringify(err), + '{}', + Ctor.name + ': JSON.stringify output is empty object' + ); + + // Object.assign reads only enumerable own properties; the inherited + // accessor is not own, so "stack" is not copied. + var copy = Object.assign({}, err); + assert.sameValue( + Object.prototype.hasOwnProperty.call(copy, 'stack'), + false, + Ctor.name + ': Object.assign({}, err) does not copy "stack"' + ); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/prop-desc.js b/JSTests/test262/test/built-ins/Error/prototype/stack/prop-desc.js new file mode 100644 index 000000000000..1ff1753c4e63 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/prop-desc.js @@ -0,0 +1,31 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-error.prototype-stack +description: > + Property descriptor of Error.prototype.stack +info: | + Error.prototype.stack is an accessor property with attributes + { [[Enumerable]]: false, [[Configurable]]: true }. + + ECMAScript Standard Built-in Objects + + Functions that are specified as get or set accessor functions of built-in + properties have "get " or "set " prepended to the property name string. + + Unless otherwise specified, the length property of a built-in function object + has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. + + Unless otherwise specified, the name property of a built-in function object, + if it exists, has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. +features: [error-stack-accessor] +includes: [propertyHelper.js] +---*/ + +verifyPrimordialAccessorProperty(Error.prototype, 'stack', { + get: { name: 'get stack', length: 0 }, + set: { name: 'set stack', length: 1 }, +}, { label: 'Error.prototype.stack' }); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-creates-own-property.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-creates-own-property.js new file mode 100644 index 000000000000..16698efd9a77 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-creates-own-property.js @@ -0,0 +1,67 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the receiver does not have an own "stack" property, the setter creates + one as a writable, enumerable, configurable data property whose value is v. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + [...] +includes: [nativeErrors.js, propertyHelper.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var errors = []; +for (var i = 0; i < allErrorConstructors.length; ++i) { + var Ctor = allErrorConstructors[i]; + errors.push([Ctor.name, makeNativeError(Ctor, true)]); +} + +for (var i = 0; i < errors.length; ++i) { + var name = errors[i][0]; + var err = errors[i][1]; + + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + name + ': precondition: instance has no own "stack" property at construction' + ); + + var result = set.call(err, 'sentinel-' + name); + assert.sameValue(result, undefined, name + ': setter returns undefined'); + + verifyProperty(err, 'stack', { + value: 'sentinel-' + name, + writable: true, + enumerable: true, + configurable: true, + }); +} + +// The same applies to a plain object that lacks [[ErrorData]]: the setter +// does not check for the internal slot before installing the property. +var plain = {}; +set.call(plain, 'on-plain'); +verifyProperty(plain, 'stack', { + value: 'on-plain', + writable: true, + enumerable: true, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-cross-realm.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-cross-realm.js new file mode 100644 index 000000000000..d699a76ca9de --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-cross-realm.js @@ -0,0 +1,90 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The setter's home-object (SameValue) check is realm-scoped: a setter from + realm A locks against realm A's %Error.prototype% only. Cross-realm objects + are accepted as receivers (they pass the SameValue check), and an Error + instance from another realm gets an own "stack" data property installed. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 2. If SameValue(this, home) is true, then + a. Throw a TypeError exception. + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). +includes: [propertyHelper.js] +features: [error-stack-accessor, cross-realm] +---*/ + +var setA = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var realmB = $262.createRealm().global; + +assert.notSameValue( + Error.prototype, + realmB.Error.prototype, + 'precondition: the two realms have distinct Error.prototype objects' +); + +// (a) Realm A's setter on a realm B Error instance: passes SameValue (the +// instance is not realm A's Error.prototype), and the instance has no own +// "stack" property at construction, so CreateDataPropertyOrThrow installs one. +var errB = new realmB.Error('msg'); +assert.sameValue( + Object.prototype.hasOwnProperty.call(errB, 'stack'), + false, + 'precondition: cross-realm Error instance has no own "stack" property' +); + +setA.call(errB, 'sentinel'); + +verifyProperty(errB, 'stack', { + value: 'sentinel', + writable: true, + enumerable: true, + configurable: true, +}); + +// (b) Realm A's setter on a plain object from realm B: same path, installs an +// own data property. +var plainB = new realmB.Object(); +setA.call(plainB, 'plain'); + +verifyProperty(plainB, 'stack', { + value: 'plain', + writable: true, + enumerable: true, + configurable: true, +}); + +// (c) Realm A's setter is structurally distinct from realm B's setter. +var setB = Object.getOwnPropertyDescriptor(realmB.Error.prototype, 'stack').set; +assert.sameValue(typeof setB, 'function', 'realm B has its own setter'); +assert.notSameValue(setA, setB, 'the two realms have distinct setter functions'); + +// (d) Realm A's setter on realm B's Error.prototype passes realm A's +// SameValue check (the two prototypes are distinct objects), so step 2 of +// SetterThatIgnoresPrototypeProperties does not fire. Step 3 finds realm B's +// own "stack" accessor descriptor and proceeds to step 5: Set(O, p, v, true) +// invokes that accessor's setter, which is realm B's setter. Realm B's setter +// then throws via its own SameValue check (this === realm B's Error.prototype). +// The thrown TypeError is realm B's TypeError. +assert.throws(realmB.TypeError, function () { + setA.call(realmB.Error.prototype, 'should-throw'); +}, 'realm A setter on realm B Error.prototype throws (via realm B setter)'); + +// (e) Realm A's setter on realm A's own Error.prototype throws via step 2 +// (SameValue with realm A's home). +assert.throws(TypeError, function () { + setA.call(Error.prototype, 'should-throw'); +}, 'realm A setter on realm A Error.prototype throws via SameValue'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-delete-round-trip.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-delete-round-trip.js new file mode 100644 index 000000000000..1789de5313bf --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-delete-round-trip.js @@ -0,0 +1,65 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + After the setter installs an own "stack" data property, deleting it + re-exposes the inherited accessor on Error.prototype. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + // delete on a fresh instance: nothing to remove, returns true. + assert.sameValue(delete err.stack, true, Ctor.name + ': delete on fresh instance returns true'); + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + Ctor.name + ': still no own property after delete' + ); + + // The inherited accessor still produces a string. + assert.sameValue(typeof get.call(err), 'string', Ctor.name + ': accessor still works'); + + // After setting, an own data property is installed. + set.call(err, 'sentinel'); + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + true, + Ctor.name + ': own property installed after set' + ); + assert.sameValue(err.stack, 'sentinel', Ctor.name + ': data property shadows accessor'); + + // delete removes the own data property. + assert.sameValue(delete err.stack, true, Ctor.name + ': delete removes own data property'); + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + Ctor.name + ': own property removed' + ); + + // The inherited accessor is exposed again, and [[ErrorData]] still drives it. + assert.sameValue(typeof err.stack, 'string', Ctor.name + ': inherited accessor re-exposed'); + assert.sameValue(typeof get.call(err), 'string', Ctor.name + ': accessor still returns a string'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-empty-string.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-empty-string.js new file mode 100644 index 000000000000..3104b88bc80c --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-empty-string.js @@ -0,0 +1,37 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + An empty string is a String, so the setter accepts it. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. +includes: [propertyHelper.js, nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + set.call(err, ''); + + // Verify the round-trip via property access before invoking verifyProperty + // (which deletes the configurable own property as part of its check). + assert.sameValue(err.stack, '', Ctor.name + ': empty string round-trips through property access'); + + verifyProperty(err, 'stack', { + value: '', + writable: true, + enumerable: true, + configurable: true, + }); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-existing-own-property.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-existing-own-property.js new file mode 100644 index 000000000000..29cd22acbc08 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-existing-own-property.js @@ -0,0 +1,52 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the receiver already has an own "stack" data property, the setter + performs a [[Set]] on it (preserving its current attributes). +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + 5. Else, + a. Perform ? Set(this, p, v, true). + [...] +includes: [propertyHelper.js, nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + Object.defineProperty(err, 'stack', { + value: 'original', + writable: true, + enumerable: false, + configurable: false, + }); + + set.call(err, 'updated'); + + // The existing descriptor is preserved; only the value changes (per [[Set]]). + verifyProperty(err, 'stack', { + value: 'updated', + writable: true, + enumerable: false, + configurable: false, + }); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-no-argument.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-no-argument.js new file mode 100644 index 000000000000..5047662c7b6b --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-no-argument.js @@ -0,0 +1,28 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the setter is called with no argument, v is undefined, which is not a + String, so a TypeError is thrown. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + assert.throws(TypeError, function () { + set.call(err); + }, Ctor.name); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-error-receiver.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-error-receiver.js new file mode 100644 index 000000000000..221628ebd029 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-error-receiver.js @@ -0,0 +1,61 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The setter does not check for the [[ErrorData]] internal slot, so it works + on any extensible object that is not %Error.prototype%. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. +includes: [propertyHelper.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +// Plain object: installs an own data property. +var plain = {}; +set.call(plain, 'plain'); +verifyProperty(plain, 'stack', { + value: 'plain', + writable: true, + enumerable: true, + configurable: true, +}); + +// Array: installs an own data property. +var arr = []; +set.call(arr, 'array'); +verifyProperty(arr, 'stack', { + value: 'array', + writable: true, + enumerable: true, + configurable: true, +}); + +// Function: installs an own data property. +var fn = function () {}; +set.call(fn, 'function'); +verifyProperty(fn, 'stack', { + value: 'function', + writable: true, + enumerable: true, + configurable: true, +}); + +// Object whose prototype is Error.prototype but lacks [[ErrorData]]: still works. +var fakeError = Object.create(Error.prototype); +set.call(fakeError, 'fake'); +verifyProperty(fakeError, 'stack', { + value: 'fake', + writable: true, + enumerable: true, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-extensible-receiver.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-extensible-receiver.js new file mode 100644 index 000000000000..1b6741396f27 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-extensible-receiver.js @@ -0,0 +1,76 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the receiver lacks an own "stack" property and has any integrity level + applied (preventExtensions, seal, freeze), the setter throws a TypeError + because CreateDataPropertyOrThrow cannot add a property to a non-extensible + object. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + + CreateDataPropertyOrThrow ( O, P, V ) + + [...] + 3. Let success be ? CreateDataProperty(O, P, V). + 4. If success is false, throw a TypeError exception. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var integrityLevels = [ + { name: 'preventExtensions', fn: Object.preventExtensions }, + { name: 'seal', fn: Object.seal }, + { name: 'freeze', fn: Object.freeze } +]; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + + for (var j = 0; j < integrityLevels.length; ++j) { + var level = integrityLevels[j]; + var label = Ctor.name + '/' + level.name; + + var err = new Ctor('msg'); + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + label + ': precondition: instance has no own "stack" property at construction' + ); + + level.fn(err); + + assert.throws(TypeError, function () { + set.call(err, 'sentinel'); + }, label + ': instance without own "stack" rejects setter'); + + assert.sameValue( + Object.prototype.hasOwnProperty.call(err, 'stack'), + false, + label + ': no own "stack" property was created' + ); + } +} + +// Same behavior on plain objects at each integrity level. +for (var k = 0; k < integrityLevels.length; ++k) { + var lvl = integrityLevels[k]; + var obj = lvl.fn({}); + assert.throws(TypeError, function () { + set.call(obj, 'sentinel'); + }, lvl.name + ' plain object without own "stack"'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-string-value.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-string-value.js new file mode 100644 index 000000000000..96404f68c437 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-string-value.js @@ -0,0 +1,53 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + Throws a TypeError if the value being assigned is not a String. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +// An object with a toString method is not coerced; the algorithm requires v +// to already be a String. +var coercible = { + toString: function () { return 'coerced'; }, + valueOf: function () { return 'coerced'; }, +}; + +var badValues = [ + ['undefined', undefined], + ['null', null], + ['true', true], + ['false', false], + ['number', 1], + ['object', {}], + ['array', []], + ['object with toString', coercible], + ['String wrapper object', new String('boxed')], + typeof Symbol === 'undefined' ? null : ['symbol', Symbol('s')], + typeof BigInt === 'undefined' ? null : ['bigint', BigInt(0)] +]; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + for (var j = 0; j < badValues.length; ++j) { + if (!badValues[j]) continue; + var label = badValues[j][0]; + var value = badValues[j][1]; + assert.throws(TypeError, function () { + set.call(err, value); + }, Ctor.name + ': ' + label); + } +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-writable-stack.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-writable-stack.js new file mode 100644 index 000000000000..672b05a79f08 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-non-writable-stack.js @@ -0,0 +1,70 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the receiver has an own non-writable "stack" data property, the setter + throws a TypeError because the underlying [[Set]] is invoked with Throw=true. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + [...] + 5. Else, + a. Perform ? Set(this, p, v, true). +includes: [propertyHelper.js, nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + + var err = new Ctor('msg'); + Object.defineProperty(err, 'stack', { + value: 'original', + writable: false, + enumerable: false, + configurable: true, + }); + + assert.throws(TypeError, function () { + set.call(err, 'updated'); + }, Ctor.name + ': non-writable own "stack"'); + + verifyProperty(err, 'stack', { + value: 'original', + writable: false, + enumerable: false, + configurable: true, + }); + + // Frozen instance with an own "stack" data property: still throws. + var frozen = new Ctor('msg'); + Object.defineProperty(frozen, 'stack', { + value: 'frozen-original', + writable: false, + enumerable: false, + configurable: false, + }); + Object.preventExtensions(frozen); + + assert.throws(TypeError, function () { + set.call(frozen, 'updated'); + }, Ctor.name + ': frozen with non-writable own "stack"'); + + verifyProperty(frozen, 'stack', { + value: 'frozen-original', + writable: false, + enumerable: false, + configurable: false, + }); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-not-a-constructor.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-not-a-constructor.js new file mode 100644 index 000000000000..4229fb2390aa --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-not-a-constructor.js @@ -0,0 +1,28 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + set Error.prototype.stack does not implement [[Construct]], is not new-able +info: | + ECMAScript Function Objects + + Built-in function objects that are not identified as constructors do not + implement the [[Construct]] internal method unless otherwise specified in + the description of a particular function. +includes: [isConstructor.js] +features: [error-stack-accessor, Reflect.construct] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +assert.sameValue( + isConstructor(set), + false, + 'isConstructor(set Error.prototype.stack) must return false' +); + +assert.throws(TypeError, function () { + new set(''); +}); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-own-accessor.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-own-accessor.js new file mode 100644 index 000000000000..6a8ca2920add --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-own-accessor.js @@ -0,0 +1,56 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When the receiver has an own "stack" accessor property, the setter performs + [[Set]] which invokes the own setter (or throws if the accessor has no + setter). +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + [...] + 5. Else, + a. Perform ? Set(this, p, v, true). +includes: [nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + + // (a) Own accessor with a setter: the own setter receives v. + var observed; + var withSetter = new Ctor('msg'); + Object.defineProperty(withSetter, 'stack', { + get: function () { return observed; }, + set: function (v) { observed = v; }, + enumerable: false, + configurable: true, + }); + + set.call(withSetter, 'sentinel'); + assert.sameValue(observed, 'sentinel', Ctor.name + ': own setter received the value'); + + // (b) Own accessor with no setter: Set with Throw=true throws TypeError. + var withoutSetter = new Ctor('msg'); + Object.defineProperty(withoutSetter, 'stack', { + get: function () { return 'getter-only'; }, + enumerable: false, + configurable: true, + }); + + assert.throws(TypeError, function () { + set.call(withoutSetter, 'sentinel'); + }, Ctor.name + ': own accessor without a setter'); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-rejects.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-rejects.js new file mode 100644 index 000000000000..8b35620dc4f8 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-rejects.js @@ -0,0 +1,59 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + When a Proxy receiver's defineProperty trap returns false during the + CreateDataPropertyOrThrow path, or its set trap returns false during the + Set-with-Throw=true path, the setter throws TypeError. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + 5. Else, + a. Perform ? Set(this, p, v, true). + + CreateDataPropertyOrThrow ( O, P, V ) + + [...] + 3. Let success be ? CreateDataProperty(O, P, V). + 4. If success is false, throw a TypeError exception. + + Set ( O, P, V, Throw ) + + [...] + 3. Let success be ? O.[[Set]](P, V, O). + 4. If success is false and Throw is true, throw a TypeError exception. +features: [error-stack-accessor, Proxy] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +// (a) defineProperty trap returns false (no own stack: CreateDataPropertyOrThrow path). +var pA = new Proxy({}, { + defineProperty: function () { + return false; + }, +}); +assert.throws(TypeError, function () { + set.call(pA, 'v'); +}, 'defineProperty returns false'); + +// (b) set trap returns false (own stack present: Set with Throw=true path). +var pB = new Proxy({ stack: 'old' }, { + set: function () { + return false; + }, +}); +assert.throws(TypeError, function () { + set.call(pB, 'v'); +}, 'set trap returns false'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-throws.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-throws.js new file mode 100644 index 000000000000..89bafda51a09 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-trap-throws.js @@ -0,0 +1,58 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + Errors thrown by Proxy traps invoked during the setter propagate out via + the ? abstract operations in SetterThatIgnoresPrototypeProperties. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + 5. Else, + a. Perform ? Set(this, p, v, true). +features: [error-stack-accessor, Proxy] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +function Sentinel() {} + +// (a) getOwnPropertyDescriptor trap throws: error propagates from step 3. +var pA = new Proxy({}, { + getOwnPropertyDescriptor: function () { + throw new Sentinel(); + }, +}); +assert.throws(Sentinel, function () { + set.call(pA, 'v'); +}, 'getOwnPropertyDescriptor trap throw'); + +// (b) defineProperty trap throws (no own stack: CreateDataPropertyOrThrow path). +var pB = new Proxy({}, { + defineProperty: function () { + throw new Sentinel(); + }, +}); +assert.throws(Sentinel, function () { + set.call(pB, 'v'); +}, 'defineProperty trap throw'); + +// (c) set trap throws (own stack present: Set path). +var pC = new Proxy({ stack: 'old' }, { + set: function () { + throw new Sentinel(); + }, +}); +assert.throws(Sentinel, function () { + set.call(pC, 'v'); +}, 'set trap throw'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-wrapping-prototype.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-wrapping-prototype.js new file mode 100644 index 000000000000..061a0964e6a1 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-proxy-wrapping-prototype.js @@ -0,0 +1,66 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The home-object check uses SameValue on object identity. A Proxy wrapping + %Error.prototype% is not the same object as %Error.prototype% itself, so + step 2 of SetterThatIgnoresPrototypeProperties does not fire; the algorithm + proceeds to consult the proxy's [[GetOwnProperty]] / [[Set]] traps. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 2. If SameValue(this, home) is true, then + a. Throw a TypeError exception. + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + 5. Else, + a. Perform ? Set(this, p, v, true). +includes: [proxyTrapsHelper.js] +features: [error-stack-accessor, Proxy] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var trapLog = []; +var p = new Proxy(Error.prototype, allowProxyTraps({ + getOwnPropertyDescriptor: function (t, key) { + trapLog.push(['gOPD', key]); + return Object.getOwnPropertyDescriptor(t, key); + }, + set: function (t, key, value) { + trapLog.push(['set', key, value]); + // Don't actually mutate Error.prototype; just acknowledge. + return true; + } +})); + +// SameValue(p, Error.prototype) is false: a Proxy is a distinct object from +// its target. Step 2 does not throw; the algorithm proceeds to query the +// proxy's traps. +set.call(p, 'sentinel'); + +assert(trapLog.length >= 1, 'at least one trap was invoked'); +assert.sameValue(trapLog[0][0], 'gOPD', 'getOwnPropertyDescriptor trap fired first'); +assert.sameValue(trapLog[0][1], 'stack', 'getOwnPropertyDescriptor trap was called for "stack"'); + +// Error.prototype's own "stack" descriptor is an accessor, so step 5 of +// SetterThatIgnoresPrototypeProperties takes the Set path, which invokes the +// proxy's set trap. +var sawSet = false; +for (var i = 0; i < trapLog.length; ++i) { + if (trapLog[i][0] === 'set') { + sawSet = true; + assert.sameValue(trapLog[i][1], 'stack', 'set trap was called for "stack"'); + assert.sameValue(trapLog[i][2], 'sentinel', 'set trap received the value'); + } +} +assert.sameValue(sawSet, true, 'set trap was invoked'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-null-proto.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-null-proto.js new file mode 100644 index 000000000000..c34191be9018 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-null-proto.js @@ -0,0 +1,31 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The setter installs an own "stack" data property on a null-prototype object. + The setter does not depend on inherited machinery from Object.prototype. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. +includes: [propertyHelper.js] +features: [error-stack-accessor, __proto__] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var nullProto = { __proto__: null }; +set.call(nullProto, 'null-proto'); + +verifyProperty(nullProto, 'stack', { + value: 'null-proto', + writable: true, + enumerable: true, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-other-prototype.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-other-prototype.js new file mode 100644 index 000000000000..07551914f474 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-other-prototype.js @@ -0,0 +1,69 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The SameValue check in SetterThatIgnoresPrototypeProperties is locked to + %Error.prototype% only. Calling the setter with any other prototype object + (NativeError prototypes, AggregateError.prototype, SuppressedError.prototype) + as the receiver does NOT throw via the home-object check; it installs an own + data property on that prototype. +info: | + set Error.prototype.stack + + [...] + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 2. If SameValue(this, home) is true, then + a. NOTE: Throwing here emulates assignment to a non-writable data property + on the home object in strict mode code. + b. Throw a TypeError exception. + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). +includes: [nativeErrors.js, propertyHelper.js] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +var prototypes = []; +for (var i = 0; i < allErrorConstructors.length; ++i) { + var Ctor = allErrorConstructors[i]; + // Error.prototype is %Error.prototype% itself; that case is covered by setter-receiver-is-prototype.js. + if (Ctor === Error) continue; + prototypes.push([Ctor.name + '.prototype', Ctor.prototype]); +} + +for (var i = 0; i < prototypes.length; ++i) { + var label = prototypes[i][0]; + var proto = prototypes[i][1]; + + assert.sameValue( + Object.getOwnPropertyDescriptor(proto, 'stack'), + undefined, + label + ': precondition: no own "stack" property' + ); + + set.call(proto, 'sentinel-' + label); + + verifyProperty(proto, 'stack', { + value: 'sentinel-' + label, + writable: true, + enumerable: true, + configurable: true, + }); + + // verifyProperty above asserts configurable: true, which causes the helper + // to delete the property as part of its check; confirm the mutation didn't + // leak. + assert.sameValue( + Object.getOwnPropertyDescriptor(proto, 'stack'), + undefined, + label + ': cleanup' + ); +} diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-prototype.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-prototype.js new file mode 100644 index 000000000000..6dc1736edee5 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-prototype.js @@ -0,0 +1,48 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + Throws a TypeError if the receiver is %Error.prototype% itself. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. + + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + 1. If this is not an Object, throw a TypeError exception. + 2. If SameValue(this, home) is true, then + a. NOTE: Throwing here emulates assignment to a non-writable data property + on the home object in strict mode code. + b. Throw a TypeError exception. + [...] +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +assert.throws(TypeError, function () { + set.call(Error.prototype, ''); +}, 'set.call(Error.prototype, "")'); + +// Property assignment also throws. The setter throws unconditionally via +// SetterThatIgnoresPrototypeProperties; the throw originates inside the +// accessor function and propagates regardless of the caller's strict-mode +// flag. (test262 runs this file in both strict and sloppy modes by default.) +assert.throws(TypeError, function () { + Error.prototype.stack = ''; +}, 'assignment to Error.prototype.stack'); + +// The accessor descriptor on Error.prototype is unchanged. +var desc = Object.getOwnPropertyDescriptor(Error.prototype, 'stack'); +assert.notSameValue(desc, undefined, 'Error.prototype still has its own "stack" property'); +assert.sameValue(typeof desc.get, 'function', 'getter is still installed'); +assert.sameValue(typeof desc.set, 'function', 'setter is still installed'); +assert.sameValue(desc.value, undefined, 'descriptor has no value (still an accessor)'); +assert.sameValue(desc.writable, undefined, 'descriptor has no writable (still an accessor)'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-proxy.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-proxy.js new file mode 100644 index 000000000000..e9482fd51764 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-receiver-is-proxy.js @@ -0,0 +1,94 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + The setter calls [[GetOwnProperty]] and either [[DefineOwnProperty]] (via + CreateDataPropertyOrThrow) or [[Set]] on the receiver, observably invoking + Proxy traps. +info: | + SetterThatIgnoresPrototypeProperties ( this, home, p, v ) + + [...] + 3. Let desc be ? this.[[GetOwnProperty]](p). + 4. If desc is undefined, then + a. Perform ? CreateDataPropertyOrThrow(this, p, v). + 5. Else, + a. Perform ? Set(this, p, v, true). +includes: [proxyTrapsHelper.js] +features: [error-stack-accessor, Proxy, Reflect] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +// (a) Proxy with no own "stack": getOwnPropertyDescriptor then defineProperty. +// allowProxyTraps throws Test262Error for any other trap (including [[Set]]). +var trapLog = []; +var target1 = {}; +var p1 = new Proxy(target1, allowProxyTraps({ + getOwnPropertyDescriptor: function (t, key) { + trapLog.push(['gOPD', key]); + return Object.getOwnPropertyDescriptor(t, key); + }, + defineProperty: function (t, key, desc) { + trapLog.push(['define', key, desc]); + return Reflect.defineProperty(t, key, desc); + } +}, '(a)')); + +set.call(p1, 'sentinel'); +assert(trapLog.length >= 2, 'at least getOwnPropertyDescriptor and defineProperty were called'); +assert.sameValue(trapLog[0][0], 'gOPD', 'first trap is getOwnPropertyDescriptor'); +assert.sameValue(trapLog[0][1], 'stack', 'getOwnPropertyDescriptor was called for "stack"'); + +var lastDefine = null; +for (var i = 0; i < trapLog.length; ++i) { + if (trapLog[i][0] === 'define') { + lastDefine = trapLog[i]; + } +} +assert.notSameValue(lastDefine, null, 'defineProperty trap was invoked'); +assert.sameValue(lastDefine[1], 'stack', 'defineProperty was called for "stack"'); + +// CreateDataProperty constructs the descriptor record +// { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }; +// FromPropertyDescriptor converts that into a plain Object with exactly those +// four own properties before invoking the defineProperty trap. +var passedDesc = lastDefine[2]; +assert.sameValue(passedDesc.value, 'sentinel', 'descriptor.value'); +assert.sameValue(passedDesc.writable, true, 'descriptor.writable'); +assert.sameValue(passedDesc.enumerable, true, 'descriptor.enumerable'); +assert.sameValue(passedDesc.configurable, true, 'descriptor.configurable'); +assert.sameValue('get' in passedDesc, false, 'descriptor has no get key'); +assert.sameValue('set' in passedDesc, false, 'descriptor has no set key'); +assert.sameValue(target1.stack, 'sentinel', 'value reached the underlying target'); + +// (b) Proxy with own "stack": getOwnPropertyDescriptor then set trap. +// allowProxyTraps throws Test262Error for any other trap (including +// [[DefineOwnProperty]]). +var trapLog2 = []; +var target2 = { stack: 'old' }; +var p2 = new Proxy(target2, allowProxyTraps({ + getOwnPropertyDescriptor: function (t, key) { + trapLog2.push(['gOPD', key]); + return Object.getOwnPropertyDescriptor(t, key); + }, + set: function (t, key, value) { + trapLog2.push(['set', key, value]); + t[key] = value; + return true; + } +}, '(b)')); + +set.call(p2, 'updated'); +var sawSet = false; +for (var j = 0; j < trapLog2.length; ++j) { + if (trapLog2[j][0] === 'set') { + sawSet = true; + assert.sameValue(trapLog2[j][1], 'stack', 'set was called for "stack"'); + assert.sameValue(trapLog2[j][2], 'updated', 'set received the value'); + } +} +assert.sameValue(sawSet, true, 'set trap was invoked'); +assert.sameValue(target2.stack, 'updated', 'value reached the underlying target'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-this-not-object.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-this-not-object.js new file mode 100644 index 000000000000..ae86cc280cfe --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-this-not-object.js @@ -0,0 +1,49 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + Throws a TypeError if the this value is not an Object. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. +features: [error-stack-accessor] +---*/ + +var set = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').set; + +assert.sameValue(typeof set, 'function'); + +var badReceivers = [ + ['undefined', undefined], + ['null', null], + ['true', true], + ['false', false], + ['number', 1], + ['string', 's'], + typeof Symbol === 'undefined' ? null : ['symbol', Symbol('s')], + typeof BigInt === 'undefined' ? null : ['bigint', BigInt(0)] +]; + +for (var i = 0; i < badReceivers.length; ++i) { + if (!badReceivers[i]) continue; + var label = badReceivers[i][0]; + var value = badReceivers[i][1]; + assert.throws(TypeError, function () { + set.call(value, ''); + }, label); +} + +// A non-Object this combined with a non-String v throws TypeError. The spec +// runs step 2 (this not Object) before step 3 (v not String), but both steps +// throw TypeError, so the failure is observably the same either way. +assert.throws(TypeError, function () { + set.call(undefined, 0); +}, 'undefined this with non-String v'); + +assert.throws(TypeError, function () { + set.call(null, {}); +}, 'null this with non-String v'); diff --git a/JSTests/test262/test/built-ins/Error/prototype/stack/setter-via-assignment.js b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-via-assignment.js new file mode 100644 index 000000000000..20de6e8a54d5 --- /dev/null +++ b/JSTests/test262/test/built-ins/Error/prototype/stack/setter-via-assignment.js @@ -0,0 +1,69 @@ +// Copyright (C) 2026 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-set-error.prototype.stack +description: > + Property assignment (e.g. err.stack = v) goes through the inherited setter. +info: | + set Error.prototype.stack + + 1. Let E be the this value. + 2. If E is not an Object, throw a TypeError exception. + 3. If v is not a String, throw a TypeError exception. + 4. Perform ? SetterThatIgnoresPrototypeProperties(this value, %Error.prototype%, "stack", v). + 5. Return undefined. +includes: [propertyHelper.js, nativeErrors.js] +features: [error-stack-accessor] +---*/ + +var get = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get; + +// Plain object inheriting the accessor: assignment installs an own data property. +var plain = Object.create(Error.prototype); +plain.stack = 'sentinel'; + +verifyProperty(plain, 'stack', { + value: 'sentinel', + writable: true, + enumerable: true, + configurable: true, +}); + +for (var i = 0; i < nativeErrors.length; ++i) { + var Ctor = nativeErrors[i]; + var err = new Ctor('msg'); + + // Assigning a non-string still throws TypeError (step 3 of the setter). + // The `err.stack = null` form covered the "release memory" pattern in V8/JSC + // before this proposal; it now throws. + assert.throws(TypeError, function () { + err.stack = null; + }, Ctor.name + ': null assignment'); + + assert.throws(TypeError, function () { + err.stack = 0; + }, Ctor.name + ': numeric assignment'); + + assert.throws(TypeError, function () { + err.stack = undefined; + }, Ctor.name + ': undefined assignment'); + + // The failed setter does not affect the [[ErrorData]] slot: the inherited + // accessor still produces a string (Issue 13: a failed setter must not + // clobber the slot). + assert.sameValue(typeof get.call(err), 'string', Ctor.name + ': [[ErrorData]] preserved across failed setters'); + + // Assigning a string installs/updates the own data property. + err.stack = 'updated'; + assert.sameValue(err.stack, 'updated', Ctor.name + ': string assignment is observable'); +} + +// Assigning to %Error.prototype%.stack always throws, because the setter +// function itself throws via SetterThatIgnoresPrototypeProperties; the throw +// originates inside the accessor function and propagates regardless of the +// caller's strict-mode flag. (test262 runs this file in both strict and +// sloppy modes by default, so the bare assignment exercises both.) +assert.throws(TypeError, function () { + Error.prototype.stack = 'top-level'; +}); diff --git a/JSTests/test262/test/built-ins/Iterator/zip/iterator-zip-iteration-strict-checks-remaining-done.js b/JSTests/test262/test/built-ins/Iterator/zip/iterator-zip-iteration-strict-checks-remaining-done.js new file mode 100644 index 000000000000..dbd8ee5097ec --- /dev/null +++ b/JSTests/test262/test/built-ins/Iterator/zip/iterator-zip-iteration-strict-checks-remaining-done.js @@ -0,0 +1,69 @@ +// Copyright (C) 2026 Test262 Contributors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-iterator.zip +description: > + With mode "strict", when all iterators finish at the same step, the result + iterator completes normally and .next() is called on all of them. +info: | + IteratorZip ( iters, mode, padding, finishResults ) + 3. Let closure be a new Abstract Closure with no parameters that captures + iters, iterCount, openIters, mode, padding, and finishResults, and + performs the following steps when called: + ... + b. Repeat, + ... + iii. For each integer i such that 0 ≤ i < iterCount, in ascending order, do + ... + 1. Let iter be iters[i]. + 2. If iter is null, then + a. Assert: mode is "longest". + ... + 3. Else, + a. Let result be Completion(IteratorStepValue(iter)). + ... + d. If result is done, then + ... + iii. Else if mode is "strict", then + i. If i ≠ 0, then + ... + ii. For each integer k such that 1 ≤ k < iterCount, in ascending order, do + i. Let open be Completion(IteratorStep(iters[k])). + ... + iii. Return ReturnCompletion(undefined). +includes: [compareArray.js] +features: [joint-iteration] +---*/ + +var log = []; + +function makeIter(name, length) { + var count = 0; + return { + next() { + count++; + log.push("call " + name + " next"); + return { done: count > length }; + }, + return() { + log.push("unexpected call " + name + " return"); + } + }; +} + +var it = Iterator.zip([makeIter("a", 2), makeIter("b", 2), makeIter("c", 2)], { mode: "strict" }); + +it.next(); +it.next(); + +log.length = 0; + +var result = it.next(); +assert.sameValue(result.done, true); + +assert.compareArray(log, [ + "call a next", + "call b next", + "call c next", +]); diff --git a/JSTests/test262/test/built-ins/Iterator/zip/result-arrays-are-fresh.js b/JSTests/test262/test/built-ins/Iterator/zip/result-arrays-are-fresh.js new file mode 100644 index 000000000000..c6a81bda808b --- /dev/null +++ b/JSTests/test262/test/built-ins/Iterator/zip/result-arrays-are-fresh.js @@ -0,0 +1,48 @@ +// Copyright (C) 2026 Test262 Contributors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-iterator.zip +description: > + Each call to next() returns a fresh array, not the same object reused. +info: | + IteratorZip ( iters, mode, padding, finishResults ) + ... + 3. Let closure be a new Abstract Closure with no parameters that captures + iters, iterCount, openIters, mode, padding, and finishResults, and + performs the following steps when called: + ... + b. Repeat, + ... + iv. Let results be finishResults(results). + v. Let completion be Completion(Yield(results)). + ... + + Iterator.zip ( iterables [ , options ] ) + ... + 15. Let finishResults be a new Abstract Closure with parameters (results) + that captures nothing and performs the following steps when called: + a. Return CreateArrayFromList(results). + ... +includes: [compareArray.js] +features: [joint-iteration] +---*/ + +var it = Iterator.zip([[1, 2, 3], [4, 5, 6]]); + +var first = it.next(); +assert.sameValue(first.done, false); + +var second = it.next(); +assert.sameValue(second.done, false); + +var third = it.next(); +assert.sameValue(third.done, false); + +assert.notSameValue(first.value, second.value); +assert.notSameValue(second.value, third.value); +assert.notSameValue(first.value, third.value); + +assert.compareArray(first.value, [1, 4]); +assert.compareArray(second.value, [2, 5]); +assert.compareArray(third.value, [3, 6]); diff --git a/JSTests/test262/test/built-ins/Iterator/zipKeyed/iterator-zip-iteration-strict-checks-remaining-done.js b/JSTests/test262/test/built-ins/Iterator/zipKeyed/iterator-zip-iteration-strict-checks-remaining-done.js new file mode 100644 index 000000000000..36fc38d8bc28 --- /dev/null +++ b/JSTests/test262/test/built-ins/Iterator/zipKeyed/iterator-zip-iteration-strict-checks-remaining-done.js @@ -0,0 +1,73 @@ +// Copyright (C) 2026 Test262 Contributors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-iterator.zipkeyed +description: > + With mode "strict", when all iterators finish at the same step, the result + iterator completes normally and .next() is called on all of them. +info: | + IteratorZip ( iters, mode, padding, finishResults ) + 3. Let closure be a new Abstract Closure with no parameters that captures + iters, iterCount, openIters, mode, padding, and finishResults, and + performs the following steps when called: + ... + b. Repeat, + ... + iii. For each integer i such that 0 ≤ i < iterCount, in ascending order, do + ... + 1. Let iter be iters[i]. + 2. If iter is null, then + a. Assert: mode is "longest". + ... + 3. Else, + a. Let result be Completion(IteratorStepValue(iter)). + ... + d. If result is done, then + ... + iii. Else if mode is "strict", then + i. If i ≠ 0, then + ... + ii. For each integer k such that 1 ≤ k < iterCount, in ascending order, do + i. Let open be Completion(IteratorStep(iters[k])). + ... + iii. Return ReturnCompletion(undefined). +includes: [compareArray.js] +features: [joint-iteration] +---*/ + +var log = []; + +function makeIter(name, length) { + var count = 0; + return { + next() { + count++; + log.push("call " + name + " next"); + return { done: count > length }; + }, + return() { + log.push("unexpected call " + name + " return"); + } + }; +} + +var it = Iterator.zipKeyed({ + a: makeIter("a", 2), + b: makeIter("b", 2), + c: makeIter("c", 2), +}, { mode: "strict" }); + +it.next(); +it.next(); + +log.length = 0; + +var result = it.next(); +assert.sameValue(result.done, true); + +assert.compareArray(log, [ + "call a next", + "call b next", + "call c next", +]); diff --git a/JSTests/test262/test/built-ins/Iterator/zipKeyed/result-objects-are-fresh.js b/JSTests/test262/test/built-ins/Iterator/zipKeyed/result-objects-are-fresh.js new file mode 100644 index 000000000000..da586ea48cb4 --- /dev/null +++ b/JSTests/test262/test/built-ins/Iterator/zipKeyed/result-objects-are-fresh.js @@ -0,0 +1,53 @@ +// Copyright (C) 2026 Test262 Contributors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-iterator.zipkeyed +description: > + Each call to next() returns a fresh result object, not the same object reused. +info: | + IteratorZip ( iters, mode, padding, finishResults ) + ... + 3. Let closure be a new Abstract Closure with no parameters that captures + iters, iterCount, openIters, mode, padding, and finishResults, and + performs the following steps when called: + ... + b. Repeat, + ... + iv. Let results be finishResults(results). + v. Let completion be Completion(Yield(results)). + ... + + Iterator.zipKeyed ( iterables [ , options ] ) + ... + 15. Let finishResults be a new Abstract Closure with parameters (results) that captures keys + and iterCount and performs the following steps when called: + a. Let obj be OrdinaryObjectCreate(null). + b. For each integer i such that 0 ≤ i < iterCount, in ascending order, do + i. Perform ! CreateDataPropertyOrThrow(obj, keys[i], results[i]). + c. Return obj. + ... +features: [joint-iteration] +---*/ + +var it = Iterator.zipKeyed({ a: [1, 2, 3], b: [4, 5, 6] }); + +var first = it.next(); +assert.sameValue(first.done, false); + +var second = it.next(); +assert.sameValue(second.done, false); + +var third = it.next(); +assert.sameValue(third.done, false); + +assert.notSameValue(first.value, second.value); +assert.notSameValue(second.value, third.value); +assert.notSameValue(first.value, third.value); + +assert.sameValue(first.value.a, 1); +assert.sameValue(first.value.b, 4); +assert.sameValue(second.value.a, 2); +assert.sameValue(second.value.b, 5); +assert.sameValue(third.value.a, 3); +assert.sameValue(third.value.b, 6); diff --git a/JSTests/test262/test/built-ins/NativeErrors/cause_property_native_error.js b/JSTests/test262/test/built-ins/NativeErrors/cause_property_native_error.js index e27e21a75c22..69c9c9884ef9 100644 --- a/JSTests/test262/test/built-ins/NativeErrors/cause_property_native_error.js +++ b/JSTests/test262/test/built-ins/NativeErrors/cause_property_native_error.js @@ -19,13 +19,9 @@ info: | esid: sec-nativeerror features: [error-cause] -includes: [propertyHelper.js] +includes: [propertyHelper.js, nativeErrors.js] ---*/ -var nativeErrors = [ - EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError -]; - for (var i = 0; i < nativeErrors.length; ++i) { var nativeError = nativeErrors[i]; diff --git a/JSTests/test262/test/built-ins/NativeErrors/message_property_native_error.js b/JSTests/test262/test/built-ins/NativeErrors/message_property_native_error.js index 38c2638b40fc..cbf4ed712522 100644 --- a/JSTests/test262/test/built-ins/NativeErrors/message_property_native_error.js +++ b/JSTests/test262/test/built-ins/NativeErrors/message_property_native_error.js @@ -12,13 +12,9 @@ info: | c. Let msgDesc be the PropertyDescriptor{[[Value]]: msg, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}. d. Let status be DefinePropertyOrThrow(O, "message", msgDesc). es6id: 19.5.6.1.1 -includes: [propertyHelper.js] +includes: [propertyHelper.js, nativeErrors.js] ---*/ -var nativeErrors = [ - EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError -]; - for (var i = 0; i < nativeErrors.length; ++i) { var nativeError = nativeErrors[i]; diff --git a/JSTests/test262/test/built-ins/Object/isExtensible/15.2.3.13-0-3.js b/JSTests/test262/test/built-ins/Object/isExtensible/15.2.3.13-0-3.js index 7e0549a7cf1a..70616cdf2a3c 100644 --- a/JSTests/test262/test/built-ins/Object/isExtensible/15.2.3.13-0-3.js +++ b/JSTests/test262/test/built-ins/Object/isExtensible/15.2.3.13-0-3.js @@ -3,7 +3,7 @@ /*--- info: | - A newly created object using the Object contructor has its [[Extensible]] + A newly created object using the Object constructor has its [[Extensible]] property set to true by default (15.2.2.1, step 8). es5id: 15.2.3.13-0-3 description: > diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-plaindate.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-plaindate.js new file mode 100644 index 000000000000..0a3adc763daa --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-plaindate.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.round +description: > + Rounding does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const relativeTo = new Temporal.PlainDate(2012, 1, 1); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, 31).round( + { smallestUnit: "weeks", largestUnit: "months", roundingMode, relativeTo }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P31D weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(1).round( + { smallestUnit: "months", largestUnit: "years", roundingMode, relativeTo }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, -31).round( + { smallestUnit: "weeks", largestUnit: "months", roundingMode, relativeTo }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P31D weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(-1).round( + { smallestUnit: "months", largestUnit: "years", roundingMode, relativeTo }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-zoned.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-zoned.js new file mode 100644 index 000000000000..6618591ee185 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/exact-multiple-of-larger-unit-zoned.js @@ -0,0 +1,77 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.round +description: > + Rounding does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const relativeTo = Temporal.ZonedDateTime.from("2012-01-01T12:00:00+00:00[UTC]"); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, 7).round( + { smallestUnit: "days", largestUnit: "weeks", roundingMode, relativeTo }), + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + `P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, 31).round( + { smallestUnit: "days", largestUnit: "months", roundingMode, relativeTo }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P31D days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(1).round( + { smallestUnit: "days", largestUnit: "years", roundingMode, relativeTo }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, 31).round( + { smallestUnit: "weeks", largestUnit: "months", roundingMode, relativeTo }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P31D weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(1).round( + { smallestUnit: "months", largestUnit: "years", roundingMode, relativeTo }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, -7).round( + { smallestUnit: "days", largestUnit: "weeks", roundingMode, relativeTo }), + 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, + `-P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, -31).round( + { smallestUnit: "days", largestUnit: "months", roundingMode, relativeTo }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P31D days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(-1).round( + { smallestUnit: "days", largestUnit: "years", roundingMode, relativeTo }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(0, 0, 0, -31).round( + { smallestUnit: "weeks", largestUnit: "months", roundingMode, relativeTo }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P31D weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.Duration(-1).round( + { smallestUnit: "months", largestUnit: "years", roundingMode, relativeTo }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-plaindate-large-time-component-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-plaindate-large-time-component-out-of-range.js new file mode 100644 index 000000000000..8c73d1d67b4e --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-plaindate-large-time-component-out-of-range.js @@ -0,0 +1,22 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.round +description: > + Duration with an overly large time component rounded to a calendar unit + relative to a PlainDate +info: | + 28.d. Let _dateDuration_ be ? AdjustDateDurationRecord( + _internalDuration_.[[Date]], _targetTime_.[[Days]]). +features: [Temporal] +---*/ + +const relativeTo = new Temporal.PlainDate(2020, 1, 1); + +[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER].forEach((seconds) => { + const d = new Temporal.Duration(0, 0, 0, 0, 0, 0, seconds); + assert.throws(RangeError, () => d.round({ smallestUnit: "year", relativeTo })); + assert.throws(RangeError, () => d.round({ smallestUnit: "month", relativeTo })); + assert.throws(RangeError, () => d.round({ smallestUnit: "week", relativeTo })); +}); diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-rounding-near-minimum-date.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-rounding-near-minimum-date.js new file mode 100644 index 000000000000..faf0baa75d92 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-rounding-near-minimum-date.js @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.round +description: > + Rounding with largestUnit "year" with relativeTo near the earlier date limit + correctly rounds the day even though year boundaries fall outside the valid + range +info: Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=2036259 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const relativeTo = new Temporal.PlainDate(-271821, 5, 19); +const duration = new Temporal.Duration(0, 0, 0, 0, -23); + +const result = duration.round({ + largestUnit: "year", + smallestUnit: "day", + roundingMode: "expand", + relativeTo, +}); + +TemporalHelpers.assertDuration(result, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, + "-23 hours rounds to -1 day near minimum date"); diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-large-time-component-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-large-time-component-out-of-range.js new file mode 100644 index 000000000000..52fee7c3456f --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-large-time-component-out-of-range.js @@ -0,0 +1,22 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.round +description: > + Duration with an overly large time component rounded to a calendar unit + relative to a ZonedDateTime +info: | + 27.e. Let _targetEpochNs_ be ? AddZonedDateTime(_relativeEpochNs_, _timeZone_, + _calendar_, _internalDuration_, ~constrain~). +features: [Temporal] +---*/ + +const relativeTo = new Temporal.ZonedDateTime(0n, "UTC"); + +[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER].forEach((seconds) => { + const d = new Temporal.Duration(0, 0, 0, 0, 0, 0, seconds); + assert.throws(RangeError, () => d.round({ smallestUnit: "year", relativeTo })); + assert.throws(RangeError, () => d.round({ smallestUnit: "month", relativeTo })); + assert.throws(RangeError, () => d.round({ smallestUnit: "week", relativeTo })); +}); diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-plaindate-large-time-component-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-plaindate-large-time-component-out-of-range.js new file mode 100644 index 000000000000..220eec68218f --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-plaindate-large-time-component-out-of-range.js @@ -0,0 +1,22 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.total +description: > + Duration with an overly large time component total of a calendar unit relative + to a PlainDate +info: | + 13.d. Let _dateDuration_ be ? AdjustDateDurationRecord( + _internalDuration_.[[Date]], _targetTime_.[[Days]]). +features: [Temporal] +---*/ + +const relativeTo = new Temporal.PlainDate(2020, 1, 1); + +[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER].forEach((seconds) => { + const d = new Temporal.Duration(0, 0, 0, 0, 0, 0, seconds); + assert.throws(RangeError, () => d.total({ unit: "year", relativeTo })); + assert.throws(RangeError, () => d.total({ unit: "month", relativeTo })); + assert.throws(RangeError, () => d.total({ unit: "week", relativeTo })); +}); diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-large-time-component-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-large-time-component-out-of-range.js new file mode 100644 index 000000000000..0457eaf86b88 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-large-time-component-out-of-range.js @@ -0,0 +1,22 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.duration.prototype.total +description: > + Duration with an overly large time component total of a calendar unit relative + to a ZonedDateTime +info: | + 12.e. Let _targetEpochNs_ be ? AddZonedDateTime(_relativeEpochNs_, _timeZone_, + _calendar_, _internalDuration_, ~constrain~). +features: [Temporal] +---*/ + +const relativeTo = new Temporal.ZonedDateTime(0n, "UTC"); + +[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER].forEach((seconds) => { + const d = new Temporal.Duration(0, 0, 0, 0, 0, 0, seconds); + assert.throws(RangeError, () => d.total({ unit: "year", relativeTo })); + assert.throws(RangeError, () => d.total({ unit: "month", relativeTo })); + assert.throws(RangeError, () => d.total({ unit: "week", relativeTo })); +}); diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..b2e89336e195 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/exact-multiple-of-larger-unit.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.since +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainDate(2012, 1, 1); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + new Temporal.PlainDate(2012, 2, 1).since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.PlainDate(2013, 1, 1).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + new Temporal.PlainDate(2011, 12, 1).since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.PlainDate(2011, 1, 1).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/rounding-near-minimum-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/rounding-near-minimum-date.js new file mode 100644 index 000000000000..276cf600ca54 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/rounding-near-minimum-date.js @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.since +description: > + Rounding with largestUnit "year" near the earlier date limit correctly rounds + the day increment even though year boundaries fall outside the valid range +info: Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=2036259 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const d1 = new Temporal.PlainDate(-271821, 5, 19); +const d2 = new Temporal.PlainDate(-271821, 5, 18); + +const result = d1.since(d2, { + largestUnit: "year", + smallestUnit: "day", + roundingIncrement: 2, + roundingMode: "expand", +}); + +TemporalHelpers.assertDuration(result, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + "expand rounding of 1 day to increment 2 near minimum date gives 2 days"); diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..6aea0315be7e --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/exact-multiple-of-larger-unit.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.until +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainDate(2012, 1, 1); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDate(2012, 2, 1), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDate(2013, 1, 1), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDate(2011, 12, 1), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDate(2011, 1, 1), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/rounding-near-minimum-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/rounding-near-minimum-date.js new file mode 100644 index 000000000000..b91ca0acd255 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/rounding-near-minimum-date.js @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.until +description: > + Rounding with largestUnit "year" near the earlier date limit correctly rounds + the day increment even though year boundaries fall outside the valid range +info: Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=2036259 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const d1 = new Temporal.PlainDate(-271821, 5, 19); +const d2 = new Temporal.PlainDate(-271821, 5, 18); + +const result = d1.until(d2, { + largestUnit: "year", + smallestUnit: "day", + roundingIncrement: 2, + roundingMode: "expand", +}); + +TemporalHelpers.assertDuration(result, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, + "expand rounding of -1 day to increment 2 near minimum date gives -2 days"); diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..765a35180540 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/exact-multiple-of-larger-unit.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.since +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainDateTime(2012, 1, 1, 12); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + new Temporal.PlainDateTime(2012, 2, 1, 12).since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.PlainDateTime(2013, 1, 1, 12).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + new Temporal.PlainDateTime(2011, 12, 1, 12).since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + new Temporal.PlainDateTime(2011, 1, 1, 12).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/rounding-near-minimum-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/rounding-near-minimum-date.js new file mode 100644 index 000000000000..2d933ab399f5 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/rounding-near-minimum-date.js @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.since +description: > + Rounding with largestUnit "year" near the earlier date limit correctly rounds + the day increment even though year boundaries fall outside the valid range +info: Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=2036259 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const dt1 = new Temporal.PlainDateTime(-271821, 5, 19, 0, 0, 0); +const dt2 = new Temporal.PlainDateTime(-271821, 5, 18, 0, 0, 0); + +const result = dt1.since(dt2, { + largestUnit: "year", + smallestUnit: "day", + roundingIncrement: 2, + roundingMode: "expand", +}); + +TemporalHelpers.assertDuration(result, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + "expand rounding of 1 day to increment 2 near minimum date gives 2 days"); diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..f36fba39fc66 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/exact-multiple-of-larger-unit.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.until +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainDateTime(2012, 1, 1, 12); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDateTime(2012, 2, 1, 12), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDateTime(2013, 1, 1, 12), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDateTime(2011, 12, 1, 12), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainDateTime(2011, 1, 1, 12), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/rounding-near-minimum-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/rounding-near-minimum-date.js new file mode 100644 index 000000000000..85b85b55a325 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/rounding-near-minimum-date.js @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.until +description: > + Rounding with largestUnit "year" near the earlier date limit correctly rounds + the day increment even though year boundaries fall outside the valid range +info: Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=2036259 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const dt1 = new Temporal.PlainDateTime(-271821, 5, 19, 0, 0, 0); +const dt2 = new Temporal.PlainDateTime(-271821, 5, 18, 0, 0, 0); + +const result = dt1.until(dt2, { + largestUnit: "year", + smallestUnit: "day", + roundingIncrement: 2, + roundingMode: "expand", +}); + +TemporalHelpers.assertDuration(result, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, + "expand rounding of -1 day to increment 2 near minimum date gives -2 days"); diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..d181c4c1dda0 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/exact-multiple-of-larger-unit.js @@ -0,0 +1,29 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.prototype.since +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainYearMonth(2012, 1); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + new Temporal.PlainYearMonth(2013, 1).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode, roundingIncrement: 2 }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + new Temporal.PlainYearMonth(2011, 1).since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode, roundingIncrement: 2 }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..9bdd5b6767c1 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/exact-multiple-of-larger-unit.js @@ -0,0 +1,29 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.prototype.until +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = new Temporal.PlainYearMonth(2012, 1); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainYearMonth(2013, 1), + { smallestUnit: "months", largestUnit: "years", roundingMode, roundingIncrement: 2 }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + start.until(new Temporal.PlainYearMonth(2011, 1), + { smallestUnit: "months", largestUnit: "years", roundingMode, roundingIncrement: 2 }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..3a466c2379ec --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/exact-multiple-of-larger-unit.js @@ -0,0 +1,77 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.prototype.since +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = Temporal.ZonedDateTime.from("2012-01-01T12:00:00+00:00[UTC]"); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2012-01-08T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "weeks", roundingMode }), + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + `P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2012-02-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2013-01-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2012-02-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2013-01-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2011-12-25T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "weeks", roundingMode }), + 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, + `-P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2011-12-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2011-01-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "days", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2011-12-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + Temporal.ZonedDateTime.from("2011-01-01T12:00:00+00:00[UTC]").since(start, + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/exact-multiple-of-larger-unit.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/exact-multiple-of-larger-unit.js new file mode 100644 index 000000000000..2a9d8fcb8070 --- /dev/null +++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/exact-multiple-of-larger-unit.js @@ -0,0 +1,77 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.prototype.until +description: > + Rounding up does not add a spurious extra smallestUnit when the difference has + zero of the smallestUnit +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const start = Temporal.ZonedDateTime.from("2012-01-01T12:00:00+00:00[UTC]"); + +for (const roundingMode of ["ceil", "floor", "expand", "halfCeil", "halfFloor", "halfEven", "halfExpand", "halfTrunc", "trunc"]) { + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2012-01-08T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "weeks", roundingMode }), + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + `P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2012-02-01T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2013-01-01T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2012-02-01T12:00:00+00:00[UTC]"), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + `P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2013-01-01T12:00:00+00:00[UTC]"), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `P1Y months..years ${roundingMode}` + ); + + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2011-12-25T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "weeks", roundingMode }), + 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, + `-P7D days..weeks ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2011-12-01T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M days..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2011-01-01T12:00:00+00:00[UTC]"), + { smallestUnit: "days", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y days..years ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2011-12-01T12:00:00+00:00[UTC]"), + { smallestUnit: "weeks", largestUnit: "months", roundingMode }), + 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1M weeks..months ${roundingMode}` + ); + TemporalHelpers.assertDuration( + start.until(Temporal.ZonedDateTime.from("2011-01-01T12:00:00+00:00[UTC]"), + { smallestUnit: "months", largestUnit: "years", roundingMode }), + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + `-P1Y months..years ${roundingMode}` + ); +} diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/detached-buffer.js index e08e84c6c07b..c31b2ec88207 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, Symbol.toStringTag, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample[Symbol.toStringTag], TA.name); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/return-typedarrayname.js b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/return-typedarrayname.js index 1cd8e47c9026..13c80d44aa79 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/return-typedarrayname.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/BigInt/return-typedarrayname.js @@ -15,7 +15,7 @@ includes: [testTypedArray.js] features: [BigInt, Symbol.toStringTag, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var ta = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var ta = new TA(makeCtorArg(0)); assert.sameValue(ta[Symbol.toStringTag], TA.name, "property value"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js index f24e7147f11f..7587e6fddad5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [Symbol.toStringTag, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample[Symbol.toStringTag], TA.name); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/return-typedarrayname.js b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/return-typedarrayname.js index b16a10837ad9..2840761d9eb1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/return-typedarrayname.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/Symbol.toStringTag/return-typedarrayname.js @@ -15,7 +15,7 @@ includes: [testTypedArray.js] features: [Symbol.toStringTag, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var ta = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var ta = new TA(makeCtorArg(0)); assert.sameValue(ta[Symbol.toStringTag], TA.name, "property value"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/detached-buffer.js index deb168fb340f..a134d722c589 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/detached-buffer.js @@ -13,9 +13,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(8); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(8); var sample = new TA(buffer, 0, 1); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.buffer, buffer); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/return-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/return-buffer.js index 037d36237c72..dccac55059c1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/return-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/BigInt/return-buffer.js @@ -14,9 +14,9 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(1); var ta = new TA(buffer); assert.sameValue(ta.buffer, buffer); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/detached-buffer.js index 1aa7e028c7c3..e472bc3c8c5c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/detached-buffer.js @@ -13,9 +13,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(8); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(8); var sample = new TA(buffer, 0, 1); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.buffer, buffer); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/return-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/return-buffer.js index a80c1e072ea8..c1a6f4340204 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/return-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/buffer/return-buffer.js @@ -14,9 +14,9 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(TA.BYTES_PER_ELEMENT); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(1); var ta = new TA(buffer); assert.sameValue(ta.buffer, buffer); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/BigInt/detached-buffer.js index 08c330cb5f0e..c1c9c9019da7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/BigInt/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.byteLength, 0); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/detached-buffer.js index 029ef7137e1f..fdd57281e85c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteLength/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.byteLength, 0); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/detached-buffer.js index 036c4cbbb504..aa7142867a6b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/detached-buffer.js @@ -14,9 +14,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(128); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(128); var sample = new TA(buffer, 8, 1); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.byteOffset, 0); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/return-byteoffset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/return-byteoffset.js index 2a53ba897a83..4e086d44ce49 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/return-byteoffset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/BigInt/return-byteoffset.js @@ -14,18 +14,18 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var ta1 = new TA(); assert.sameValue(ta1.byteOffset, 0, "Regular typedArray"); var offset = 4 * TA.BYTES_PER_ELEMENT; - var buffer1 = new ArrayBuffer(8 * TA.BYTES_PER_ELEMENT); + var buffer1 = makeCtorArg(8); var ta2 = new TA(buffer1, offset); assert.sameValue(ta2.byteOffset, offset, "TA(buffer, offset)"); - var buffer2 = new ArrayBuffer(8 * TA.BYTES_PER_ELEMENT); + var buffer2 = makeCtorArg(8); var sample = new TA(buffer2, offset); var ta3 = new TA(sample); assert.sameValue(ta3.byteOffset, 0, "TA(typedArray)"); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/detached-buffer.js index 0c1114403dc8..6dbda3f738d5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/detached-buffer.js @@ -14,9 +14,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var buffer = new ArrayBuffer(128); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var buffer = makeCtorArg(128); var sample = new TA(buffer, 8, 1); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.byteOffset, 0); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/return-byteoffset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/return-byteoffset.js index 50f22d50fe24..cbca8c3ecb76 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/return-byteoffset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/byteOffset/return-byteoffset.js @@ -14,18 +14,18 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var ta1 = new TA(); assert.sameValue(ta1.byteOffset, 0, "Regular typedArray"); var offset = 4 * TA.BYTES_PER_ELEMENT; - var buffer1 = new ArrayBuffer(8 * TA.BYTES_PER_ELEMENT); + var buffer1 = makeCtorArg(8); var ta2 = new TA(buffer1, offset); assert.sameValue(ta2.byteOffset, offset, "TA(buffer, offset)"); - var buffer2 = new ArrayBuffer(8 * TA.BYTES_PER_ELEMENT); + var buffer2 = makeCtorArg(8); var sample = new TA(buffer2, offset); var ta3 = new TA(sample); assert.sameValue(ta3.byteOffset, 0, "TA(typedArray)"); -}, null, ["passthrough"]); +}, null, ["arraybuffer"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-end.js index 98b60e2bbaf3..50ff90fc4b3d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-end.js @@ -74,4 +74,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), 'float -2.5 value coerced to integer -2' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-start.js index 82ca98590c7b..4a7c6cbcba6b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-start.js @@ -89,4 +89,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '1.5 float value coerced to integer 1' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-target.js index 39fe0dd7c979..4551963f7f9f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/coerced-values-target.js @@ -89,4 +89,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '1.5 float value coerced to integer 1' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/detached-buffer.js index 75e1622c5057..cad1119ceba4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/detached-buffer.js @@ -25,10 +25,10 @@ var obj = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.copyWithin(obj, obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-end.js index b14d4bdac372..a00b5a4c1bd9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-end.js @@ -92,4 +92,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4].copyWithin(-5, -2, -1) -> [3, 1, 2, 3, 4]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-end.js index 92eb58d0a903..4877a16671f2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-end.js @@ -108,4 +108,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-7, -8, -Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-start.js index 71927d17ab44..cbfc985e94a3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-start.js @@ -90,4 +90,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-9, -Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-target.js index 3b0a18701b47..2f1ca8b608a5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-out-of-bounds-target.js @@ -58,4 +58,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-Infinity, 2) -> [3, 4, 5, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-start.js index b55690204f12..8ceb36225dcb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-start.js @@ -74,4 +74,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4].copyWithin(-5, -2) -> [3, 4, 2, 3, 4]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-target.js index 8f73e7150e9e..defdb9f9c228 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/negative-target.js @@ -50,4 +50,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3].copyWithin(-1, 2) -> [0, 1, 2, 2]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-end.js index cb2123459ef7..5de4974df747 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-end.js @@ -51,4 +51,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(1, 3, Infinity) -> [1, 4, 5, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-target-and-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-target-and-start.js index 8be6d08fc4e1..32a7d4b2b4a5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-target-and-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-out-of-bounds-target-and-start.js @@ -71,4 +71,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(Infinity, Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-and-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-and-start.js index 6adbdf917b60..3b36bb3e42df 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-and-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-and-start.js @@ -47,4 +47,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { [0n, 4n, 5n, 3n, 4n, 5n] ) ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-start-and-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-start-and-end.js index 0e6295b36ddc..9605fee5a050 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-start-and-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/non-negative-target-start-and-end.js @@ -70,4 +70,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4, 5].copyWithin(1, 3, 5) -> [0, 3, 4, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end-is-symbol.js index 73ee9bde7a8d..27a1d8e6a575 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end-is-symbol.js @@ -28,9 +28,9 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol(1); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(0, 0, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end.js index 91ddf11c5f31..756928658d58 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-end.js @@ -26,14 +26,14 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var o1 = { valueOf: function() { throw new Test262Error(); } }; - var sample = new TA(); + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(0, 0, o1); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start-is-symbol.js index 915c0ec6d56b..44352d75d7bb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start-is-symbol.js @@ -27,9 +27,9 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol(1); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(0, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start.js index 2cae99c67e54..5a9947500846 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-start.js @@ -37,9 +37,9 @@ var err = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(0, o, err); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target-is-symbol.js index 927e25f20e29..e96cb6a94c5e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target-is-symbol.js @@ -27,9 +27,9 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol(1); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(s, 0); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target.js index ac2984d2cf0a..0bdec02c2f9f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-abrupt-from-target.js @@ -31,9 +31,9 @@ var o = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(o); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-this.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-this.js index 27f15a3d6f6c..5a3155113c38 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-this.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/return-this.js @@ -33,4 +33,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var result2 = sample2.copyWithin(1, 0); assert.sameValue(result2, sample2); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/undefined-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/undefined-end.js index f1b67f7a474f..ed9199a95035 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/undefined-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/BigInt/undefined-end.js @@ -42,4 +42,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3].copyWithin(0, 1) -> [1, 2, 3, 3]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js index e50187441c51..9d50404adc10 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js @@ -16,8 +16,8 @@ includes: [nans.js, compareArray.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function body(FloatArray) { - var subject = new FloatArray(NaNs.length * 2); +testWithTypedArrayConstructors(function body(FloatArray, makeCtorArg) { + var subject = new FloatArray(makeCtorArg(NaNs.length * 2)); NaNs.forEach(function(v, i) { subject[i] = v; @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function body(FloatArray) { ); assert(compareArray(originalBytes, copiedBytes)); -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/byteoffset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/byteoffset.js index 01555b72c9bd..8bb96b6fc306 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/byteoffset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/byteoffset.js @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { [0, 1, 2, 1], 'underlying arraybuffer should have been updated' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached-prototype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached-prototype.js index fcbfa18978d2..289133f850ee 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached-prototype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached-prototype.js @@ -21,7 +21,7 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var ta; var array = []; @@ -33,8 +33,8 @@ testWithTypedArrayConstructors(function(TA) { array.length = 10000; // big arrays are more likely to cause a crash if they are accessed after they are freed array.fill(7, 0); - ta = new TA(array); + ta = new TA(makeCtorArg(array)); assert.throws(TypeError, function(){ ta.copyWithin(0, 100, {valueOf : detachAndReturnIndex}); }, "should throw TypeError as array is detached"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached.js index ef49765ebe47..3d39f016bded 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end-detached.js @@ -21,7 +21,7 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var ta; function detachAndReturnIndex(){ $DETACHBUFFER(ta.buffer); @@ -31,8 +31,8 @@ testWithTypedArrayConstructors(function(TA) { var array = []; array.length = 10000; // big arrays are more likely to cause a crash if they are accessed after they are freed array.fill(7, 0); - ta = new TA(array); + ta = new TA(makeCtorArg(array)); assert.throws(TypeError, function(){ ta.copyWithin(0, 100, {valueOf : detachAndReturnIndex}); }, "should throw TypeError as array is detached"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js index a542be2bb703..a8c2157f50e2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js @@ -74,4 +74,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), 'float -2.5 value coerced to integer -2' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start-detached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start-detached.js index 01cc87d93668..5bb1b155059d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start-detached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start-detached.js @@ -21,7 +21,7 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var ta; function detachAndReturnIndex(){ $DETACHBUFFER(ta.buffer); @@ -31,8 +31,8 @@ testWithTypedArrayConstructors(function(TA) { var array = []; array.length = 10000; // big arrays are more likely to cause a crash if they are accessed after they are freed array.fill(7, 0); - ta = new TA(array); + ta = new TA(makeCtorArg(array)); assert.throws(TypeError, function(){ ta.copyWithin(0, {valueOf : detachAndReturnIndex}, 1000); }, "should throw TypeError as array is detached"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js index 72e5bc406a1c..92aa33c9cd15 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js @@ -89,4 +89,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '1.5 float value coerced to integer 1' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js index 9adfd9cd1062..8e3239903f95 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js @@ -97,4 +97,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), 'object value coerced to integer 0' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/detached-buffer.js index 7c1aa1b69373..0cfbea181155 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/detached-buffer.js @@ -25,10 +25,10 @@ var obj = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.copyWithin(obj, obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/immutable-buffer.js new file mode 100644 index 000000000000..21561cd7d6a8 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/immutable-buffer.js @@ -0,0 +1,59 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.copywithin +description: Throws a TypeError exception when the backing buffer is immutable +info: | + %TypedArray%.prototype.copyWithin ( target, start [ , end ] ) + 1. Let O be the this value. + 2. Let taRecord be ? ValidateTypedArray(O, ~seq-cst~, ~write~). + 3. Let len be TypedArrayLength(taRecord). + 4. Let relativeTarget be ? ToIntegerOrInfinity(target). + 5. If relativeTarget = -∞, let targetIndex be 0. + 6. Else if relativeTarget < 0, let targetIndex be max(len + relativeTarget, 0). + 7. Else, let targetIndex be min(relativeTarget, len). + 8. Let relativeStart be ? ToIntegerOrInfinity(start). + 9. If relativeStart = -∞, let startIndex be 0. + 10. Else if relativeStart < 0, let startIndex be max(len + relativeStart, 0). + 11. Else, let startIndex be min(relativeStart, len). + 12. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + var target = { + valueOf() { + calls.push("target.valueOf"); + return 1; + } + }; + var start = { + valueOf() { + calls.push("start.valueOf"); + return 2; + } + }; + var end = { + valueOf() { + calls.push("end.valueOf"); + return 2; + } + }; + + assert.throws(TypeError, function() { + ta.copyWithin(target, start, end); + }); + assert.compareArray(calls, [], "Must verify mutability before reading arguments."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), "Must not mutate contents."); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-end.js index 1f8c6d083f88..3d18750139ed 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-end.js @@ -92,4 +92,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4].copyWithin(-5, -2, -1) -> [3, 1, 2, 3, 4]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js index c8687b85d4c3..24e6955e39dc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js @@ -108,4 +108,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-7, -8, -Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js index 3826ed37a2da..5ef955bd0a90 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js @@ -90,4 +90,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-9, -Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js index 56e28367f83c..34690c59db03 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js @@ -58,4 +58,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(-Infinity, 2) -> [3, 4, 5, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-start.js index 70b305349e11..eacbcd9687b7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-start.js @@ -74,4 +74,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4].copyWithin(-5, -2) -> [3, 4, 2, 3, 4]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-target.js index f5a909979586..a3e12b60a3bf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/negative-target.js @@ -50,4 +50,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3].copyWithin(-1, 2) -> [0, 1, 2, 2]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js index 23df3ef812a0..0cd078665efe 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js @@ -51,4 +51,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(1, 3, Infinity) -> [1, 4, 5, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js index 6956d288b47a..1ef8740a1ac6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js @@ -71,4 +71,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[1, 2, 3, 4, 5].copyWithin(Infinity, Infinity) -> [1, 2, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js index 72c6badc2aa5..db6cc87defbc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js @@ -47,4 +47,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { [0, 4, 5, 3, 4, 5] ) ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js index 9e37ecba37df..c81708208e77 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js @@ -70,4 +70,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3, 4, 5].copyWithin(1, 3, 5) -> [0, 3, 4, 3, 4, 5]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end-is-symbol.js index ce76b90db28e..67a099ca5d64 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end-is-symbol.js @@ -28,9 +28,9 @@ features: [Symbol, TypedArray] var s = Symbol(1); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(0, 0, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js index 8ce6a9f601af..de0d1d9e5dfc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js @@ -26,14 +26,14 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var o1 = { valueOf: function() { throw new Test262Error(); } }; - var sample = new TA(); + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(0, 0, o1); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start-is-symbol.js index 9fe2f2849e17..2905361800b9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start-is-symbol.js @@ -27,9 +27,9 @@ features: [Symbol, TypedArray] var s = Symbol(1); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(0, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js index b726df0c1f9d..c97639ccf958 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js @@ -37,9 +37,9 @@ var err = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(0, o, err); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target-is-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target-is-symbol.js index 1aac7608a1b4..8a403ce70cbf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target-is-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target-is-symbol.js @@ -27,9 +27,9 @@ features: [Symbol, TypedArray] var s = Symbol(1); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.copyWithin(s, 0); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js index 9e3fb26583ad..97d60c4e5f0a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js @@ -31,9 +31,9 @@ var o = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.copyWithin(o); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-this.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-this.js index 68bd240e2127..42eb83172a56 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-this.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/return-this.js @@ -33,4 +33,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { var result2 = sample2.copyWithin(1, 0); assert.sameValue(result2, sample2); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/undefined-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/undefined-end.js index add95fbbaa72..0c491bf2c654 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/undefined-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/copyWithin/undefined-end.js @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ), '[0, 1, 2, 3].copyWithin(0, 1) -> [1, 2, 3, 3]' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/BigInt/detached-buffer.js index 381f1b7f8d21..7b965e58c32e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/BigInt/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.entries(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/detached-buffer.js index 87415a6eadee..d5dfb77df6b4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.entries(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/return-itor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/return-itor.js index 217f3e37069c..8a7876266096 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/entries/return-itor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/entries/return-itor.js @@ -14,8 +14,8 @@ features: [TypedArray] var sample = [0, 42, 64]; -testWithTypedArrayConstructors(function(TA) { - var typedArray = new TA(sample); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var typedArray = new TA(makeCtorArg(sample)); var itor = typedArray.entries(); var next = itor.next(); @@ -33,4 +33,4 @@ testWithTypedArrayConstructors(function(TA) { next = itor.next(); assert.sameValue(next.value, undefined); assert.sameValue(next.done, true); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js index 1b66fb608c71..ae6107ba435a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.every(function() { if (loops === 0) { @@ -38,4 +38,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-not-called-on-empty.js index ac79c980aab0..5d49fa2eb33d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().every(function() { + new TA(makeCtorArg(0)).every(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-set-value-during-interaction.js index d9b3ba0e914b..86e6ca013d5d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-set-value-during-interaction.js @@ -55,4 +55,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/detached-buffer.js index bb784071f31b..1f4a4f7f55dc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.every(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/returns-true-if-every-cb-returns-true.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/returns-true-if-every-cb-returns-true.js index 9f3422fff367..6f364a3a2a74 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/returns-true-if-every-cb-returns-true.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/returns-true-if-every-cb-returns-true.js @@ -20,7 +20,7 @@ includes: [testTypedArray.js] features: [BigInt, Symbol, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; var values = [ true, @@ -35,7 +35,7 @@ testWithBigIntTypedArrayConstructors(function(TA) { 0.1, -0.1 ]; - var sample = new TA(values.length); + var sample = new TA(makeCtorArg(values.length)); var result = sample.every(function() { called++; return values.unshift(); @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.sameValue(called, sample.length, "callbackfn called for each index"); assert.sameValue(result, true, "return is true"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/values-are-not-cached.js index a397c4708765..0431e4febd04 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/BigInt/values-are-not-cached.js @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { ); return true; }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js index 3ca47cde6b9a..5787fdc4a7f7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.every(function() { if (loops === 0) { @@ -38,4 +38,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js index 055c5065ca69..d347f6855f57 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().every(function() { + new TA(makeCtorArg(0)).every(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js index 235f03353ed1..5d3e01448e50 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js @@ -55,4 +55,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/detached-buffer.js index b5d535f691df..85910709e7e3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.every(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js index f00d93d546b8..52acdbae30bb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js @@ -20,7 +20,7 @@ includes: [testTypedArray.js] features: [Symbol, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; var values = [ true, @@ -35,7 +35,7 @@ testWithTypedArrayConstructors(function(TA) { 0.1, -0.1 ]; - var sample = new TA(values.length); + var sample = new TA(makeCtorArg(values.length)); var result = sample.every(function() { called++; return values.unshift(); @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA) { assert.sameValue(called, sample.length, "callbackfn called for each index"); assert.sameValue(result, true, "return is true"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/every/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/every/values-are-not-cached.js index f9f9e0690170..f61fc01acf5e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/every/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/every/values-are-not-cached.js @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { ); return true; }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/coerced-indexes.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/coerced-indexes.js index 4f3cded46210..e6e797f48081 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/coerced-indexes.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/coerced-indexes.js @@ -101,4 +101,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0n, 0n])).fill(1n, 0, 1.5), [1n, 0n]), 'end as a float number coerced' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/detached-buffer.js index c9492dc31870..a248f4abcc1b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/detached-buffer.js @@ -25,10 +25,10 @@ var obj = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.fill(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-conversion-once.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-conversion-once.js index ce5853f52d8e..4f3647f9a6b2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-conversion-once.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-conversion-once.js @@ -24,5 +24,5 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(n, 2n, "additional unexpected ToBigInt() calls"); assert.sameValue(sample[0], 1n, "incorrect ToNumber result in index 0"); assert.sameValue(sample[1], 1n, "incorrect ToNumber result in index 1"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-custom-start-and-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-custom-start-and-end.js index 4d82b802be10..78cbcf8e3bcd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-custom-start-and-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-custom-start-and-end.js @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert(compareArray(new TA(makeCtorArg([0n, 0n, 0n, 0n, 0n])).fill(8n, -2, -1), [0n, 0n, 0n, 8n, 0n])); assert(compareArray(new TA(makeCtorArg([0n, 0n, 0n, 0n, 0n])).fill(8n, -1, -3), [0n, 0n, 0n, 0n, 0n])); assert(compareArray(new TA(makeCtorArg([0n, 0n, 0n, 0n, 0n])).fill(8n, 1, 3), [0n, 8n, 8n, 0n, 0n])); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric-throw.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric-throw.js index 34b86e4019c1..298117a683b8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric-throw.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric-throw.js @@ -64,4 +64,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.fill("nonsense"); }, "abrupt completion from string"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric.js index 7f2be13728b9..6b7cb72ae1a9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-non-numeric.js @@ -80,4 +80,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { }); assert.sameValue(sample[0], 7n, "object toString when valueOf is absent"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-end.js index 1740920d61f9..52eaf2dc7a58 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-end.js @@ -50,4 +50,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0n, 0n, 0n])).fill(8n, 0, -4), [0n, 0n, 0n]), "end position is 0 when (len + relativeEnd) < 0" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-start.js index 5c6101368817..f645d9c0caa1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-relative-start.js @@ -48,4 +48,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0n, 0n, 0n])).fill(8n, -5), [8n, 8n, 8n]), "start position is 0 when (len + relativeStart) < 0" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-symbol-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-symbol-throws.js index 24b7bc17d1f6..988601ba2a7c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-symbol-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values-symbol-throws.js @@ -55,4 +55,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.fill(s); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values.js index 4bd08ca21d58..773a407b3113 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/fill-values.js @@ -41,4 +41,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0n, 0n, 0n])).fill(8n), [8n, 8n, 8n]), "Default start and end indexes are 0 and this.length" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end-as-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end-as-symbol.js index 71a12c08d4ec..c1f1892df4f4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end-as-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end-as-symbol.js @@ -30,9 +30,9 @@ features: [BigInt, Symbol, TypedArray] var end = Symbol(1); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.fill(1n, 0, end); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end.js index 712cedf1f8a6..8db32a08e2d4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-end.js @@ -34,9 +34,9 @@ var end = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.fill(1n, 0, end); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-set-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-set-value.js index a3fc6ea35c4b..f3a6af18dcf6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-set-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-set-value.js @@ -58,4 +58,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.fill(obj); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start-as-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start-as-symbol.js index e696a35a1201..f32d519d164f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start-as-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start-as-symbol.js @@ -29,9 +29,9 @@ features: [BigInt, Symbol, TypedArray] var start = Symbol(1); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.fill(1n, start); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start.js index 362bf4327a53..51f8d33d4f5c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-abrupt-from-start.js @@ -33,9 +33,9 @@ var start = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.fill(1n, start); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-this.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-this.js index c21609020079..c7225384d316 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-this.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/BigInt/return-this.js @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var sample2 = new TA(makeCtorArg(42)); var result2 = sample2.fill(7n); assert.sameValue(result2, sample2); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-end-detach.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-end-detach.js index 1f358d3703ca..70fe6a719e76 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-end-detach.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-end-detach.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(10); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(10)); function detachAndReturnIndex(){ $DETACHBUFFER(sample.buffer); @@ -25,4 +25,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.fill(0x77, 0, {valueOf: detachAndReturnIndex}); }, "Detachment when coercing end should throw TypeError"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-indexes.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-indexes.js index 58a2b16e0112..c6834011dd0f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-indexes.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-indexes.js @@ -101,4 +101,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0, 0])).fill(1, 0, 1.5), [1, 0]), 'end as a float number coerced' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-start-detach.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-start-detach.js index 64b51882aeef..f1839ca892ed 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-start-detach.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-start-detach.js @@ -15,8 +15,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(10); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(10)); function detachAndReturnIndex(){ $DETACHBUFFER(sample.buffer); @@ -26,4 +26,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.fill(0x77, {valueOf: detachAndReturnIndex}, 10); }, "Detachment when coercing start should throw TypeError"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-value-detach.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-value-detach.js index 8a83b5e5943d..7be93b514eb3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-value-detach.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/coerced-value-detach.js @@ -15,8 +15,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(10); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(10)); function detachAndReturnIndex(){ $DETACHBUFFER(sample.buffer); @@ -26,4 +26,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.fill({valueOf: detachAndReturnIndex}, 0, 10); }, "Detachment when coercing value should throw TypeError"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/detached-buffer.js index 9bbe7d0d7b9d..99d793287297 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/detached-buffer.js @@ -25,10 +25,10 @@ var obj = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.fill(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js index 8a3531936ee9..8617c5811b9a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js @@ -23,5 +23,5 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(n, 2, "additional unexpected ToNumber() calls"); assert.sameValue(sample[0], 1, "incorrect ToNumber result in index 0"); assert.sameValue(sample[1], 1, "incorrect ToNumber result in index 1"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js index aeaac53e6708..2558a013da0a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js @@ -98,4 +98,4 @@ testWithTypedArrayConstructors(function(FA, makeCtorArg) { ); } } -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js index 7ee112c0d9a7..9371e6f13f80 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert(compareArray(new TA(makeCtorArg([0, 0, 0, 0, 0])).fill(8, -2, -1), [0, 0, 0, 8, 0])); assert(compareArray(new TA(makeCtorArg([0, 0, 0, 0, 0])).fill(8, -1, -3), [0, 0, 0, 0, 0])); assert(compareArray(new TA(makeCtorArg([0, 0, 0, 0, 0])).fill(8, 1, 3), [0, 8, 8, 0, 0])); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js index cb05403e576d..e544c9469447 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js @@ -84,4 +84,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { } }); assert.sameValue(sample[0], 7, "object toString when valueOf is absent"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-end.js index 598715aefd73..f5a2e63147d1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-end.js @@ -50,4 +50,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0, 0, 0])).fill(8, 0, -4), [0, 0, 0]), "end position is 0 when (len + relativeEnd) < 0" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-start.js index 0261a22d1b37..3af094a57508 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-relative-start.js @@ -48,4 +48,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0, 0, 0])).fill(8, -5), [8, 8, 8]), "start position is 0 when (len + relativeStart) < 0" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-symbol-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-symbol-throws.js index 36d041b36ba0..a42844db792d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-symbol-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values-symbol-throws.js @@ -55,4 +55,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.fill(s); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values.js index 63207f87c58f..30cedcccb285 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/fill-values.js @@ -41,4 +41,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(new TA(makeCtorArg([0, 0, 0])).fill(8), [8, 8, 8]), "Default start and end indexes are 0 and this.length" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/immutable-buffer.js new file mode 100644 index 000000000000..c466a105465e --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/immutable-buffer.js @@ -0,0 +1,57 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.fill +description: Throws a TypeError exception when the backing buffer is immutable +info: | + %TypedArray%.prototype.fill ( value [ , start [ , end ] ] ) + 1. Let O be the this value. + 2. Let taRecord be ? ValidateTypedArray(O, ~seq-cst~, ~write~). + 3. Let len be TypedArrayLength(taRecord). + 4. If O.[[ContentType]] is bigint, set value to ? ToBigInt(value). + 5. Otherwise, set value to ? ToNumber(value). + 6. Let relativeStart be ? ToIntegerOrInfinity(start). + 7. If relativeStart = -∞, let startIndex be 0. + 8. Else if relativeStart < 0, let startIndex be max(len + relativeStart, 0). + 9. Else, let startIndex be min(relativeStart, len). + 10. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToIntegerOrInfinity(end). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + var value = { + valueOf() { + calls.push("value.valueOf"); + return "8"; + } + }; + var start = { + valueOf() { + calls.push("start.valueOf"); + return 1; + } + }; + var end = { + valueOf() { + calls.push("end.valueOf"); + return 1; + } + }; + + assert.throws(TypeError, function() { + ta.fill(value, start, end); + }); + assert.compareArray(calls, [], "Must verify mutability before reading arguments."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), "Must not mutate contents."); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end-as-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end-as-symbol.js index 8c6a62b155f7..76042af484c3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end-as-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end-as-symbol.js @@ -30,9 +30,9 @@ features: [Symbol, TypedArray] var end = Symbol(1); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.fill(1, 0, end); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js index db9d08a09c01..495353ea09d0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js @@ -34,9 +34,9 @@ var end = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.fill(1, 0, end); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js index 0c52c3675be7..ca68ae49c0f5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js @@ -58,4 +58,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.fill(obj); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start-as-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start-as-symbol.js index bfbbfc3dfacb..6c2f4e014d99 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start-as-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start-as-symbol.js @@ -29,9 +29,9 @@ features: [Symbol, TypedArray] var start = Symbol(1); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.fill(1, start); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js index 0b10cf6b3366..92b9df93f87f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js @@ -33,9 +33,9 @@ var start = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.fill(1, start); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-this.js b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-this.js index 84859f01859b..5f1b1603ee0f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-this.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/fill/return-this.js @@ -17,4 +17,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample2 = new TA(makeCtorArg(42)); var result2 = sample2.fill(7); assert.sameValue(result2, sample2); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-ctor.js index f26d2183136a..5180ebdd0479 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-ctor.js @@ -17,9 +17,9 @@ includes: [testTypedArray.js] features: [BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var length = 42; - var sample = new TA(length); + var sample = new TA(makeCtorArg(length)); var calls = 0; var before = false; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-species.js index 948af79ddba6..785b334e6f50 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-called-before-species.js @@ -17,9 +17,9 @@ includes: [testTypedArray.js] features: [BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var length = 42; - var sample = new TA(length); + var sample = new TA(makeCtorArg(length)); var calls = 0; var before = false; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js index 04fb2e917cf1..c66add78f542 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js @@ -18,9 +18,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.filter(function() { var flag = true; @@ -34,4 +34,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-not-called-on-empty.js index 2b8effd41895..3e98c6da6879 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-not-called-on-empty.js @@ -16,12 +16,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().filter(function() { + new TA(makeCtorArg(0)).filter(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-return-does-not-change-instance.js index 78ebdd956d2d..c4beeb4eed72 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-return-does-not-change-instance.js @@ -9,9 +9,7 @@ features: [BigInt, TypedArray] ---*/ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1n; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.filter(function() { return 42; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-set-value-during-iteration.js index 959ad02f270c..84a490a6eceb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-set-value-during-iteration.js @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after interaction [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after interaction [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after interaction [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/detached-buffer.js index 808fec192159..d0d7ec883b3a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.filter(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/values-are-not-cached.js index fe17657080bd..5ba4cb58b281 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/BigInt/values-are-not-cached.js @@ -28,4 +28,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { v, 42n, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js index ec67bea1bd46..765a6730c38c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js @@ -17,9 +17,9 @@ includes: [testTypedArray.js] features: [Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var length = 42; - var sample = new TA(length); + var sample = new TA(makeCtorArg(length)); var calls = 0; var before = false; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js index a5e77a491391..4289ab5dfc21 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js @@ -17,9 +17,9 @@ includes: [testTypedArray.js] features: [Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var length = 42; - var sample = new TA(length); + var sample = new TA(makeCtorArg(length)); var calls = 0; var before = false; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js index 638438e219db..2f3e1ed1a64c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js @@ -17,9 +17,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.filter(function() { if (loops === 0) { @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js index 8adf00218076..0d7f6183765d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js @@ -16,12 +16,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().filter(function() { + new TA(makeCtorArg(0)).filter(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js index 3c5d96ceee70..3d09210fd25d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js @@ -9,9 +9,7 @@ features: [TypedArray] ---*/ testWithTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.filter(function() { return 42; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js index 29b3fc0e6b75..e5188e0cc5e4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after interaction [0] == 7"); assert.sameValue(sample[1], 1, "changed values after interaction [1] == 1"); assert.sameValue(sample[2], 2, "changed values after interaction [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/detached-buffer.js index 5f25343417c8..84a498de00ea 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.filter(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/speciesctor-destination-backed-by-immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/speciesctor-destination-backed-by-immutable-buffer.js new file mode 100644 index 000000000000..ac1a61b10884 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/speciesctor-destination-backed-by-immutable-buffer.js @@ -0,0 +1,82 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.filter +description: > + Throws a TypeError exception when the receiver constructs an instance backed + by an immutable buffer +info: | + %TypedArray%.prototype.filter ( callback [ , thisArg ] ) + ... + 8. Repeat, while k < len, + a. Let Pk be ! ToString(𝔽(k)). + b. Let kValue be ! Get(O, Pk). + c. Let selected be ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »)). + d. If selected is true, then + i. Append kValue to kept. + ii. Set captured to captured + 1. + e. Set k to k + 1. + 9. Let A be ? TypedArraySpeciesCreate(O, « 𝔽(captured) », ~write~). + 10. Assert: IsImmutableBuffer(A.[[ViewedArrayBuffer]]) is false. + + TypedArraySpeciesCreate ( exemplar, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let defaultConstructor be the intrinsic object associated with the constructor name exemplar.[[TypedArrayName]] in Table 73. + 3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor). + 4. Let result be ? TypedArrayCreateFromConstructor(constructor, argumentList, accessMode). + + TypedArrayCreateFromConstructor ( constructor, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let newTypedArray be ? Construct(constructor, argumentList). + 3. Let taRecord be ? ValidateTypedArray(newTypedArray, seq-cst, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Symbol.species, TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2"])); + var iab = (new TA(["3", "4"])).buffer.transferToImmutable(); + var constructor = {}; + Object.defineProperty(ta, "constructor", { + get: function() { + calls.push("get ta.constructor"); + return constructor; + } + }); + Object.defineProperty(constructor, Symbol.species, { + get: function() { + calls.push("get ta.constructor[Symbol.species]"); + return function speciesCtor() { + calls.push("construct result"); + var result = new TA(iab); + calls.push("return result"); + return result; + }; + } + }); + + assert.throws(TypeError, function() { + ta.filter(function(value, index) { + calls.push("filter index " + index); + return !index; + }); + }); + var expectCalls = [ + "filter index 0", + "filter index 1", + "get ta.constructor", + "get ta.constructor[Symbol.species]", + "construct result", + "return result" + ]; + assert.compareArray(calls, expectCalls, "Must visit elements before constructing the result."); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/values-are-not-cached.js index 448c33f4d141..e27bf951f0a6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/filter/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/filter/values-are-not-cached.js @@ -28,4 +28,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { v, 42, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/detached-buffer.js index da8daa539db3..f271038edca0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.find(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-call-changes-value.js index e7aa73781588..867eed774e30 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-call-changes-value.js @@ -75,4 +75,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return true; }); assert.sameValue(result, 1n, "find() returns previous found value"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-is-not-callable-throws.js index e33cc3646dde..cdff56f3a6e9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-is-not-callable-throws.js @@ -25,8 +25,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.find({}); @@ -63,4 +63,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.find(/./); }, "regexp"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-may-detach-buffer.js index 65720dc5e218..6bdec4d62594 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-may-detach-buffer.js @@ -42,9 +42,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.find(function() { if (loops === 0) { @@ -54,4 +54,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-not-called-on-empty-array.js index 152d92f52fb3..69fa9f1e5bcc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/BigInt/predicate-not-called-on-empty-array.js @@ -27,8 +27,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var result = sample.find(function() { @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { undefined, "find returns undefined when predicate is not called" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/detached-buffer.js index c37bd6962f76..e2152642ccb6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.find(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-call-changes-value.js index ce2cafed376a..1e717cac11e6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-call-changes-value.js @@ -75,4 +75,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return true; }); assert.sameValue(result, 1, "find() returns previous found value"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-is-not-callable-throws.js index d041ec58791b..72c5ec5f3c4c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-is-not-callable-throws.js @@ -25,8 +25,8 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.find({}); @@ -63,4 +63,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.find(/./); }, "regexp"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js index 80a70f9dad55..56fa10b26898 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js @@ -42,9 +42,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.find(function() { if (loops === 0) { @@ -54,4 +54,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js index 9dd1e94ab020..efcec7131245 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js @@ -27,8 +27,8 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var result = sample.find(function() { @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA) { undefined, "find returns undefined when predicate is not called" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/detached-buffer.js index a3fbcbd99c25..7b5e2ad6c64d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findIndex(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-call-changes-value.js index e6ee1d4b025d..636cdd225dbe 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-call-changes-value.js @@ -64,4 +64,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return val === 7n; }); assert.sameValue(result, -1, "value not found - changed after call"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-is-not-callable-throws.js index c7fd11789963..18c281d5c5c2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-is-not-callable-throws.js @@ -23,8 +23,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findIndex({}); }, "{}"); @@ -60,5 +60,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findIndex(/./); }, "/./"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js index 831bccbf9887..6cbedff1c437 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js @@ -34,8 +34,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var loops = 0; sample.findIndex(function() { @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { loops++; }); assert.sameValue(loops, 2, "predicate is called once"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-not-called-on-empty-array.js index e60ad6ae1024..cd9fb7099099 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-not-called-on-empty-array.js @@ -26,8 +26,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var predicate = function() { @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { result, -1, "returns -1 on an empty instance" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/detached-buffer.js index 5d79ae9af8b4..8ff3a6ef9ca5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findIndex(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js index e47a006c5e13..2a7fc69297a9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js @@ -64,4 +64,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return val === 7; }); assert.sameValue(result, -1, "value not found - changed after call"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-is-not-callable-throws.js index 07e07caf7b10..c859acc7f182 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-is-not-callable-throws.js @@ -23,8 +23,8 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findIndex({}); }, "{}"); @@ -60,5 +60,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findIndex(/./); }, "/./"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js index fca55d59895b..54ac0d615f59 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js @@ -31,8 +31,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var loops = 0; sample.findIndex(function() { @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA) { loops++; }); assert.sameValue(loops, 2, "predicate is called once"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js index 7a3ec2a004e1..41ff0abda796 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js @@ -26,8 +26,8 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var predicate = function() { @@ -45,4 +45,4 @@ testWithTypedArrayConstructors(function(TA) { result, -1, "returns -1 on an empty instance" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/detached-buffer.js index ce76155d1227..bedeb671387f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/detached-buffer.js @@ -21,10 +21,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findLast(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-call-changes-value.js index f05e04712dff..dbacb1c19d15 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-call-changes-value.js @@ -63,4 +63,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return true; }); assert.sameValue(result, 3n, "findLast() returns previous found value"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-is-not-callable-throws.js index 9d4251a9be74..082fb04ec38a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-is-not-callable-throws.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findLast({}); @@ -52,4 +52,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findLast(/./); }, "regexp"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-may-detach-buffer.js index 6cd3e204a61e..1927ed16677e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-may-detach-buffer.js @@ -24,9 +24,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.findLast(function() { if (loops === 0) { @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-not-called-on-empty-array.js index 0ac503c71369..672810e69e54 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/BigInt/predicate-not-called-on-empty-array.js @@ -15,8 +15,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var result = sample.findLast(function() { @@ -34,4 +34,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { undefined, "findLast returns undefined when predicate is not called" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/detached-buffer.js index fa0f8b6af816..1667c2538653 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/detached-buffer.js @@ -21,10 +21,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findLast(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-call-changes-value.js index c86ce12a5736..20c188a5fc53 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-call-changes-value.js @@ -63,4 +63,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return true; }); assert.sameValue(result, 3, "findLast() returns previous found value"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-is-not-callable-throws.js index abfa53835f58..958cb4b92d54 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-is-not-callable-throws.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findLast({}); @@ -52,4 +52,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findLast(/./); }, "regexp"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-may-detach-buffer.js index 45f2f837142d..60222805b9a8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-may-detach-buffer.js @@ -24,9 +24,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.findLast(function() { if (loops === 0) { @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-not-called-on-empty-array.js index 9d804b4c3485..2b6ba1014eee 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLast/predicate-not-called-on-empty-array.js @@ -15,8 +15,8 @@ includes: [testTypedArray.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var result = sample.findLast(function() { @@ -34,4 +34,4 @@ testWithTypedArrayConstructors(function(TA) { undefined, "findLast returns undefined when predicate is not called" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/detached-buffer.js index 75684bc023e0..877cd49d2d88 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findLastIndex(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-call-changes-value.js index cf0043d99d14..e42b60edf5f0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-call-changes-value.js @@ -55,4 +55,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return val === 7n; }); assert.sameValue(result, -1, "value not found - changed after call"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-is-not-callable-throws.js index ef0a4f170125..1ad6d0ca0aaf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-is-not-callable-throws.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findLastIndex({}); }, "{}"); @@ -51,5 +51,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findLastIndex(/./); }, "/./"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-may-detach-buffer.js index 252923f21c8c..fa51f7444fc6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-may-detach-buffer.js @@ -23,8 +23,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var loops = 0; sample.findLastIndex(function() { @@ -34,4 +34,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { loops++; }); assert.sameValue(loops, 2, "predicate is called once"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-not-called-on-empty-array.js index 774c57eb08eb..41b2a43cf3bb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/BigInt/predicate-not-called-on-empty-array.js @@ -17,8 +17,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray, array-find-from-last] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var predicate = function() { @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { result, -1, "returns -1 on an empty instance" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/detached-buffer.js index f2e9c00f1bd5..955dc1a70187 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/detached-buffer.js @@ -23,10 +23,10 @@ var predicate = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.findLastIndex(predicate); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-call-changes-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-call-changes-value.js index eb4f30385d37..93e98e4e010a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-call-changes-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-call-changes-value.js @@ -55,4 +55,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return val === 7; }); assert.sameValue(result, -1, "value not found - changed after call"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-is-not-callable-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-is-not-callable-throws.js index ec7ecacf88a4..745c26995ba7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-is-not-callable-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-is-not-callable-throws.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.findLastIndex({}); }, "{}"); @@ -51,5 +51,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.findLastIndex(/./); }, "/./"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-may-detach-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-may-detach-buffer.js index 147f64162e1e..15745d2267a4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-may-detach-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-may-detach-buffer.js @@ -23,8 +23,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var loops = 0; sample.findLastIndex(function() { @@ -34,4 +34,4 @@ testWithTypedArrayConstructors(function(TA) { loops++; }); assert.sameValue(loops, 2, "predicate is called once"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-not-called-on-empty-array.js b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-not-called-on-empty-array.js index 18d6c80db1bc..95fe9e2b8263 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-not-called-on-empty-array.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/findLastIndex/predicate-not-called-on-empty-array.js @@ -17,8 +17,8 @@ includes: [testTypedArray.js] features: [TypedArray, array-find-from-last] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); var called = false; var predicate = function() { @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { result, -1, "returns -1 on an empty instance" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/arraylength-internal.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/arraylength-internal.js index fbe8544d5f35..0ae4f2e59c3e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/arraylength-internal.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/arraylength-internal.js @@ -43,5 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { }); assert.sameValue(loop, 7, "accessor descriptor"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js index cfb457f8072f..7bb15321753e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.forEach(function() { if (loops === 0) { @@ -37,4 +37,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-not-called-on-empty.js index 72e719d82a29..a96dff276bb7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().forEach(function() { + new TA(makeCtorArg(0)).forEach(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-return-does-not-change-instance.js index ea6cbd548670..40c068dbfe03 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-return-does-not-change-instance.js @@ -16,9 +16,7 @@ features: [BigInt, TypedArray] ---*/ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1n; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.forEach(function() { return 42; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-set-value-during-interaction.js index 5a9b6f7bbe36..68c2937d56ad 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-set-value-during-interaction.js @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/detached-buffer.js index b8acbcc4b28c..d9b4220e1b9b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.forEach(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/values-are-not-cached.js index e8b8eda98ec7..81208159c8ca 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/BigInt/values-are-not-cached.js @@ -28,4 +28,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { v, 42n, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/arraylength-internal.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/arraylength-internal.js index ba7e08bf46b0..7cfe7f77c594 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/arraylength-internal.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/arraylength-internal.js @@ -43,5 +43,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { }); assert.sameValue(loop, 7, "accessor descriptor"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js index d2a8a31d7ead..62228118ff75 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.forEach(function() { if (loops === 0) { @@ -37,4 +37,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js index c039fff8dd4c..14aca8e78832 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().forEach(function() { + new TA(makeCtorArg(0)).forEach(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js index b047cce3d40e..b0c0e5d7f7f8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js @@ -16,9 +16,7 @@ features: [TypedArray] ---*/ testWithTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.forEach(function() { return 42; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js index 70ab374a215b..a218c7e9345a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/detached-buffer.js index 9415d549606a..16d85c5bb291 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.forEach(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/values-are-not-cached.js index 73647d4520e6..4d69907917b2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/forEach/values-are-not-cached.js @@ -28,4 +28,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { v, 42, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-false-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-false-for-zero.js index c45405bf86d3..d24a2079e4e7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-false-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-false-for-zero.js @@ -33,8 +33,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.includes(0n, fromIndex), false); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-true-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-true-for-undefined.js index 9b79efad06b4..ad6a163369b7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-true-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer-during-fromIndex-returns-true-for-undefined.js @@ -3,7 +3,7 @@ /*--- esid: sec-%typedarray%.prototype.includes description: > - Returns false if buffer is detached after ValidateTypedArray and searchElement is a value + Returns true if buffer is detached after ValidateTypedArray and searchElement is undefined info: | %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] ) @@ -34,8 +34,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.includes(undefined, fromIndex), true); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer.js index 8944bbed0a0f..4cbfc9a57c0f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.includes(0n); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/length-zero-returns-false.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/length-zero-returns-false.js index af723ed08f87..f424bdc3fde6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/length-zero-returns-false.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/BigInt/length-zero-returns-false.js @@ -28,12 +28,12 @@ var fromIndex = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.includes(0), false, "returns false"); assert.sameValue(sample.includes(), false, "returns false - no arg"); assert.sameValue( sample.includes(0n, fromIndex), false, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-false-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-false-for-zero.js index c8cac5d0dded..2463120ecd1a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-false-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-false-for-zero.js @@ -3,7 +3,7 @@ /*--- esid: sec-%typedarray%.prototype.includes description: > - Returns false if buffer is detached after ValidateTypedArray and searchElement is a value + Returns false if buffer is detached after ValidateTypedArray and searchElement is not undefined info: | %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] ) @@ -34,8 +34,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.includes(0, fromIndex), false); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-true-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-true-for-undefined.js index de8a5f95249d..0d3d7f6f29c9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-true-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer-during-fromIndex-returns-true-for-undefined.js @@ -34,8 +34,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.includes(undefined, fromIndex), true); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer.js index 864871778c72..1b1ea4750e38 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.includes(0); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/length-zero-returns-false.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/length-zero-returns-false.js index 0bafd9f9f2a7..45c22ad6fe00 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/length-zero-returns-false.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/length-zero-returns-false.js @@ -28,12 +28,12 @@ var fromIndex = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.includes(0), false, "returns false"); assert.sameValue(sample.includes(), false, "returns false - no arg"); assert.sameValue( sample.includes(0, fromIndex), false, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/searchelement-not-integer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/searchelement-not-integer.js index f01191e20902..08a4672b4c88 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/includes/searchelement-not-integer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/includes/searchelement-not-integer.js @@ -20,10 +20,5 @@ features: [TypedArray] testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(makeCtorArg(10)); - function throwFunc(){ - throw Test262Error() - return 0; - } - - assert.sameValue(sample.includes({valueOf : throwFunc}), false); + assert.sameValue(sample.includes({ valueOf: Test262Error.thrower }), false); }); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js index bb1774ee0bd2..6553066e6367 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-%typedarray%.prototype.indexof -description: Throws a TypeError if this has a detached buffer +description: Returns -1 if buffer is detached after ValidateTypedArray info: | %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] ) @@ -36,8 +36,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.indexOf(undefined, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js index 1b877af25480..31cbc6c8fb2f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-%typedarray%.prototype.indexof -description: Throws a TypeError if this has a detached buffer +description: Returns -1 if buffer is detached after ValidateTypedArray info: | %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] ) @@ -36,8 +36,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.indexOf(0n, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer.js index acc7a76616a1..7a9ec72f591b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.indexOf(0n); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/length-zero-returns-minus-one.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/length-zero-returns-minus-one.js index b43eaff9a326..9c439b1bc8bc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/length-zero-returns-minus-one.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/BigInt/length-zero-returns-minus-one.js @@ -27,11 +27,11 @@ var fromIndex = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.indexOf(0n), -1, "returns -1"); assert.sameValue( sample.indexOf(0n, fromIndex), -1, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js index c05fc647ad23..504bc19ed8e4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js @@ -36,8 +36,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.indexOf(undefined, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js index fd044fbd3f52..741d44b90d02 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js @@ -36,8 +36,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.indexOf(0, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer.js index 573ddc0c800e..1e01b6c5fd7b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.indexOf(0); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js index 53a8c4fca40b..b207ed95daff 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js @@ -27,11 +27,11 @@ var fromIndex = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.indexOf(0), -1, "returns -1"); assert.sameValue( sample.indexOf(0, fromIndex), -1, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer-during-fromIndex-returns-single-comma.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer-during-fromIndex-returns-single-comma.js index a84d1452159e..78107d27bda5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer-during-fromIndex-returns-single-comma.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer-during-fromIndex-returns-single-comma.js @@ -29,8 +29,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA([1n,2n,3n]); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg([1n,2n,3n])); const separator = { toString() { $DETACHBUFFER(sample.buffer); @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.join(separator), ',,'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer.js index c5b584c31eba..2e74fd5b995d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/detached-buffer.js @@ -24,10 +24,10 @@ let obj = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - let sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + let sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, () => { sample.join(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/empty-instance-empty-string.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/empty-instance-empty-string.js index c0638c4de873..c709334d6f4f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/empty-instance-empty-string.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/empty-instance-empty-string.js @@ -21,9 +21,9 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.join(), ""); assert.sameValue(sample.join("test262"), ""); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator-symbol.js index 0bfcc1b17a9a..f3cc194015a6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator-symbol.js @@ -23,10 +23,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol(""); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.join(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator.js index 7ea61bd4deaf..640e7a377bd6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/BigInt/return-abrupt-from-separator.js @@ -27,10 +27,10 @@ var obj = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.join(obj); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js index d89d65b5c601..3fe586684335 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js @@ -31,8 +31,8 @@ features: [TypedArray] var arr = [-2, Infinity, NaN, -Infinity, 0.6, 9007199254740992]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); var result, separator, expected; separator = ","; @@ -132,4 +132,4 @@ testWithTypedArrayConstructors(function(TA) { }).join(separator); result = sample.join(separator); assert.sameValue(result, expected, "using: " + separator); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer-during-fromIndex-returns-single-comma.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer-during-fromIndex-returns-single-comma.js index c44a154e0863..a9a329a677a7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer-during-fromIndex-returns-single-comma.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer-during-fromIndex-returns-single-comma.js @@ -29,8 +29,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA([1,2,3]); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg([1,2,3])); const separator = { toString() { $DETACHBUFFER(sample.buffer); @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.join(separator), ',,'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer.js index 104b20cd4091..c741b8fb85e6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/detached-buffer.js @@ -24,10 +24,10 @@ let obj = { } }; -testWithTypedArrayConstructors(function(TA) { - let sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + let sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, () => { sample.join(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/empty-instance-empty-string.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/empty-instance-empty-string.js index 5bee678817f2..3b3902132cb2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/empty-instance-empty-string.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/empty-instance-empty-string.js @@ -21,9 +21,9 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.join(), ""); assert.sameValue(sample.join("test262"), ""); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js index 140967881569..a517201d917d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js @@ -30,8 +30,8 @@ features: [TypedArray] var arr = [-2, Infinity, NaN, -Infinity, 0.6, 9007199254740992]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); // Use converted values using Array methods as helpers var expected = arr.map(function(_, i) { @@ -41,4 +41,4 @@ testWithTypedArrayConstructors(function(TA) { var result = sample.join(); assert.sameValue(result, expected); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator-symbol.js index a1df649ca0e9..6e930d5b1f7a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator-symbol.js @@ -23,10 +23,10 @@ features: [Symbol, TypedArray] var s = Symbol(""); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.join(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js b/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js index 0a64c53808a3..ddb5bf3834e5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js @@ -27,10 +27,10 @@ var obj = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.join(obj); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/detached-buffer.js index 425f729620c7..9e0a2d9b056b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.keys(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/return-itor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/return-itor.js index e1d9db19333e..47698c1f2e91 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/return-itor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/BigInt/return-itor.js @@ -14,8 +14,8 @@ features: [BigInt, TypedArray] var sample = [0n, 42n, 64n]; -testWithBigIntTypedArrayConstructors(function(TA) { - var typedArray = new TA(sample); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var typedArray = new TA(makeCtorArg(sample)); var itor = typedArray.keys(); var next = itor.next(); @@ -33,4 +33,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { next = itor.next(); assert.sameValue(next.value, undefined); assert.sameValue(next.done, true); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/detached-buffer.js index 8c097b7ee1f2..72f53aa34bdf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.keys(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/return-itor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/return-itor.js index 4ea2460883e1..a88024629234 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/keys/return-itor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/keys/return-itor.js @@ -14,8 +14,8 @@ features: [TypedArray] var sample = [0, 42, 64]; -testWithTypedArrayConstructors(function(TA) { - var typedArray = new TA(sample); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var typedArray = new TA(makeCtorArg(sample)); var itor = typedArray.keys(); var next = itor.next(); @@ -33,4 +33,4 @@ testWithTypedArrayConstructors(function(TA) { next = itor.next(); assert.sameValue(next.value, undefined); assert.sameValue(next.done, true); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js index 807821f023f0..7ed8dbf32c31 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js @@ -33,8 +33,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.lastIndexOf(undefined, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js index f4ccfd286438..d47563cdb337 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js @@ -33,8 +33,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.lastIndexOf(0n, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer.js index 58c8f2c69e5e..ef74306fc126 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.lastIndexOf(0n); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/length-zero-returns-minus-one.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/length-zero-returns-minus-one.js index f8ba19915467..3500cc11009f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/length-zero-returns-minus-one.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/BigInt/length-zero-returns-minus-one.js @@ -27,11 +27,11 @@ var fromIndex = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.lastIndexOf(0), -1, "returns -1"); assert.sameValue( sample.lastIndexOf(0n, fromIndex), -1, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js index c49ada378e11..6172c23bbe5b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-undefined.js @@ -33,8 +33,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.lastIndexOf(undefined, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js index 120e9b818da6..9273b21fad66 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer-during-fromIndex-returns-minus-one-for-zero.js @@ -33,8 +33,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - const sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + const sample = new TA(makeCtorArg(1)); const fromIndex = { valueOf() { $DETACHBUFFER(sample.buffer); @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(sample.lastIndexOf(0, fromIndex), -1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js index 717f32e8b23b..c959b9258f60 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.lastIndexOf(0); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js index 6481759acc7a..574258158ef9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js @@ -27,11 +27,11 @@ var fromIndex = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.lastIndexOf(0), -1, "returns -1"); assert.sameValue( sample.lastIndexOf(0, fromIndex), -1, "length is checked before ToInteger(fromIndex)" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/length/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/length/BigInt/detached-buffer.js index 2a0a155fab46..e752b6f033eb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/length/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/length/BigInt/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(42); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(42)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.length, 0); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/length/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/length/detached-buffer.js index 9762092255c1..232cfe9ab3cd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/length/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/length/detached-buffer.js @@ -14,8 +14,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(42); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(42)); $DETACHBUFFER(sample.buffer); assert.sameValue(sample.length, 0); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/arraylength-internal.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/arraylength-internal.js index 6c5a599736b0..897a22fe7131 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/arraylength-internal.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/arraylength-internal.js @@ -41,5 +41,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return 0n; }); assert.sameValue(loop, 4, "accessor descriptor"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js index ded0928ab359..d09536931017 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js @@ -17,9 +17,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.map(function() { if (loops === 0) { @@ -30,4 +30,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-not-called-on-empty.js index 8f63f39c28c5..fb67cf404c1a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-not-called-on-empty.js @@ -17,12 +17,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().map(function() { + new TA(makeCtorArg(0)).map(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-change-instance.js index 4d3cd8b5f4ae..04a907c72a64 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-return-does-not-change-instance.js @@ -11,9 +11,7 @@ features: [BigInt, TypedArray] ---*/ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1n; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.map(function() { return 42n; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-set-value-during-interaction.js index dd275585d234..835888f7faa6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-set-value-during-interaction.js @@ -40,4 +40,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/detached-buffer.js index 76d39d558f56..b6626c658cba 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.map(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor-abrupt.js index dbe9cb5cf082..8e2eb553b991 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor-abrupt.js @@ -42,4 +42,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { }); }); assert.sameValue(callCount, 0, "callback should not be called"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor.js index f419827c62df..fb7983ed0dab 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-ctor.js @@ -51,4 +51,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species-abrupt.js index 2fb535f0d3fa..3d7a09c209e8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species-abrupt.js @@ -42,4 +42,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.map(function() { return 0n; }); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species.js index ad722cec7f6a..894a3b4eb2f1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/speciesctor-get-species.js @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.map(function() { return 0n; }); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/values-are-not-cached.js index 864817dca640..2b8bc35716d2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/BigInt/values-are-not-cached.js @@ -25,4 +25,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { return 0n; }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/arraylength-internal.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/arraylength-internal.js index 5c4430109d9f..9afaaf8bb221 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/arraylength-internal.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/arraylength-internal.js @@ -41,5 +41,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return 0; }); assert.sameValue(loop, 4, "accessor descriptor"); -}, null, ["passthrough"]); - +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js index a2bc89718926..1c6d829acaa9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js @@ -17,9 +17,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.map(function() { if (loops === 0) { @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js index 49949decf900..624d15fd5d88 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js @@ -17,12 +17,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().map(function() { + new TA(makeCtorArg(0)).map(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js index b881bee0b175..a16f3d04e559 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js @@ -11,9 +11,7 @@ features: [TypedArray] ---*/ testWithTypedArrayConstructors(function(TA, makeCtorArg) { - var sample1 = new TA(makeCtorArg(3)); - - sample1[1] = 1; + var sample1 = new TA(makeCtorArg(["0", "1", "0"])); sample1.map(function() { return 42; diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js index 97efe48f1eb3..111b353e17f4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js @@ -40,4 +40,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/detached-buffer.js index cc00481646dd..9dd098b47717 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.map(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-destination-backed-by-immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-destination-backed-by-immutable-buffer.js new file mode 100644 index 000000000000..78a791367e7e --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-destination-backed-by-immutable-buffer.js @@ -0,0 +1,75 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.map +description: > + Throws a TypeError exception when the receiver constructs an instance backed + by an immutable buffer +info: | + %TypedArray%.prototype.map ( callback [ , thisArg ] ) + 1. Let O be the this value. + 2. Let taRecord be ? ValidateTypedArray(O, seq-cst). + 3. Let len be TypedArrayLength(taRecord). + 4. If IsCallable(callback) is false, throw a TypeError exception. + 5. Let A be ? TypedArraySpeciesCreate(O, « 𝔽(len) », ~write~). + 6. Assert: IsImmutableBuffer(A.[[ViewedArrayBuffer]]) is false. + + TypedArraySpeciesCreate ( exemplar, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let defaultConstructor be the intrinsic object associated with the constructor name exemplar.[[TypedArrayName]] in Table 73. + 3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor). + 4. Let result be ? TypedArrayCreateFromConstructor(constructor, argumentList, accessMode). + + TypedArrayCreateFromConstructor ( constructor, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let newTypedArray be ? Construct(constructor, argumentList). + 3. Let taRecord be ? ValidateTypedArray(newTypedArray, seq-cst, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Symbol.species, TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2"])); + var iab = (new TA(["3", "4"])).buffer.transferToImmutable(); + var constructor = {}; + Object.defineProperty(ta, "constructor", { + get: function() { + calls.push("get ta.constructor"); + return constructor; + } + }); + Object.defineProperty(constructor, Symbol.species, { + get: function() { + calls.push("get ta.constructor[Symbol.species]"); + return function speciesCtor() { + calls.push("construct result"); + var result = new TA(iab); + calls.push("return result"); + return result; + }; + } + }); + + assert.throws(TypeError, function() { + ta.map(function(value, index) { + calls.push("map index " + index); + return value + value; + }); + }); + var expectCalls = [ + "get ta.constructor", + "get ta.constructor[Symbol.species]", + "construct result", + "return result" + ]; + assert.compareArray(calls, expectCalls, "Must construct the result before visiting elements."); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor-abrupt.js index af57566325d9..1785c6e1b1c2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor-abrupt.js @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { }); }); assert.sameValue(callCount, 0, "callback should not be called"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor.js index 7baee96aff33..ea9ba0f7a710 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-ctor.js @@ -51,4 +51,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species-abrupt.js index 0bb552550bee..1c03830ef428 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species-abrupt.js @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.map(function() { return 0; }); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species.js index b0f67c5750b9..8d06df752fe9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/speciesctor-get-species.js @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample.map(function() {}); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/map/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/map/values-are-not-cached.js index 91aee73a2789..ff674c26d68a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/map/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/map/values-are-not-cached.js @@ -25,4 +25,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { return 0; }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js index a525adf06fbd..e44cff48d153 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js @@ -26,9 +26,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.reduce(function() { if (loops === 0) { @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, 0); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-not-called-on-empty.js index d06bacd67dc4..4e46e868f300 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-not-called-on-empty.js @@ -28,12 +28,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().reduce(function() { + new TA(makeCtorArg(0)).reduce(function() { called++; }, undefined); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-set-value-during-iteration.js index d34c2b8c91f2..b3d0cebb39ae 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-set-value-during-iteration.js @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/detached-buffer.js index 5efbe4a86d8b..3381e3187e0f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.reduce(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-return-initialvalue.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-return-initialvalue.js index 97d68c270804..e4647e077169 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-return-initialvalue.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-return-initialvalue.js @@ -30,12 +30,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = false; - var result = new TA().reduce(function() { + var result = new TA(makeCtorArg(0)).reduce(function() { called = true; }, 42); assert.sameValue(result, 42); assert.sameValue(called, false); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-with-no-initialvalue-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-with-no-initialvalue-throws.js index 17a37f79259f..1e6dcf12efec 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-with-no-initialvalue-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/empty-instance-with-no-initialvalue-throws.js @@ -21,14 +21,15 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; + var ta = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { - new TA().reduce(function() { + ta.reduce(function() { called++; }); }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/values-are-not-cached.js index b7a6061745f2..9f866b86f491 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/BigInt/values-are-not-cached.js @@ -38,4 +38,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { v, 42n, "method does not cache values before callbackfn calls" ); }, 0); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js index dfc80fff398f..483f512857ea 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js @@ -26,9 +26,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.reduce(function() { if (loops === 0) { @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA) { }, 0); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js index 988ca67d0e45..290ece99c749 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js @@ -28,12 +28,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().reduce(function() { + new TA(makeCtorArg(0)).reduce(function() { called++; }, undefined); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js index a041518247d1..a8ab14d9fc66 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/detached-buffer.js index 133253fa1fb4..18617d2b01a0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.reduce(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js index b8c6dba5b4ce..8a2e697bface 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js @@ -30,12 +30,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = false; - var result = new TA().reduce(function() { + var result = new TA(makeCtorArg(0)).reduce(function() { called = true; }, 42); assert.sameValue(result, 42); assert.sameValue(called, false); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-with-no-initialvalue-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-with-no-initialvalue-throws.js index fd902fd1f08a..1181bbedc983 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-with-no-initialvalue-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/empty-instance-with-no-initialvalue-throws.js @@ -21,14 +21,15 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; + var ta = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { - new TA().reduce(function() { + ta.reduce(function() { called++; }); }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/values-are-not-cached.js index c3a82924fe99..031983b8290a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduce/values-are-not-cached.js @@ -38,4 +38,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { v, 42, "method does not cache values before callbackfn calls" ); }, 0); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js index d25ffa51d0f2..ed395786eebc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js @@ -26,9 +26,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.reduceRight(function() { if (loops === 0) { @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, 0); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-not-called-on-empty.js index 3dec96ab450d..ca4049f618dc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-not-called-on-empty.js @@ -29,12 +29,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().reduceRight(function() { + new TA(makeCtorArg(0)).reduceRight(function() { called++; }, undefined); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-set-value-during-iteration.js index 9963bec62125..e7ff0179b09a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-set-value-during-iteration.js @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 2n, "changed values after iteration [0] == 2"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 7n, "changed values after iteration [2] == 7"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/detached-buffer.js index 3bad2c54ed62..f519ea122ccb 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.reduceRight(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-return-initialvalue.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-return-initialvalue.js index 7a066ea9303a..7380c6b09e2b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-return-initialvalue.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-return-initialvalue.js @@ -31,12 +31,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = false; - var result = new TA().reduceRight(function() { + var result = new TA(makeCtorArg(0)).reduceRight(function() { called = true; }, 42); assert.sameValue(result, 42); assert.sameValue(called, false); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-with-no-initialvalue-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-with-no-initialvalue-throws.js index 51d935963868..d5ff1b3d156f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-with-no-initialvalue-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/empty-instance-with-no-initialvalue-throws.js @@ -21,14 +21,15 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; + var ta = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { - new TA().reduceRight(function() { + ta.reduceRight(function() { called++; }); }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/values-are-not-cached.js index 0d39a9984c31..421feff4dfa3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/values-are-not-cached.js @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { v, 42n, "method does not cache values before callbackfn calls" ); }, 0); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js index c6f517c5ec91..eae63b762b63 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js @@ -26,9 +26,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.reduceRight(function() { if (loops === 0) { @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA) { }, 0); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js index ce7443ce2b5c..3efc294cabc8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js @@ -29,12 +29,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().reduceRight(function() { + new TA(makeCtorArg(0)).reduceRight(function() { called++; }, undefined); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js index d7279b5db34e..105a8150bdd8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 2, "changed values after iteration [0] == 2"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 7, "changed values after iteration [2] == 7"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/detached-buffer.js index 1270aed0678a..320972a2b85f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/detached-buffer.js @@ -29,4 +29,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.reduceRight(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js index 512b3f77ef9a..b39670290d7c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js @@ -31,12 +31,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = false; - var result = new TA().reduceRight(function() { + var result = new TA(makeCtorArg(0)).reduceRight(function() { called = true; }, 42); assert.sameValue(result, 42); assert.sameValue(called, false); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-with-no-initialvalue-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-with-no-initialvalue-throws.js index e0b9a72c3c13..7d387c6c561f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-with-no-initialvalue-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/empty-instance-with-no-initialvalue-throws.js @@ -21,14 +21,15 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; + var ta = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { - new TA().reduceRight(function() { + ta.reduceRight(function() { called++; }); }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js index 3d0a5519a42e..be5eb0808694 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { v, 42, "method does not cache values before callbackfn calls" ); }, 0); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/detached-buffer.js index ddf7fee94aa4..6d577a080f94 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.reverse(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/preserves-non-numeric-properties.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/preserves-non-numeric-properties.js index 2a663668ee2d..70402a3b3a9a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/preserves-non-numeric-properties.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/BigInt/preserves-non-numeric-properties.js @@ -32,4 +32,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(result.foo, 42, "sample.foo === 42"); assert.sameValue(result.bar, "bar", "sample.bar === 'bar'"); assert.sameValue(result[s], 1, "sample[s] === 1"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/detached-buffer.js index f21ca1509b70..544f09686306 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.reverse(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/immutable-buffer.js new file mode 100644 index 000000000000..4e241ede5f77 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/immutable-buffer.js @@ -0,0 +1,28 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.reverse +description: Throws a TypeError exception when the backing buffer is immutable +info: | + %TypedArray%.prototype.reverse ( ) + 1. Let O be the this value. + 2. Let taRecord be ? ValidateTypedArray(O, ~seq-cst~, ~write~). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + + assert.throws(TypeError, function() { + ta.reverse(); + }); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), "Must not mutate contents."); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js index 0632ed701f34..00efdaaceb9b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js @@ -32,4 +32,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(result.foo, 42, "sample.foo === 42"); assert.sameValue(result.bar, "bar", "sample.bar === 'bar'"); assert.sameValue(result[s], 1, "sample[s] === 1"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-negative-integer-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-negative-integer-offset-throws.js index 59f835b1ecc9..2d562409d4e5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-negative-integer-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-negative-integer-offset-throws.js @@ -32,4 +32,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(RangeError, function() { sample.set([1n], -Infinity); }, "-Infinity"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-offset-tointeger.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-offset-tointeger.js index 7881ec2f5f92..763b727f3b05 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-offset-tointeger.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-offset-tointeger.js @@ -92,4 +92,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([1n, 2n])); sample.set([42n], { toString: function() {return 1;} }); assert(compareArray(sample, [1n, 42n]), "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-primitive-toobject.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-primitive-toobject.js index ef43f7c6ab5c..4dcae955b028 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-primitive-toobject.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-primitive-toobject.js @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var ta5 = new TA(makeCtorArg([1n, 2n])); ta5.set(4n, 1); assert.compareArray(ta5, [1n, 2n], "bigint"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-length.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-length.js index 64f45d844242..f975d8444722 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-length.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-length.js @@ -30,4 +30,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.set(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-value.js index eeba8b5909b5..78a40ef0a01e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-get-value.js @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42n, 43n, 3n, 4n]), "values are set until exception" ); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length-symbol.js index 7ec8091334e7..4e9607d121e0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length-symbol.js @@ -27,4 +27,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set(obj); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length.js index 2ae67acf4751..2351f646dd0e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-length.js @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.set(obj2); }, "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value-symbol.js index c0bff8ccc680..6003013e8764 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value-symbol.js @@ -41,4 +41,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42n, 43n, 3n, 4n]), "values are set until exception" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value.js index a2f07e27de21..92d4f232e3c3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-src-tonumber-value.js @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42n, 43n, 3n, 4n]), "values are set until exception" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset-symbol.js index 3eebeace70cb..d7294c6b0269 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset-symbol.js @@ -24,4 +24,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set([1n], s); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset.js index bda1b0e6edc0..1c75869170e9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-tointeger-offset.js @@ -28,8 +28,8 @@ var obj2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.set([], obj1); @@ -38,4 +38,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.set([], obj2); }, "abrupt from toString"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-toobject-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-toobject-offset.js index 9c3215c13a83..bed306ceb09e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-toobject-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-return-abrupt-from-toobject-offset.js @@ -27,4 +27,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set(null); }, "null"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values-in-order.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values-in-order.js index 9b6df38959d9..6a95539cfc30 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values-in-order.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values-in-order.js @@ -69,4 +69,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(calls, [0, "0,0,0,0,0", 1, "0,42,0,0,0", 2, "0,42,43,0,0"]), "values are set in order" ); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values.js index 5386252f0e8b..898af13bd6b5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-set-values.js @@ -60,4 +60,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(srcObj, 2); assert(compareArray(sample, [1n, 2n, 7n, 17n]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-tonumber-value-type-conversions.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-tonumber-value-type-conversions.js index 2a4daedc18a6..aabe13fbea26 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-tonumber-value-type-conversions.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-tonumber-value-type-conversions.js @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, expected), "sample: [" + sample + "], expected: [" + expected + "]" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-values-are-not-cached.js index 239c5dfee9f5..b03f16fb4f5e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-src-values-are-not-cached.js @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.set(obj); assert(compareArray(sample, [42n, 43n, 44n, 45n, 46n])); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js index b6bc54d4995a..522209ebfb98 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js @@ -21,8 +21,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-throws.js index e90286fabffc..b59911ca667d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-throws.js @@ -29,8 +29,8 @@ Object.defineProperty(obj, "length", { } }); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { @@ -40,4 +40,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.set(obj); }, "IsDetachedBuffer happens before Get(src.length)"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/boolean-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/boolean-tobigint.js index 145acd501a52..171c667be384 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/boolean-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/boolean-tobigint.js @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(typedArray[0], 0n, "False converts to BigInt"); assert.sameValue(typedArray[1], 1n, "True converts to BigInt"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/null-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/null-tobigint.js index 2607350f8899..7285917ae47a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/null-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/null-tobigint.js @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set([null]); }, "abrupt completion from Null"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/number-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/number-tobigint.js index c232e62a955c..c0985c79b68e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/number-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/number-tobigint.js @@ -69,4 +69,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set([NaN]); }, "abrupt completion from Number: NaN"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-big.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-big.js index ffa2014fc3b4..602850731589 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-big.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-big.js @@ -34,5 +34,5 @@ testWithBigIntTypedArrayConstructors(function(BTA1, makeCtorArg) { assert.sameValue(targetTypedArray[0], testValue, "Setting BigInt TypedArray with BigInt TypedArray should succeed.") }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-not-big-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-not-big-throws.js index 94a148d60846..824e9df2825c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-not-big-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/src-typedarray-not-big-throws.js @@ -34,4 +34,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { }); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-nan-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-nan-tobigint.js index 1eb65b55272d..c26fb44a24b4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-nan-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-nan-tobigint.js @@ -47,4 +47,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set(["definately not a number"]); }, "StringToBigInt(prim) == NaN"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-tobigint.js index c1ade89f3a0b..c31a7a37b5cd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/string-tobigint.js @@ -63,4 +63,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set(["1e7"]); }, "Replace the StrUnsignedDecimalLiteral production with DecimalDigits to not allow... exponents..."); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/symbol-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/symbol-tobigint.js index ea11e3f658f4..dafea15a6d2f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/symbol-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/symbol-tobigint.js @@ -47,4 +47,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set([s]); }, "abrupt completion from Symbol"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-negative-integer-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-negative-integer-offset-throws.js index 010aeb6c100f..93e8dd0d9272 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-negative-integer-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-negative-integer-offset-throws.js @@ -16,8 +16,8 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(RangeError, function() { sample.set(sample, -1); @@ -30,4 +30,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(RangeError, function() { sample.set(sample, -Infinity); }, "-Infinity"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-offset-tointeger.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-offset-tointeger.js index 57c0f8400e6f..3341e2c208af 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-offset-tointeger.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-offset-tointeger.js @@ -90,4 +90,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([1n, 2n])); sample.set(src, { toString: function() {return 1;} }); assert(compareArray(sample, [1n, 42n]), "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js index 975f32e0179b..ce039bab60bc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js @@ -17,10 +17,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol("1"); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.set(sample, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset.js index 9b8daee83ed5..92dd0e0851e1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-return-abrupt-from-tointeger-offset.js @@ -27,8 +27,8 @@ var obj2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.set(sample, obj1); @@ -37,4 +37,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.set(sample, obj2); }, "abrupt from toString"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type-sab.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type-sab.js index 658bd816ea36..4256ed9da3a5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type-sab.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type-sab.js @@ -101,4 +101,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1n, 2n, 42n, 43n]), "src and sample are SAB-backed, offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type.js index b827fae6cbc0..c2b3fa9e4dc4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-other-type.js @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1n, 2n, 42n, 43n]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type-sab.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type-sab.js index 359c874d7beb..ab1da824e553 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type-sab.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type-sab.js @@ -101,4 +101,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1n, 2n, 42n, 43n]), "src and sample are SAB-backed, offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type.js index e769cb25669d..b0f26dc38768 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-diff-buffer-same-type.js @@ -47,4 +47,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1n, 2n, 42n, 43n]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-same-buffer-same-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-same-buffer-same-type.js index 277cbc462525..d1ae10702f73 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-same-buffer-same-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-set-values-same-buffer-same-type.js @@ -50,4 +50,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1n, 2n, 1n, 2n]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js index 9a6edd04bc94..12ccbc10181d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js @@ -48,4 +48,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(RangeError, function() { sample.set(src, Infinity); }, "2 + Infinity > 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js index 8f46df093d1f..07ce1269ea23 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js @@ -20,9 +20,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(); - var target = new TA(); + var target = new TA(makeCtorArg(0)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-byteoffset-internal.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-byteoffset-internal.js index 9fc4b311cda6..048058079d64 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-byteoffset-internal.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-byteoffset-internal.js @@ -41,4 +41,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.set(src3); assert.sameValue(getCalls, 0, "ignores byteoffset properties"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js index 3a486f448ad4..7c69b09d3cc8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js @@ -20,9 +20,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); - var src = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); + var src = new TA(makeCtorArg(1)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/undefined-tobigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/undefined-tobigint.js index 40baab50cbab..f11e3fbd3fb5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/undefined-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/undefined-tobigint.js @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray.set([undefined]); }, "abrupt completion from undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-negative-integer-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-negative-integer-offset-throws.js index 90530ac7dfdf..a8e024167404 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-negative-integer-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-negative-integer-offset-throws.js @@ -32,4 +32,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(RangeError, function() { sample.set([1], -Infinity); }, "-Infinity"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-offset-tointeger.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-offset-tointeger.js index fcbb913775d9..2e4913dc1ed0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-offset-tointeger.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-offset-tointeger.js @@ -92,4 +92,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([1, 2])); sample.set([42], { toString: function() {return 1;} }); assert(compareArray(sample, [1, 42]), "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-primitive-toobject.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-primitive-toobject.js index e397b8d7b9bd..e3abbd85ee81 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-primitive-toobject.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-primitive-toobject.js @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { var ta4 = new TA(makeCtorArg([1])); ta4.set(Symbol()); assert.compareArray(ta4, [1], "symbol"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js index 495fa07f2d70..bd927773222b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-length.js @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.set(obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-value.js index 5cd057e7223b..2bb8ed9f163b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-get-value.js @@ -45,4 +45,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42, 43, 3, 4]), "values are set until exception" ); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length-symbol.js index c2136b4c1188..d1ed8e8ab3c3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length-symbol.js @@ -27,4 +27,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set(obj); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length.js index 6797a63e388c..d87acdb00622 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-length.js @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.set(obj2); }, "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value-symbol.js index 3b7b921da337..1a6ed01e39cc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value-symbol.js @@ -41,4 +41,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42, 43, 3, 4]), "values are set until exception" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value.js index 2f7572c5d5f1..0f0215ff929d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-src-tonumber-value.js @@ -45,4 +45,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [42, 43, 3, 4]), "values are set until exception" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset-symbol.js index c3bb22083ba0..134526a67dca 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset-symbol.js @@ -24,4 +24,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set([1], s); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset.js index c6cbd4161111..62828368034f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-tointeger-offset.js @@ -28,8 +28,8 @@ var obj2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.set([], obj1); @@ -38,4 +38,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.set([], obj2); }, "abrupt from toString"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-toobject-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-toobject-offset.js index 75f063a67620..3da0ffd36b1c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-toobject-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-return-abrupt-from-toobject-offset.js @@ -27,4 +27,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.set(null); }, "null"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js index cc28f1ef742f..741799dcf024 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js @@ -69,4 +69,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(calls, [0, "0,0,0,0,0", 1, "0,42,0,0,0", 2, "0,42,43,0,0"]), "values are set in order" ); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values.js index cd9308e5b130..b0e0ba19d041 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-set-values.js @@ -60,4 +60,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(srcObj, 2); assert(compareArray(sample, [1, 2, 7, 17]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-tonumber-value-type-conversions.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-tonumber-value-type-conversions.js index 9013cdf89e96..ffc3cafede8c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-tonumber-value-type-conversions.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-tonumber-value-type-conversions.js @@ -46,4 +46,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, expected), "sample: [" + sample + "], expected: [" + expected + "]" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-values-are-not-cached.js index 9489cf8a7eb0..e84f91f68199 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-src-values-are-not-cached.js @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample.set(obj); assert(compareArray(sample, [42, 43, 44, 45, 46])); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js index a97247753335..b8a045689b3e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js @@ -8,8 +8,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA([1, 2, 3]); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg([1, 2, 3])); var obj = { length: 3, "0": 42 @@ -33,4 +33,4 @@ testWithTypedArrayConstructors(function(TA) { assert.sameValue(0, sample.byteLength); assert.sameValue(0, sample.byteOffset); assert.sameValue(0, sample.length); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js index a59b405d0890..0d4e8ebda42a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js @@ -21,8 +21,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js index a23a66fcee20..705d60ed0200 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js @@ -29,8 +29,8 @@ Object.defineProperty(obj, "length", { } }); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { @@ -40,4 +40,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(TypeError, function() { sample.set(obj); }, "IsDetachedBuffer happens before Get(src.length)"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/bit-precision.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/bit-precision.js index 10cda3446624..86af442f4f9e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/bit-precision.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/bit-precision.js @@ -19,8 +19,8 @@ includes: [nans.js, compareArray.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function body(FA) { - var source = new FA(NaNs); +testWithTypedArrayConstructors(function body(FA, makeCtorArg) { + var source = new FA(makeCtorArg(NaNs)); var target = new FA(NaNs.length); var sourceBytes, targetBytes; @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function body(FA) { targetBytes = new Uint8Array(target.buffer); assert(compareArray(sourceBytes, targetBytes)) -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/immutable-buffer.js new file mode 100644 index 000000000000..c4d1db5d1fb8 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/immutable-buffer.js @@ -0,0 +1,45 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.set +description: Throws a TypeError exception when the backing buffer is immutable +info: | + %TypedArray%.prototype.set ( source [ , offset ] ) + 1. Let target be the this value. + ... + 3. Perform ? RequireInternalSlot(target, [[TypedArrayName]]). + 4. Assert: target has a [[ViewedArrayBuffer]] internal slot. + 5. If IsImmutableBuffer(target.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. + 6. Let targetOffset be ? ToIntegerOrInfinity(offset). +features: [TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + var source = { + get length() { + calls.push("get source.length"); + return 1; + }, + get 0() { + calls.push("get source[0]"); + return "8"; + }, + }; + var offset = { + valueOf() { + calls.push("offset.valueOf"); + return 1; + } + }; + + assert.throws(TypeError, function() { + ta.set(source, offset); + }); + assert.compareArray(calls, [], "Must verify mutability before reading arguments."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), "Must not mutate contents."); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/src-typedarray-big-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/src-typedarray-big-throws.js index 096204e90c3d..1241ae22342d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/src-typedarray-big-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/src-typedarray-big-throws.js @@ -34,4 +34,4 @@ testWithBigIntTypedArrayConstructors(function(BTA, makeCtorArg) { }); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-negative-integer-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-negative-integer-offset-throws.js index 7f66f9242cd7..58746ad3a171 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-negative-integer-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-negative-integer-offset-throws.js @@ -16,8 +16,8 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(RangeError, function() { sample.set(sample, -1); @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(RangeError, function() { sample.set(sample, -Infinity); }, "-Infinity"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-offset-tointeger.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-offset-tointeger.js index 31c6b0e48e9b..75fc5dd2b9bd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-offset-tointeger.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-offset-tointeger.js @@ -90,4 +90,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([1, 2])); sample.set(src, { toString: function() {return 1;} }); assert(compareArray(sample, [1, 42]), "toString"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js index 485a5c19cff9..54b97091c6bd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset-symbol.js @@ -17,10 +17,10 @@ features: [Symbol, TypedArray] var s = Symbol("1"); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.set(sample, s); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset.js index 09f4b666c23d..14cf81ab2562 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-return-abrupt-from-tointeger-offset.js @@ -27,8 +27,8 @@ var obj2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.set(sample, obj1); @@ -37,4 +37,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.set(sample, obj2); }, "abrupt from toString"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type-sab.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type-sab.js index 00a8e90ebdc3..f1be34eff243 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type-sab.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type-sab.js @@ -104,4 +104,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1, 2, 42, 43]), "src and sample are SAB-backed, offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}, int_views); +}, int_views, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type.js index 9a10d8a29bc3..3f39010c1721 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-other-type.js @@ -45,4 +45,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1, 2, 42, 43]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type-sab.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type-sab.js index 1158f7652eff..fd01d5f5de72 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type-sab.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type-sab.js @@ -104,4 +104,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1, 2, 42, 43]), "src and sample are SAB-backed, offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}, int_views); +}, int_views, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type.js index f82d316f0d69..1ff070cc1ce1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-diff-buffer-same-type.js @@ -47,4 +47,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1, 2, 42, 43]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js index 864da2c22e23..f625ebced7f2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-other-type.js @@ -57,4 +57,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert(compareArray(sample, expected[TA.name]), sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-same-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-same-type.js index bf15d65cece4..e5706a4148ab 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-same-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-set-values-same-buffer-same-type.js @@ -50,4 +50,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.set(src, 2); assert(compareArray(sample, [1, 2, 1, 2]), "offset: 2, result: " + sample); assert.sameValue(result, undefined, "returns undefined"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js index a592458dd11b..2c09495e5356 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-src-range-greather-than-target-throws-rangeerror.js @@ -48,4 +48,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(RangeError, function() { sample.set(src, Infinity); }, "2 + Infinity > 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js index f470b1eb4964..b1b45b05cfdd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js @@ -20,9 +20,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(); - var target = new TA(); + var target = new TA(makeCtorArg(0)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js index 2dfd361cda0c..3ecb08eeb4d1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js @@ -20,9 +20,9 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); - var src = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); + var src = new TA(makeCtorArg(1)); var calledOffset = 0; var obj = { valueOf: function() { @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(calledOffset, 1); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-other-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-other-targettype.js index e282d4159176..2e84ed5f648e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-other-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-other-targettype.js @@ -31,15 +31,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - var sample = new TA(1); + var sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { var other = TA === BigInt64Array ? BigUint64Array : BigInt64Array; - counter++; $DETACHBUFFER(sample.buffer); + counter++; return new other(count); }; @@ -49,4 +49,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-same-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-same-targettype.js index 02ef04db075f..4c9a80c9110f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-same-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-custom-ctor-same-targettype.js @@ -31,15 +31,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { - counter++; $DETACHBUFFER(sample.buffer); - return new TA(count); + counter++; + return new TA(makeCtorArg(count)); }; assert.throws(TypeError, function() { @@ -48,4 +48,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-get-ctor.js index 44e0f109af3a..f52a353d27fe 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-get-ctor.js @@ -31,14 +31,14 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); Object.defineProperty(sample, "constructor", { get() { - counter++; $DETACHBUFFER(sample.buffer); + counter++; } }); assert.throws(TypeError, function() { @@ -47,4 +47,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-speciesctor-get-species-custom-ctor-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-speciesctor-get-species-custom-ctor-throws.js index 11e70b69d456..d06b74346b03 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-speciesctor-get-species-custom-ctor-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-speciesctor-get-species-custom-ctor-throws.js @@ -30,15 +30,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { let other = new TA(count); - counter++; $DETACHBUFFER(other.buffer); + counter++; return other; }; @@ -48,4 +48,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-other-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-other-targettype.js index d2000c97e2be..4c9b184e899b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-other-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-other-targettype.js @@ -17,19 +17,19 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; let sample, result, Other, other; let ctor = {}; ctor[Symbol.species] = function(count) { - counter++; Other = TA === BigInt64Array ? BigUint64Array : BigInt64Array; $DETACHBUFFER(sample.buffer); + counter++; other = new Other(count); return other; }; - sample = new TA(0); + sample = new TA(makeCtorArg(0)); sample.constructor = ctor; result = sample.slice(); assert.sameValue(result.length, 0, 'The value of result.length is 0'); @@ -38,8 +38,8 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.sameValue(result, other, 'The value of `result` is expected to equal the value of other'); assert.sameValue(counter, 1, 'The value of `counter` is 1'); - sample = new TA(4); + sample = new TA(makeCtorArg(4)); sample.constructor = ctor; sample.slice(1, 1); // count = 0; assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-same-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-same-targettype.js index 28b42831038f..e81f32030805 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-same-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer-zero-count-custom-ctor-same-targettype.js @@ -16,18 +16,18 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, BigInt, Symbol.species, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; let sample, result, other; let ctor = {}; ctor[Symbol.species] = function(count) { - counter++; $DETACHBUFFER(sample.buffer); - other = new TA(count); + counter++; + other = new TA(makeCtorArg(count)); return other; }; - sample = new TA(0); + sample = new TA(makeCtorArg(0)); sample.constructor = ctor; result = sample.slice(); assert.sameValue(result.length, 0, 'The value of result.length is 0'); @@ -35,7 +35,7 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.sameValue(result, other, 'The value of `result` is expected to equal the value of other'); assert.sameValue(counter, 1, 'The value of `counter` is 1'); - sample = new TA(4); + sample = new TA(makeCtorArg(4)); sample.constructor = ctor; result = sample.slice(1, 1); // count = 0; assert.sameValue(result.length, 0, 'The value of result.length is 0'); @@ -46,4 +46,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { ); assert.sameValue(result.constructor, TA, 'The value of result.constructor is expected to equal the value of TA'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer.js index 6a1505a68329..d27e10bf15e4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/detached-buffer.js @@ -24,10 +24,10 @@ var obj = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.slice(obj, obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end-symbol.js index 4ededf13d947..5fa95cde5536 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end-symbol.js @@ -16,10 +16,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol("1"); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.slice(0, s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end.js index 92b322d45e21..ac95ebfde0bc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-end.js @@ -26,8 +26,8 @@ var o2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.slice(0, o1); @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.slice(0, o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start-symbol.js index 39aeda0c7c4d..9294630901d8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start-symbol.js @@ -15,10 +15,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol("1"); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.slice(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start.js index 031693a8310f..34f9cff342b3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/return-abrupt-from-start.js @@ -25,8 +25,8 @@ var o2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.slice(o1); @@ -35,4 +35,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.slice(o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/set-values-from-different-ctor-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/set-values-from-different-ctor-type.js index 59a8f98fbb3b..03617c64a27a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/set-values-from-different-ctor-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/set-values-from-different-ctor-type.js @@ -32,8 +32,8 @@ features: [BigInt, Symbol.species, TypedArray] var arr = [42n, 43n, 44n]; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); var other = TA === BigInt64Array ? BigUint64Array : BigInt64Array; sample.constructor = {}; @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert(compareArray(result, arr), "values are set"); assert.notSameValue(result.buffer, sample.buffer, "creates a new buffer"); assert.sameValue(result.constructor, other, "used the custom ctor"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor-abrupt.js index 7ff0f281b382..14f0026f174a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor-abrupt.js @@ -38,4 +38,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.slice(); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor.js index ff4c3a55700a..13c3a3ba4ff0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-ctor.js @@ -51,4 +51,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species-abrupt.js index 615e9c93174c..da0fda3ee208 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species-abrupt.js @@ -42,4 +42,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.slice(); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species.js index 199fb6d27522..0e708d569683 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/BigInt/speciesctor-get-species.js @@ -43,4 +43,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.slice(); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-other-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-other-targettype.js index 55d3d3af75dd..b8348bb1f1fa 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-other-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-other-targettype.js @@ -17,15 +17,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - var sample = new TA(1); + var sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { var other = TA === Int8Array ? Int16Array : Int8Array; - counter++; $DETACHBUFFER(sample.buffer); + counter++; return new other(count); }; @@ -35,4 +35,4 @@ testWithTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-same-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-same-targettype.js index 83eb3abd95ad..67457b2c87b4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-same-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-custom-ctor-same-targettype.js @@ -15,15 +15,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { - counter++; $DETACHBUFFER(sample.buffer); - return new TA(count); + counter++; + return new TA(makeCtorArg(count)); }; assert.throws(TypeError, function() { @@ -32,4 +32,4 @@ testWithTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-get-ctor.js index 2b37e0813843..131f01410ace 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-get-ctor.js @@ -15,14 +15,14 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); Object.defineProperty(sample, "constructor", { get() { - counter++; $DETACHBUFFER(sample.buffer); + counter++; } }); assert.throws(TypeError, function() { @@ -31,4 +31,4 @@ testWithTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-speciesctor-get-species-custom-ctor-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-speciesctor-get-species-custom-ctor-throws.js index d8abf5034b17..60349317faaa 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-speciesctor-get-species-custom-ctor-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-speciesctor-get-species-custom-ctor-throws.js @@ -30,15 +30,15 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; - let sample = new TA(1); + let sample = new TA(makeCtorArg(1)); sample.constructor = {}; sample.constructor[Symbol.species] = function(count) { let other = new TA(count); - counter++; $DETACHBUFFER(other.buffer); + counter++; return other; }; @@ -48,4 +48,4 @@ testWithTypedArrayConstructors(function(TA) { }, '`sample.slice()` throws TypeError'); assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js index 1b778ec473e8..23f7e612a950 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js @@ -17,19 +17,19 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; let sample, result, Other, other; let ctor = {}; ctor[Symbol.species] = function(count) { - counter++; Other = TA === Int16Array ? Int8Array : Int16Array; $DETACHBUFFER(sample.buffer); + counter++; other = new Other(count); return other; }; - sample = new TA(0); + sample = new TA(makeCtorArg(0)); sample.constructor = ctor; result = sample.slice(); assert.sameValue(result.length, 0, 'The value of result.length is 0'); @@ -38,8 +38,8 @@ testWithTypedArrayConstructors(function(TA) { assert.sameValue(result, other, 'The value of `result` is expected to equal the value of other'); assert.sameValue(counter, 1, 'The value of `counter` is 1'); - sample = new TA(4); + sample = new TA(makeCtorArg(4)); sample.constructor = ctor; sample.slice(1, 1); // count = 0; assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js index f996487df9f5..5fd7ff35cda4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js @@ -16,18 +16,18 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [align-detached-buffer-semantics-with-web-reality, Symbol.species, TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { let counter = 0; let sample, result, other; let ctor = {}; ctor[Symbol.species] = function(count) { - counter++; $DETACHBUFFER(sample.buffer); - other = new TA(count); + counter++; + other = new TA(makeCtorArg(count)); return other; }; - sample = new TA(0); + sample = new TA(makeCtorArg(0)); sample.constructor = ctor; result = sample.slice(); assert.sameValue(result.length, 0, 'The value of result.length is 0'); @@ -35,8 +35,8 @@ testWithTypedArrayConstructors(function(TA) { assert.sameValue(result, other, 'The value of `result` is expected to equal the value of other'); assert.sameValue(counter, 1, 'The value of `counter` is 1'); - sample = new TA(4); + sample = new TA(makeCtorArg(4)); sample.constructor = ctor; sample.slice(1, 1); // count = 0; assert.sameValue(counter, 2, 'The value of `counter` is 2'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer.js index bbbb576f36d9..d319836b2b98 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/detached-buffer.js @@ -24,10 +24,10 @@ var obj = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.slice(obj, obj); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end-symbol.js index 7c3fe8f77167..8245a0c195e5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end-symbol.js @@ -16,10 +16,10 @@ features: [Symbol, TypedArray] var s = Symbol("1"); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.slice(0, s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js index 58c6a54739f5..941ef6f38d3e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js @@ -26,8 +26,8 @@ var o2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.slice(0, o1); @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.slice(0, o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start-symbol.js index 0dbf1fee6dc9..a88f1101a9d5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start-symbol.js @@ -15,10 +15,10 @@ features: [Symbol, TypedArray] var s = Symbol("1"); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.slice(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js index 57c78ef133bc..170164f5fc0d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js @@ -25,8 +25,8 @@ var o2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.slice(o1); @@ -35,4 +35,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.slice(o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js index e160e456345a..be479b5924ff 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js @@ -32,8 +32,8 @@ features: [Symbol.species, TypedArray] var arr = [42, 43, 44]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); var other = TA === Int8Array ? Uint8Array : Int8Array; sample.constructor = {}; @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA) { assert(compareArray(result, arr), "values are set"); assert.notSameValue(result.buffer, sample.buffer, "creates a new buffer"); assert.sameValue(result.constructor, other, "used the custom ctor"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-destination-backed-by-immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-destination-backed-by-immutable-buffer.js new file mode 100644 index 000000000000..de34ca54be17 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-destination-backed-by-immutable-buffer.js @@ -0,0 +1,95 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.slice +description: > + Throws a TypeError exception when the receiver constructs an instance backed + by an immutable buffer +info: | + %TypedArray%.prototype.slice ( start, end ) + 1. Let O be the this value. + 2. Let taRecord be ? ValidateTypedArray(O, seq-cst). + 3. Let srcArrayLength be TypedArrayLength(taRecord). + 4. Let relativeStart be ? ToIntegerOrInfinity(start). + 5. If relativeStart = -∞, let startIndex be 0. + 6. Else if relativeStart < 0, let startIndex be max(srcArrayLength + relativeStart, 0). + 7. Else, let startIndex be min(relativeStart, srcArrayLength). + 8. If end is undefined, let relativeEnd be srcArrayLength; else let relativeEnd be ? ToIntegerOrInfinity(end). + 9. If relativeEnd = -∞, let endIndex be 0. + 10. Else if relativeEnd < 0, let endIndex be max(srcArrayLength + relativeEnd, 0). + 11. Else, let endIndex be min(relativeEnd, srcArrayLength). + 12. Let countBytes be max(endIndex - startIndex, 0). + 13. Let A be ? TypedArraySpeciesCreate(O, « 𝔽(countBytes) », ~write~). + 14. Assert: IsImmutableBuffer(A.[[ViewedArrayBuffer]]) is false. + + TypedArraySpeciesCreate ( exemplar, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let defaultConstructor be the intrinsic object associated with the constructor name exemplar.[[TypedArrayName]] in Table 73. + 3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor). + 4. Let result be ? TypedArrayCreateFromConstructor(constructor, argumentList, accessMode). + + TypedArrayCreateFromConstructor ( constructor, argumentList [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to ~read~. + 2. Let newTypedArray be ? Construct(constructor, argumentList). + 3. Let taRecord be ? ValidateTypedArray(newTypedArray, seq-cst, accessMode). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [Symbol.species, TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2"])); + var iab = (new TA(["3", "4"])).buffer.transferToImmutable(); + var constructor = {}; + Object.defineProperty(ta, "constructor", { + get: function() { + calls.push("get ta.constructor"); + return constructor; + } + }); + Object.defineProperty(constructor, Symbol.species, { + get: function() { + calls.push("get ta.constructor[Symbol.species]"); + return function speciesCtor() { + calls.push("construct result"); + var result = new TA(iab); + calls.push("return result"); + return result; + }; + } + }); + + var start = { + valueOf() { + calls.push("start.valueOf"); + return 0; + } + }; + var end = { + valueOf() { + calls.push("end.valueOf"); + return 2; + } + }; + + assert.throws(TypeError, function() { + ta.slice(start, end); + }); + var expectCalls = [ + "start.valueOf", + "end.valueOf", + "get ta.constructor", + "get ta.constructor[Symbol.species]", + "construct result", + "return result" + ]; + assert.compareArray(calls, expectCalls, "Must read arguments before constructing the result."); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js index 66c57ef889ac..600bfd1c756a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js @@ -38,4 +38,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.slice(); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js index bdfd46e01410..5eada61fb2b0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js @@ -51,4 +51,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js index fe47fea383ca..8ec6ab7cd016 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.slice(); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species.js index bf6e20432e3e..14ed6903ca73 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-get-species.js @@ -43,4 +43,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample.slice(); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-return-same-buffer-with-offset.js b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-return-same-buffer-with-offset.js index 46cc8085eea1..d7770d1fb4b8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-return-same-buffer-with-offset.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/slice/speciesctor-return-same-buffer-with-offset.js @@ -17,19 +17,19 @@ info: | 1. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered). 2. Perform SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered). ... -features: [TypedArray] +features: [Symbol.species, TypedArray] includes: [testTypedArray.js, compareArray.js] ---*/ -testWithTypedArrayConstructors(function(TA) { - var ta = new TA([ +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var ta = new TA(makeCtorArg([ 10, 20, 30, 40, 50, 60, - ]); + ])); ta.constructor = { [Symbol.species]: function() { @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA) { assert.compareArray(result, [ 20, 20, 20, 60, ]); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js index 9aef470ec7c7..38c7b6b95d7e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.some(function() { if (loops === 0) { @@ -38,4 +38,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-not-called-on-empty.js index d05c270e47f7..8afc7dfb5cc9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().some(function() { + new TA(makeCtorArg(0)).some(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-set-value-during-interaction.js index 0ad4f3f96fbc..7b369155c38a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-set-value-during-interaction.js @@ -53,4 +53,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7n, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1n, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2n, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/detached-buffer.js index b7b84a165499..5be15e2dbd5f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.some(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/values-are-not-cached.js index 82d119629b6a..cab518f2556e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/BigInt/values-are-not-cached.js @@ -37,4 +37,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { v, 42n, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js index 35e1a91eacc5..74f63c1b18f7 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js @@ -25,9 +25,9 @@ includes: [detachArrayBuffer.js, testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var loops = 0; - var sample = new TA(2); + var sample = new TA(makeCtorArg(2)); sample.some(function() { if (loops === 0) { @@ -38,4 +38,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(loops, 2); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js index f90690b4e0a5..bdf59806f9e8 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js @@ -25,12 +25,12 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { var called = 0; - new TA().some(function() { + new TA(makeCtorArg(0)).some(function() { called++; }); assert.sameValue(called, 0); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js index 736fb7cdfcc9..dd673ff5064e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js @@ -53,4 +53,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[0], 7, "changed values after iteration [0] == 7"); assert.sameValue(sample[1], 1, "changed values after iteration [1] == 1"); assert.sameValue(sample[2], 2, "changed values after iteration [2] == 2"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/detached-buffer.js index 1ad6a7078b22..ef3d335c9143 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/detached-buffer.js @@ -23,10 +23,10 @@ var callbackfn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.some(callbackfn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/some/values-are-not-cached.js b/JSTests/test262/test/built-ins/TypedArray/prototype/some/values-are-not-cached.js index 6af2bf960b49..14aeefee7ebf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/some/values-are-not-cached.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/some/values-are-not-cached.js @@ -37,4 +37,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { v, 42, "method does not cache values before callbackfn calls" ); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-call-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-call-throws.js index 3d8e8d3ba06e..30e0ba147a6e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-call-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-call-throws.js @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { }); assert.sameValue(calls, 1, "immediately returned"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-calls.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-calls.js index c9d10aa2b4b3..218f2d6a90db 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-calls.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-calls.js @@ -39,4 +39,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(args[1][0], 42n, "x is a listed value"); assert.sameValue(args[1][0], 42n, "y is a listed value"); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-is-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-is-undefined.js index 065ffe91b299..52749b5d221f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-is-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-is-undefined.js @@ -20,4 +20,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.compareArray(explicit, [42n, 43n, 44n, 45n, 46n], 'The value of `explicit` is [42n, 43n, 44n, 45n, 46n]'); assert.compareArray(implicit, [42n, 43n, 44n, 45n, 46n], 'The value of `implicit` is [42n, 43n, 44n, 45n, 46n]'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-nonfunction-call-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-nonfunction-call-throws.js index 30889e1ebe8e..0f48fb2f3e5a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-nonfunction-call-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/comparefn-nonfunction-call-throws.js @@ -52,4 +52,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.sort({}); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer.js index 39829d049dd3..84bead0adfe6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer.js @@ -22,10 +22,10 @@ var comparefn = function() { throw new Test262Error(); }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.sort(comparefn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/return-same-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/return-same-instance.js index 0a22834ed507..f71063557b9f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/return-same-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/return-same-instance.js @@ -22,4 +22,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.sort(function() { return 0; }); assert.sameValue(sample, result, "with comparefn"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sortcompare-with-no-tostring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sortcompare-with-no-tostring.js index bdee53288380..3bb7ca0f44dd 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sortcompare-with-no-tostring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sortcompare-with-no-tostring.js @@ -28,4 +28,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var result = sample.sort(); assert.sameValue(toStringCalled, false, "BigInt.prototype.toString will not be called"); assert(compareArray(result, [3n, 20n, 100n])); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sorted-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sorted-values.js index 9cfbab7ba309..e25ee6249fca 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sorted-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/sorted-values.js @@ -25,7 +25,7 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([3n, 4n, 3n, 1n, 0n, 1n, 2n])).sort(); assert(compareArray(sample, [0n, 1n, 1n, 2n, 3n, 3n, 4n]), "repeating numbers"); -}); +}, null, null, ["immutable"]); var sample = new BigInt64Array([-4n, 3n, 4n, -3n, 2n, -2n, 1n, 0n]).sort(); assert(compareArray(sample, [-4n, -3n, -2n, 0n, 1n, 2n, 3n, 4n]), "negative values"); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-call-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-call-throws.js index 78a522de84c3..028038ae758b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-call-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-call-throws.js @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { }); assert.sameValue(calls, 1, "immediately returned"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-calls.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-calls.js index 6d572a429843..c1e773bcc4d5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-calls.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-calls.js @@ -39,4 +39,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(args[1][0], 42, "x is a listed value"); assert.sameValue(args[1][0], 42, "y is a listed value"); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-is-undefined.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-is-undefined.js index 860e6b30d3e9..267f2fbbede0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-is-undefined.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-is-undefined.js @@ -20,4 +20,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.compareArray(explicit, [42, 43, 44, 45, 46], 'The value of `explicit` is [42, 43, 44, 45, 46]'); assert.compareArray(implicit, [42, 43, 44, 45, 46], 'The value of `implicit` is [42, 43, 44, 45, 46]'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-nonfunction-call-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-nonfunction-call-throws.js index eed735b03d31..8809b550e460 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-nonfunction-call-throws.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/comparefn-nonfunction-call-throws.js @@ -52,4 +52,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(TypeError, function() { sample.sort({}); }); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer.js index 4b1a2a6a5810..7170d5b15f03 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer.js @@ -22,10 +22,10 @@ var comparefn = function() { throw new Test262Error(); }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.sort(comparefn); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/immutable-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/immutable-buffer.js new file mode 100644 index 000000000000..56547fc87214 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/immutable-buffer.js @@ -0,0 +1,47 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.prototype.sort +description: Throws a TypeError exception when the backing buffer is immutable +info: | + %TypedArray%.prototype.sort ( comparator ) + 1. If comparator is not undefined and IsCallable(comparator) is false, throw a TypeError exception. + 2. Let obj be the this value. + 3. Let taRecord be ? ValidateTypedArray(obj, ~seq-cst~, ~write~). + 4. Let len be TypedArrayLength(taRecord). + 5. NOTE: The following closure performs a numeric comparison rather than the string comparison used in 23.1.3.30. + 6. Let SortCompare be a new Abstract Closure with parameters (x, y) that captures comparator and performs the following steps when called: + a. Return ? CompareTypedArrayElements(x, y, comparator). + 7. Let sortedList be ? SortIndexedProperties(obj, len, SortCompare, ~read-through-holes~). + + ValidateTypedArray ( O, order [ , accessMode ] ) + 1. If accessMode is not present, set accessMode to read. + 2. Perform ? RequireInternalSlot(O, [[TypedArrayName]]). + 3. Assert: O has a [[ViewedArrayBuffer]] internal slot. + 4. If accessMode is ~write~ and IsImmutableBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception. +features: [TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + function comparator() { + calls.push("compare"); + return 0; + } + + assert.throws(TypeError, function() { + ta.sort(comparator); + }); + assert.compareArray(calls, [], "Must verify mutability before comparing."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), "Must not mutate contents."); + + calls = []; + var empty = new TA(makeCtorArg(0)); + assert.throws(TypeError, function() { + empty.sort(comparator); + }, "Must verify mutability even when receiver is length 0"); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/return-same-instance.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/return-same-instance.js index b363e964f639..bb9c2de4fa53 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/return-same-instance.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/return-same-instance.js @@ -22,4 +22,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = sample.sort(function() { return 0; }); assert.sameValue(sample, result, "with comparefn"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js index 04e36760addf..b5240c595751 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js @@ -16,8 +16,8 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var ta = new TA(4); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var ta = new TA(makeCtorArg(4)); var ab = ta.buffer; var called = false; @@ -30,4 +30,4 @@ testWithTypedArrayConstructors(function(TA) { }); assert.sameValue(true, called); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js index 57203938e0a8..c5e347334b74 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js @@ -28,4 +28,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { var result = sample.sort(); assert.sameValue(toStringCalled, false, "Number.prototype.toString will not be called"); assert(compareArray(result, [3, 20, 100]), "Default sorting by value"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values-nan.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values-nan.js index d688ded37f26..af77b845cb6e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values-nan.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values-nan.js @@ -35,4 +35,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample[4], Infinity, "#2 [4]"); assert.sameValue(sample[5], NaN, "#2 [5]"); assert.sameValue(sample[6], NaN, "#2 [6]"); -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values.js index 99c0d717eee3..667ef22310a0 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sorted-values.js @@ -25,22 +25,27 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([3, 4, 3, 1, 0, 1, 2])).sort(); assert(compareArray(sample, [0, 1, 1, 2, 3, 3, 4]), "repeating numbers"); -}); +}, null, null, ["immutable"]); testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(makeCtorArg([1, 0, -0, 2])).sort(); assert(compareArray(sample, [-0, 0, 1, 2]), "0s"); -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(makeCtorArg([1, 0, -0, 2])).sort(); assert(compareArray(sample, [0, 0, 1, 2]), "0s"); -}, intArrayConstructors); - -testWithTypedArrayConstructors(function(TA, makeCtorArg) { - var sample = new TA(makeCtorArg([-4, 3, 4, -3, 2, -2, 1, 0])).sort(); - assert(compareArray(sample, [-4, -3, -2, 0, 1, 2, 3, 4]), "negative values"); -}, floatArrayConstructors.concat([Int8Array, Int16Array, Int32Array])); +}, intArrayConstructors, null, ["immutable"]); + +testWithTypedArrayConstructors( + function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg([-4, 3, 4, -3, 2, -2, 1, 0])).sort(); + assert(compareArray(sample, [-4, -3, -2, 0, 1, 2, 3, 4]), "negative values"); + }, + floatArrayConstructors.concat([Int8Array, Int16Array, Int32Array]), + null, + ["immutable"] +); testWithTypedArrayConstructors(function(TA, makeCtorArg) { var sample; @@ -54,4 +59,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample = new TA(makeCtorArg([3, 4, Infinity, -Infinity, 1, 2])).sort(); assert(compareArray(sample, [-Infinity, 1, 2, 3, 4, Infinity]), "infinities"); -}, floatArrayConstructors); +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js index 47b41e6f8742..9b88074f1404 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js @@ -12,11 +12,11 @@ features: [TypedArray, stable-typedarray-sort] // Treat 0..3, 4..7, etc. as equal. const compare = (a, b) => (a / 4 | 0) - (b / 4 | 0); -testWithTypedArrayConstructors(TA => { +testWithTypedArrayConstructors((TA, makeCtorArg) => { // Create an array of the form `[0, 1, …, 126, 127]`. const array = Array.from({ length: 128 }, (_, i) => i); - const typedArray1 = new TA(array); + const typedArray1 = new TA(makeCtorArg(array)); assert(compareArray( typedArray1.sort(compare), array @@ -25,7 +25,7 @@ testWithTypedArrayConstructors(TA => { // Reverse `array` in-place so it becomes `[127, 126, …, 1, 0]`. array.reverse(); - const typedArray2 = new TA(array); + const typedArray2 = new TA(makeCtorArg(array)); assert(compareArray( typedArray2.sort(compare), [ @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(TA => { 123, 122, 121, 120, 127, 126, 125, 124, ] ), 'not presorted'); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/detached-buffer.js index 8cfe424305a5..6b577b84025d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/detached-buffer.js @@ -50,8 +50,8 @@ var o2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); begin = false; end = false; @@ -62,4 +62,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert(begin, "observable ToInteger(begin)"); assert(end, "observable ToInteger(end)"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/result-is-new-instance-with-shared-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/result-is-new-instance-with-shared-buffer.js index ee707f522b3b..83f95a08a15f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/result-is-new-instance-with-shared-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/result-is-new-instance-with-shared-buffer.js @@ -32,4 +32,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [40n, 100n, 111n, 43n]), "changes on the new instance values affect the original sample" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin-symbol.js index 3b1b36cefd0f..573ca62d9e3f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin-symbol.js @@ -15,10 +15,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol("1"); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.subarray(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin.js index 2388d0539989..cea9a0d3e7df 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-begin.js @@ -25,8 +25,8 @@ var o2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.subarray(o1); @@ -35,4 +35,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.subarray(o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end-symbol.js index 44b1dec715ee..6bdfb8b9bd91 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end-symbol.js @@ -16,10 +16,10 @@ features: [BigInt, Symbol, TypedArray] var s = Symbol("1"); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.subarray(0, s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end.js index 8b892bc903a7..0171394a88b1 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/return-abrupt-from-end.js @@ -26,8 +26,8 @@ var o2 = { } }; -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.subarray(0, o1); @@ -36,4 +36,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.subarray(0, o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor-abrupt.js index 48c7dbd2b890..8fe2989d8a2e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor-abrupt.js @@ -37,4 +37,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.subarray(0); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor.js index 4e257fc557a7..6e64824a3fa5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-ctor.js @@ -50,4 +50,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species-abrupt.js index cf6b59386b9f..2ce5e3fce40f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species-abrupt.js @@ -41,4 +41,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.subarray(0); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species.js index dcf74af431a2..d38aacfcd5f5 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/BigInt/speciesctor-get-species.js @@ -42,4 +42,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { sample.subarray(0); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/byteoffset-with-detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/byteoffset-with-detached-buffer.js index 590e3c595801..e036c6c301c6 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/byteoffset-with-detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/byteoffset-with-detached-buffer.js @@ -16,12 +16,12 @@ info: | ... f. Let argumentsList be « buffer, 𝔽(beginByteOffset), 𝔽(newLength) ». 17. Return ? TypedArraySpeciesCreate(O, argumentsList). -features: [TypedArray] +features: [Symbol.species, TypedArray] includes: [testTypedArray.js, detachArrayBuffer.js] ---*/ -testWithTypedArrayConstructors(function(TA) { - var ab = new ArrayBuffer(2 * TA.BYTES_PER_ELEMENT); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var ab = makeCtorArg(2 * TA.BYTES_PER_ELEMENT); var ta = new TA(ab, TA.BYTES_PER_ELEMENT, 1); var result = new TA(0); @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA) { }; assert.sameValue(ta.subarray(1, end), result); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/detached-buffer.js index fb049c89074b..97b03e0f3131 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/detached-buffer.js @@ -50,8 +50,8 @@ var o2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(2); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(2)); begin = false; end = false; @@ -62,4 +62,4 @@ testWithTypedArrayConstructors(function(TA) { assert(begin, "observable ToInteger(begin)"); assert(end, "observable ToInteger(end)"); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/result-is-new-instance-with-shared-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/result-is-new-instance-with-shared-buffer.js index d250c89ca887..e9a110669bee 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/result-is-new-instance-with-shared-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/result-is-new-instance-with-shared-buffer.js @@ -32,4 +32,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { compareArray(sample, [40, 100, 111, 43]), "changes on the new instance values affect the original sample" ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin-symbol.js index 8d9fd0890663..1e54741d3285 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin-symbol.js @@ -15,10 +15,10 @@ features: [Symbol, TypedArray] var s = Symbol("1"); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.subarray(s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin.js index e021609dcddf..c62f5c150706 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-begin.js @@ -25,8 +25,8 @@ var o2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.subarray(o1); @@ -35,4 +35,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.subarray(o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end-symbol.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end-symbol.js index a780599ffab4..aebf96477b5e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end-symbol.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end-symbol.js @@ -16,10 +16,10 @@ features: [Symbol, TypedArray] var s = Symbol("1"); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(TypeError, function() { sample.subarray(0, s); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end.js index 56a9ea4675db..f3dee021525f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/return-abrupt-from-end.js @@ -26,8 +26,8 @@ var o2 = { } }; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.throws(Test262Error, function() { sample.subarray(0, o1); @@ -36,4 +36,4 @@ testWithTypedArrayConstructors(function(TA) { assert.throws(Test262Error, function() { sample.subarray(0, o2); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-abrupt.js index 419a33780fe3..577d346fa3cc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-abrupt.js @@ -37,4 +37,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.subarray(0); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js index 3ef0b4e75a6f..5dce4cc439d9 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js @@ -50,4 +50,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { TA, "use defaultCtor on an undefined return - .constructor check" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js index b6bcce9ae7a4..ed7519dcd89d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js @@ -41,4 +41,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(Test262Error, function() { sample.subarray(0); }); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js index 63bcecbcf72c..a54d97986930 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js @@ -42,4 +42,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { sample.subarray(0); assert.sameValue(calls, 1); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/calls-tostring-from-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/calls-tostring-from-each-value.js index d481f5203236..23063d0dd7f2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/calls-tostring-from-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/calls-tostring-from-each-value.js @@ -50,9 +50,9 @@ BigInt.prototype.toLocaleString = function() { var arr = [42n, 0n]; var expected = ["hacks1", "hacks2"].join(separator); -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.sameValue(sample.toLocaleString(), expected, "returns expected value"); assert.sameValue(calls, 2, "toString called once for each item"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/detached-buffer.js index 75ed4c77f74b..9fc4ec7348f2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.toLocaleString(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/empty-instance-returns-empty-string.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/empty-instance-returns-empty-string.js index 26dd219a08ad..32eb1cbaf5e4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/empty-instance-returns-empty-string.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/BigInt/empty-instance-returns-empty-string.js @@ -20,7 +20,7 @@ includes: [testTypedArray.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.toLocaleString(), ""); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js index 1457e3a22452..d12210827842 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js @@ -42,12 +42,12 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; var expected = ["hacks1", "hacks2"].join(separator); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = []; assert.sameValue(sample.toLocaleString(), expected, "returns expected value"); assert( compareArray(new TA(calls), sample), "toLocaleString called for each item" ); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js index c82a5c8c0707..308e001a3b5d 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js @@ -50,9 +50,9 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; var expected = ["hacks1", "hacks2"].join(separator); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.sameValue(sample.toLocaleString(), expected, "returns expected value"); assert.sameValue(calls, 2, "toString called once for each item"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js index 85d37be06024..1edd27e689c4 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js @@ -48,9 +48,9 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; var expected = ["hacks1", "hacks2"].join(separator); -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.sameValue(sample.toLocaleString(), expected, "returns expected value"); assert.sameValue(calls, 2, "valueOf called once for each item"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js index 52740d732933..29dedb542995 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js @@ -19,10 +19,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.toLocaleString(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js index 1f64581d794d..3fa6bb94b0f3 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js @@ -20,7 +20,7 @@ includes: [testTypedArray.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(0)); assert.sameValue(sample.toLocaleString(), ""); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js index 290ec32f472c..dbc488b32a3f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js @@ -33,11 +33,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { calls = 0; - var sample = new TA(arr); + var sample = new TA(makeCtorArg(arr)); assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 1, "abrupt from first element"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js index 46d352aefa31..cb922d250027 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js @@ -45,11 +45,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 1, "toString called once"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js index 9e830ae9e39d..eb291e38e9fc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js @@ -46,11 +46,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 1, "toString called once"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js index d82a9c3da9fc..ef4e1611b05c 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js @@ -36,11 +36,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { +testWithTypedArrayConstructors(function(TA, makeCtorArg) { calls = 0; - var sample = new TA(arr); + var sample = new TA(makeCtorArg(arr)); assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 2, "abrupt from a next element"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js index c6dd6a438664..afef5ba97ddf 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js @@ -47,11 +47,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 2, "abrupt from a nextElement"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js index 3b9697ebaac0..5f64a3ab9b0e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js @@ -48,11 +48,11 @@ Number.prototype.toLocaleString = function() { var arr = [42, 0]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); calls = 0; assert.throws(Test262Error, function() { sample.toLocaleString(); }); assert.sameValue(calls, 2, "abrupt from a nextElement"); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-result.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-result.js index a35a693d0f64..7a96f46dc94f 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-result.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toLocaleString/return-result.js @@ -35,8 +35,8 @@ var separator = ["", ""].toLocaleString(); var arr = [42, 0, 43]; -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(arr); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(arr)); var expected = sample[0].toLocaleString().toString() + separator + @@ -44,4 +44,4 @@ testWithTypedArrayConstructors(function(TA) { separator + sample[2].toLocaleString().toString(); assert.sameValue(sample.toLocaleString(), expected); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/ignores-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/ignores-species.js index 80172fe2e8eb..9a7cfdca2a99 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/ignores-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/ignores-species.js @@ -17,25 +17,25 @@ info: | 2. Let constructor be the intrinsic object listed in column one of Table 63 for exemplar.[[TypedArrayName]]. ... includes: [testTypedArray.js] -features: [TypedArray, change-array-by-copy] +features: [Symbol.species, TypedArray, change-array-by-copy] ---*/ -testWithTypedArrayConstructors(TA => { - var ta = new TA(); +testWithTypedArrayConstructors((TA, makeCtorArg) => { + var ta = new TA(makeCtorArg(0)); ta.constructor = TA === Uint8Array ? Int32Array : Uint8Array; assert.sameValue(Object.getPrototypeOf(ta.toReversed()), TA.prototype); - ta = new TA(); + ta = new TA(makeCtorArg(0)); ta.constructor = { [Symbol.species]: TA === Uint8Array ? Int32Array : Uint8Array, }; assert.sameValue(Object.getPrototypeOf(ta.toReversed()), TA.prototype); - ta = new TA(); + ta = new TA(makeCtorArg(0)); Object.defineProperty(ta, "constructor", { get() { throw new Test262Error("Should not get .constructor"); } }); ta.toReversed(); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/length-property-ignored.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/length-property-ignored.js index b2c058514e87..87806657413b 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/length-property-ignored.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/length-property-ignored.js @@ -27,9 +27,9 @@ testWithTypedArrayConstructors((TA, makeCtorArg) => { res = ta.toReversed(); assert.compareArray(res, [2, 1, 0]); assert.sameValue(res.length, 3); -}, null, ["passthrough"]); +}); -function setLength(length) { +function setLengthOnPrototype(length) { Object.defineProperty(TypedArray.prototype, "length", { get: () => length, }); @@ -38,13 +38,13 @@ function setLength(length) { testWithTypedArrayConstructors((TA, makeCtorArg) => { var ta = new TA(makeCtorArg([0, 1, 2])); - setLength(2); + setLengthOnPrototype(2); var res = ta.toReversed(); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [2, 1, 0]); - setLength(5); + setLengthOnPrototype(5); res = ta.toReversed(); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [2, 1, 0]); }, null, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/this-value-invalid.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/this-value-invalid.js index 329157b18647..03dbaa699f1a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/this-value-invalid.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toReversed/this-value-invalid.js @@ -34,11 +34,11 @@ Object.entries(invalidValues).forEach(value => { }, `${value[0]} is not a valid TypedArray`); }); -testWithTypedArrayConstructors(function(TA) { - let buffer = new ArrayBuffer(8); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + let buffer = makeCtorArg(8); let sample = new TA(buffer, 0, 1); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, () => { sample.toReversed(); }, `array has a detached buffer`); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/ignores-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/ignores-species.js index 9d17f00adf75..72fca6bb2213 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/ignores-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/ignores-species.js @@ -17,25 +17,25 @@ info: | 2. Let constructor be the intrinsic object listed in column one of Table 63 for exemplar.[[TypedArrayName]]. ... includes: [testTypedArray.js] -features: [TypedArray, change-array-by-copy] +features: [Symbol.species, TypedArray, change-array-by-copy] ---*/ -testWithTypedArrayConstructors(TA => { - var ta = new TA(); +testWithTypedArrayConstructors((TA, makeCtorArg) => { + var ta = new TA(makeCtorArg(0)); ta.constructor = TA === Uint8Array ? Int32Array : Uint8Array; assert.sameValue(Object.getPrototypeOf(ta.toSorted()), TA.prototype); - ta = new TA(); + ta = new TA(makeCtorArg(0)); ta.constructor = { [Symbol.species]: TA === Uint8Array ? Int32Array : Uint8Array, }; assert.sameValue(Object.getPrototypeOf(ta.toSorted()), TA.prototype); - ta = new TA(); + ta = new TA(makeCtorArg(0)); Object.defineProperty(ta, "constructor", { get() { throw new Test262Error("Should not get .constructor"); } }); ta.toSorted(); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/length-property-ignored.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/length-property-ignored.js index e2f6eed387c4..cdb76902557a 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/length-property-ignored.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/length-property-ignored.js @@ -27,9 +27,9 @@ testWithTypedArrayConstructors((TA, makeCtorArg) => { res = ta.toSorted(); assert.compareArray(res, [1, 2, 3]); assert.sameValue(res.length, 3); -}, null, ["passthrough"]); +}); -function setLength(length) { +function setLengthOnPrototype(length) { Object.defineProperty(TypedArray.prototype, "length", { get: () => length, }); @@ -38,14 +38,14 @@ function setLength(length) { testWithTypedArrayConstructors((TA, makeCtorArg) => { var ta = new TA(makeCtorArg([3, 1, 2])); - setLength(2); + setLengthOnPrototype(2); var res = ta.toSorted(); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [1, 2, 3]); - setLength(5); + setLengthOnPrototype(5); res = ta.toSorted(); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [1, 2, 3]); }, null, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/this-value-invalid.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/this-value-invalid.js index 5dec68e2e60d..581ef3cddb02 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/this-value-invalid.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toSorted/this-value-invalid.js @@ -34,11 +34,11 @@ Object.entries(invalidValues).forEach(value => { }, `${value[0]} is not a valid TypedArray`); }); -testWithTypedArrayConstructors(function(TA) { - let buffer = new ArrayBuffer(8); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + let buffer = makeCtorArg(8); let sample = new TA(buffer, 0, 1); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, () => { sample.toSorted(); }, `array has a detached buffer`); -}, null, ["passthrough"]); +}, null, ["arraybuffer"], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toString/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toString/BigInt/detached-buffer.js index 7fa87a4d2d5f..d1e169803586 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toString/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toString/BigInt/detached-buffer.js @@ -23,10 +23,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.toString(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/toString/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/toString/detached-buffer.js index 7a0c106721b3..72f21c7eb950 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/toString/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/toString/detached-buffer.js @@ -23,10 +23,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.toString(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/values/BigInt/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/values/BigInt/detached-buffer.js index 0f92f92091c6..d2897fd24e92 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/values/BigInt/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/values/BigInt/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [BigInt, TypedArray] ---*/ -testWithBigIntTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.values(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/values/detached-buffer.js b/JSTests/test262/test/built-ins/TypedArray/prototype/values/detached-buffer.js index 83833e55698f..f94818d158ee 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/values/detached-buffer.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/values/detached-buffer.js @@ -18,10 +18,10 @@ includes: [testTypedArray.js, detachArrayBuffer.js] features: [TypedArray] ---*/ -testWithTypedArrayConstructors(function(TA) { - var sample = new TA(1); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var sample = new TA(makeCtorArg(1)); $DETACHBUFFER(sample.buffer); assert.throws(TypeError, function() { sample.values(); }); -}, null, ["passthrough"]); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/values/return-itor.js b/JSTests/test262/test/built-ins/TypedArray/prototype/values/return-itor.js index 047fef4ba541..dba0c048e974 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/values/return-itor.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/values/return-itor.js @@ -14,8 +14,8 @@ features: [TypedArray] var sample = [0, 42, 64]; -testWithTypedArrayConstructors(function(TA) { - var typedArray = new TA(sample); +testWithTypedArrayConstructors(function(TA, makeCtorArg) { + var typedArray = new TA(makeCtorArg(sample)); var itor = typedArray.values(); var next = itor.next(); @@ -33,4 +33,4 @@ testWithTypedArrayConstructors(function(TA) { next = itor.next(); assert.sameValue(next.value, undefined); assert.sameValue(next.done, true); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/with/BigInt/early-type-coercion-bigint.js b/JSTests/test262/test/built-ins/TypedArray/prototype/with/BigInt/early-type-coercion-bigint.js index 3228caf9b17e..9c479854f48e 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/with/BigInt/early-type-coercion-bigint.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/with/BigInt/early-type-coercion-bigint.js @@ -28,4 +28,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.compareArray(arr.with(1, value), [3n, 4n, 2n]); assert.compareArray(arr, [3n, 1n, 2n]); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/with/early-type-coercion.js b/JSTests/test262/test/built-ins/TypedArray/prototype/with/early-type-coercion.js index f2217818279b..3dacee28b5a2 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/with/early-type-coercion.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/with/early-type-coercion.js @@ -28,4 +28,4 @@ testWithTypedArrayConstructors((TA, makeCtorArg) => { assert.compareArray(arr.with(1, value), [3, 4, 2]); assert.compareArray(arr, [3, 1, 2]); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/with/ignores-species.js b/JSTests/test262/test/built-ins/TypedArray/prototype/with/ignores-species.js index 9f2d2f99b783..958ef3dc6478 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/with/ignores-species.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/with/ignores-species.js @@ -17,7 +17,7 @@ info: | 2. Let constructor be the intrinsic object listed in column one of Table 63 for exemplar.[[TypedArrayName]]. ... includes: [testTypedArray.js] -features: [TypedArray, change-array-by-copy] +features: [Symbol.species, TypedArray, change-array-by-copy] ---*/ testWithTypedArrayConstructors((TA, makeCtorArg) => { @@ -38,4 +38,4 @@ testWithTypedArrayConstructors((TA, makeCtorArg) => { } }); ta.with(0, 2); -}, null, ["passthrough"]); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/with/length-property-ignored.js b/JSTests/test262/test/built-ins/TypedArray/prototype/with/length-property-ignored.js index 8247e43ea121..a776c2f427cc 100644 --- a/JSTests/test262/test/built-ins/TypedArray/prototype/with/length-property-ignored.js +++ b/JSTests/test262/test/built-ins/TypedArray/prototype/with/length-property-ignored.js @@ -27,9 +27,9 @@ testWithTypedArrayConstructors((TA, makeCtorArg) => { res = ta.with(0, 0); assert.compareArray(res, [0, 1, 2]); assert.sameValue(res.length, 3); -}, null, ["passthrough"]); +}); -function setLength(length) { +function setLengthOnPrototype(length) { Object.defineProperty(TypedArray.prototype, "length", { get: () => length, }); @@ -38,13 +38,13 @@ function setLength(length) { testWithTypedArrayConstructors((TA, makeCtorArg) => { var ta = new TA(makeCtorArg([3, 1, 2])); - setLength(2); + setLengthOnPrototype(2); var res = ta.with(0, 0); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [0, 1, 2]); - setLength(5); + setLengthOnPrototype(5); res = ta.with(0, 0); - setLength(3); + setLengthOnPrototype(3); assert.compareArray(res, [0, 1, 2]); }, null, ["passthrough"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/from/BigInt/custom-ctor-returns-other-instance.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/BigInt/custom-ctor-returns-other-instance.js index 3281dad98bbd..56bd94303552 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/from/BigInt/custom-ctor-returns-other-instance.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/BigInt/custom-ctor-returns-other-instance.js @@ -49,4 +49,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = TypedArray.from.call(ctor, sourceObj); assert.sameValue(result, custom, "not using iterator, higher length"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-immutable-arraybuffer.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-immutable-arraybuffer.js new file mode 100644 index 000000000000..54e33ba2e1bb --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-immutable-arraybuffer.js @@ -0,0 +1,146 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.from +description: > + Throws a TypeError if species constructor returns an immutable ArrayBuffer. +info: | + %TypedArray%.from ( source [ , mapper [ , thisArg ] ] ) + 1. Let C be the this value. + 2. If IsConstructor(C) is false, throw a TypeError exception. + 3. If mapper is undefined, then + a. Let mapping be false. + 4. Else, + a. If IsCallable(mapper) is false, throw a TypeError exception. + b. Let mapping be true. + 5. Let usingIterator be ? GetMethod(source, %Symbol.iterator%). + 6. If usingIterator is not undefined, then + a. Let values be ? IteratorToList(? GetIteratorFromMethod(source, usingIterator)). + b. Let len be the number of elements in values. + c. Let targetObj be ? TypedArrayCreateFromConstructor(C, « 𝔽(len) », write). + d. Let k be 0. + e. Repeat, while k < len, + i. Let Pk be ! ToString(𝔽(k)). + ii. Let kValue be the first element of values. + iii. Remove the first element from values. + iv. If mapping is true, then + 1. Let mappedValue be ? Call(mapper, thisArg, « kValue, 𝔽(k) »). + v. Else, + 1. Let mappedValue be kValue. + vi. Perform ? Set(targetObj, Pk, mappedValue, true). + vii. Set k to k + 1. + f. Assert: values is now an empty List. + g. Return targetObj. + 7. NOTE: source is not an iterable object, so assume it is already an array-like object. + 8. Let arrayLike be ! ToObject(source). + 9. Let len be ? LengthOfArrayLike(arrayLike). + 10. Let targetObj be ? TypedArrayCreateFromConstructor(C, « 𝔽(len) », write). + 11. Let k be 0. + 12. Repeat, while k < len, + a. Let Pk be ! ToString(𝔽(k)). + b. Let kValue be ? Get(arrayLike, Pk). + c. If mapping is true, then + i. Let mappedValue be ? Call(mapper, thisArg, « kValue, 𝔽(k) »). +features: [Symbol.iterator, TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + var expectCalls = []; + + var custom = new TA(makeCtorArg(2)); + var ctor = function(len) { + calls.push("construct(" + len + ")"); + return custom; + }; + var mapper = function(value, index) { + calls.push("map index " + index); + return value + value; + }; + + // arraylike source + calls = []; + var srcArraylike = { + get length() { + calls.push("get source.length"); + return 1; + }, + get 0() { + calls.push("get source[0]"); + return "8"; + } + }; + Object.defineProperty(srcArraylike, Symbol.iterator, { + get: function() { + calls.push("get source[Symbol.iterator]"); + return undefined; + } + }); + assert.throws(TypeError, function() { + TA.from.call(ctor, srcArraylike, mapper); + }, "arraylike source"); + expectCalls = [ + "get source[Symbol.iterator]", + "get source.length", + "construct(1)" + ]; + assert.compareArray(calls, expectCalls, + "Must construct the result before visiting arraylike source elements."); + + // iterable source + calls = []; + var srcIterable = Object.defineProperty({}, Symbol.iterator, { + get: function() { + calls.push("get source[Symbol.iterator]"); + function getIterator() { + calls.push("call source[Symbol.iterator]"); + var itor = { + get next() { + calls.push("get source iterator.next"); + var iterationResults = [ + { done: false, value: "4", msg: "yield 4" }, + { done: true, value: "8", msg: "done" }, + { done: true, value: "9", msg: "unexpected" } + ]; + function next() { + var result = iterationResults.shift(); + calls.push("source iterator " + result.msg); + var resultSpy = { + get done() { + calls.push("get iterationResult.done " + result.done); + return result.done; + }, + get value() { + calls.push("get iterationResult.value " + result.value); + return result.value; + } + }; + return resultSpy; + }; + return next; + } + }; + return itor; + } + return getIterator; + } + }); + assert.throws(TypeError, function() { + TA.from.call(ctor, srcIterable, mapper); + }, "iterable source"); + expectCalls = [ + "get source[Symbol.iterator]", + "call source[Symbol.iterator]", + "get source iterator.next", + "source iterator yield 4", + "get iterationResult.done false", + "get iterationResult.value 4", + "source iterator done", + "get iterationResult.done true", + "construct(1)" + ]; + assert.compareArray(calls, expectCalls, + "Must construct the result before visiting iterable source elements."); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-other-instance.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-other-instance.js index 82a769a4865a..8d490623a4cf 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-other-instance.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/from/custom-ctor-returns-other-instance.js @@ -47,4 +47,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = TypedArray.from.call(ctor, sourceObj); assert.sameValue(result, custom, "not using iterator, higher length"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js index 492002f2fb2c..26b4b1a31c44 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js @@ -94,5 +94,4 @@ testWithTypedArrayConstructors(function(FA, makeCtorArg) { ); } } -}, floatArrayConstructors); - +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/boolean-tobigint.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/boolean-tobigint.js index 53680e92cbef..40ebe0115c4e 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/boolean-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/boolean-tobigint.js @@ -56,4 +56,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { typedArray[1] = true; assert.sameValue(typedArray[0], 0n, 'The value of typedArray[0] is 0n'); assert.sameValue(typedArray[1], 1n, 'The value of typedArray[1] is 1n'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js index 69cd7d7ec5a9..f8529f8b6759 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js @@ -21,4 +21,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { var sample = new TA(makeCtorArg([42n])); assert.sameValue(Reflect.set(sample, '-0', 1n), true, 'Reflect.set("new TA(makeCtorArg([42n]))", "-0", 1n) must return true'); assert.sameValue(sample.hasOwnProperty('-0'), false, 'sample.hasOwnProperty("-0") must return false'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js index 73a5a66c61a4..a450c4a5c179 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js @@ -30,4 +30,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample.hasOwnProperty('1.1'), false, 'sample.hasOwnProperty("1.1") must return false'); assert.sameValue(sample.hasOwnProperty('0.0001'), false, 'sample.hasOwnProperty("0.0001") must return false'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js index e62d524add23..08d15742b760 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js @@ -32,4 +32,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample.hasOwnProperty('-1'), false, 'sample.hasOwnProperty("-1") must return false'); assert.sameValue(sample.hasOwnProperty('1'), false, 'sample.hasOwnProperty("1") must return false'); assert.sameValue(sample.hasOwnProperty('2'), false, 'sample.hasOwnProperty("2") must return false'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/string-tobigint.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/string-tobigint.js index 2e2ce86fdf91..e7cb51c0237a 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/string-tobigint.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/string-tobigint.js @@ -82,4 +82,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { assert.throws(SyntaxError, function() { typedArray[0] = '1e7'; }, '`typedArray[0] = "1e7"` throws SyntaxError'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js index a814e27c6442..c04983de4b63 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js @@ -101,5 +101,4 @@ testWithTypedArrayConstructors(function(FA, makeCtorArg) { ); } } -}, floatArrayConstructors); - +}, floatArrayConstructors, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js index 4b2912c83775..680d2eb95b2d 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js @@ -24,4 +24,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(Reflect.set(sample, "-0", 1), true, 'Reflect.set(sample, "-0", 1) must return true'); assert.sameValue(sample.hasOwnProperty("-0"), false, 'sample.hasOwnProperty("-0") must return false'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js index 59c2f16efb6e..663f628927ac 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js @@ -31,4 +31,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { false, 'sample.hasOwnProperty("0.0001") must return false' ); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js index 702e89e84207..f5c073e5d1f9 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js @@ -29,4 +29,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { assert.sameValue(sample.hasOwnProperty("-1"), false, 'sample.hasOwnProperty("-1") must return false'); assert.sameValue(sample.hasOwnProperty("1"), false, 'sample.hasOwnProperty("1") must return false'); assert.sameValue(sample.hasOwnProperty("2"), false, 'sample.hasOwnProperty("2") must return false'); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/of/BigInt/custom-ctor-returns-other-instance.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/BigInt/custom-ctor-returns-other-instance.js index a893232a95cc..b0adf28e2e66 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/of/BigInt/custom-ctor-returns-other-instance.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/BigInt/custom-ctor-returns-other-instance.js @@ -29,4 +29,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) { result = TypedArray.of.call(ctor, 1n, 2n); assert.sameValue(result, custom, "using iterator, higher length"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-immutable-arraybuffer.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-immutable-arraybuffer.js new file mode 100644 index 000000000000..e7a8b50ea500 --- /dev/null +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-immutable-arraybuffer.js @@ -0,0 +1,49 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%typedarray%.of +description: > + Throws a TypeError if species constructor returns an immutable ArrayBuffer. +info: | + %TypedArray%.of ( ...items ) + 1. Let len be the number of elements in items. + 2. Let C be the this value. + 3. If IsConstructor(C) is false, throw a TypeError exception. + 4. Let newObj be ? TypedArrayCreateFromConstructor(C, « 𝔽(len) », write). + 5. Let k be 0. + 6. Repeat, while k < len, + a. Let kValue be items[k]. + b. Let Pk be ! ToString(𝔽(k)). + c. Perform ? Set(newObj, Pk, kValue, true). + d. Set k to k + 1. +features: [Symbol.iterator, TypedArray, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var custom = new TA(makeCtorArg(2)); + var ctor = function(len) { + calls.push("construct(" + len + ")"); + return custom; + }; + + var a = { + valueOf() { + calls.push("a.valueOf"); + return "1"; + } + }; + var b = { + valueOf() { + calls.push("b.valueOf"); + return "2"; + } + }; + assert.throws(TypeError, function() { + TA.of.call(ctor, a, b); + }, "iterable source"); + assert.compareArray(calls, ["construct(2)"]); +}, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js index 8484dc0d7608..12cf8af04b86 100644 --- a/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js +++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js @@ -29,4 +29,4 @@ testWithTypedArrayConstructors(function(TA, makeCtorArg) { result = TypedArray.of.call(ctor, 1, 2); assert.sameValue(result, custom, "using iterator, higher length"); -}); +}, null, null, ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromBase64/throws-when-target-is-backed-by-immutable-arraybuffer.js b/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromBase64/throws-when-target-is-backed-by-immutable-arraybuffer.js new file mode 100644 index 000000000000..62b3f4aebc66 --- /dev/null +++ b/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromBase64/throws-when-target-is-backed-by-immutable-arraybuffer.js @@ -0,0 +1,52 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-uint8array.prototype.setfrombase64 +description: Throws a TypeError exception when the backing buffer is immutable +info: | + Uint8Array.prototype.setFromBase64 ( string [ , options ] ) + 1. Let into be the this value. + 2. Perform ? ValidateUint8Array(into). + 3. If string is not a String, throw a TypeError exception. + 4. Let opts be ? GetOptionsObject(options). + 5. Let alphabet be ? Get(opts, "alphabet"). + 6. If alphabet is undefined, set alphabet to "base64". + 7. If alphabet is neither "base64" nor "base64url", throw a TypeError exception. + 8. Let lastChunkHandling be ? Get(opts, "lastChunkHandling"). +features: [TypedArray, uint8array-base64, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var calls = []; + + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + var options = { + get alphabet() { + calls.push("get options.alphabet"); + return undefined; + }, + get lastChunkHandling() { + calls.push("get options.lastChunkHandling"); + return undefined; + }, + }; + + assert.throws(TypeError, function() { + ta.setFromBase64("Zm9v", options); + }, "non-empty base64"); + assert.compareArray(calls, [], + "Must verify mutability before reading arguments (non-empty base64)."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), + "Must not mutate contents (non-empty base64)."); + + calls = []; + assert.throws(TypeError, function() { + ta.setFromBase64("", options); + }, "empty base64"); + assert.compareArray(calls, [], + "Must verify mutability before reading arguments (empty base64)."); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), + "Must not mutate contents (empty base64)."); +}, [Uint8Array], ["immutable"]); diff --git a/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromHex/throws-when-target-is-backed-by-immutable-arraybuffer.js b/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromHex/throws-when-target-is-backed-by-immutable-arraybuffer.js new file mode 100644 index 000000000000..b630a53baeb2 --- /dev/null +++ b/JSTests/test262/test/built-ins/Uint8Array/prototype/setFromHex/throws-when-target-is-backed-by-immutable-arraybuffer.js @@ -0,0 +1,29 @@ +// Copyright (C) 2025 Richard Gibson. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-uint8array.prototype.setfromhex +description: Throws a TypeError exception when the backing buffer is immutable +info: | + Uint8Array.prototype.setFromHex ( string ) + 1. Let into be the this value. + 2. Perform ? ValidateUint8Array(into). +features: [TypedArray, uint8array-base64, immutable-arraybuffer] +includes: [testTypedArray.js, compareArray.js] +---*/ + +testWithAllTypedArrayConstructors((TA, makeCtorArg) => { + var ta = new TA(makeCtorArg(["1", "2", "3", "4"])); + + assert.throws(TypeError, function() { + ta.setFromHex("666f6f"); + }, "non-empty hex"); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), + "Must not mutate contents (non-empty hex)."); + + assert.throws(TypeError, function() { + ta.setFromHex(""); + }, "empty hex"); + assert.compareArray(ta, new TA(["1", "2", "3", "4"]), + "Must not mutate contents (empty hex)."); +}, [Uint8Array], ["immutable"]); diff --git a/JSTests/test262/test/harness/verifyProperty-value-error.js b/JSTests/test262/test/harness/verifyProperty-value-error.js index 26e5f5422ce7..0145243db160 100644 --- a/JSTests/test262/test/harness/verifyProperty-value-error.js +++ b/JSTests/test262/test/harness/verifyProperty-value-error.js @@ -29,7 +29,7 @@ try { ); } - if (err.message !== "obj['prop'] descriptor value should be 2; obj['prop'] value should be 2") { + if (err.message !== "prop descriptor value should be 2; prop value should be 2") { throw new Error('The error thrown did not define the specified message'); } } diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js index c46d4b0b89f4..6d75bd1a27a8 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js @@ -3,12 +3,12 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Monkey-patching Object.prototype does not change the default options for NumberFormat as a null prototype is used. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) 1. If _options_ is *undefined*, then 1. Let _options_ be ObjectCreate(*null*). diff --git a/JSTests/test262/test/intl402/Collator/constructor-options-throwing-getters.js b/JSTests/test262/test/intl402/Collator/constructor-options-throwing-getters.js index e9d49422c627..5a638a302467 100644 --- a/JSTests/test262/test/intl402/Collator/constructor-options-throwing-getters.js +++ b/JSTests/test262/test/intl402/Collator/constructor-options-throwing-getters.js @@ -2,8 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: Checks the propagation of exceptions from the options for the Collator constructor. +locale: [en] ---*/ function CustomError() {} diff --git a/JSTests/test262/test/intl402/Collator/default-options-object-prototype.js b/JSTests/test262/test/intl402/Collator/default-options-object-prototype.js index ae1d49d7c167..ba83b744a29b 100644 --- a/JSTests/test262/test/intl402/Collator/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/Collator/default-options-object-prototype.js @@ -2,15 +2,10 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: > Monkey-patching Object.prototype does not change the default options for Collator as a null prototype is used. -info: | - InitializeCollator ( collator, locales, options ) - - 1. If _options_ is *undefined*, then - 1. Let _options_ be ObjectCreate(*null*). ---*/ let defaultSensitivity = new Intl.Collator("en").resolvedOptions().sensitivity; diff --git a/JSTests/test262/test/intl402/Collator/proto-from-ctor-realm.js b/JSTests/test262/test/intl402/Collator/proto-from-ctor-realm.js index 872fa6fc1176..f825c84578ae 100644 --- a/JSTests/test262/test/intl402/Collator/proto-from-ctor-realm.js +++ b/JSTests/test262/test/intl402/Collator/proto-from-ctor-realm.js @@ -10,7 +10,6 @@ info: | 1. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget. ... 5. Let collator be ? OrdinaryCreateFromConstructor(newTarget, "%CollatorPrototype%", internalSlotsList). - 6. Return ? InitializeCollator(collator, locales, options). OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) diff --git a/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default.js b/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default.js index ffb80c0ba98b..49ce7990c889 100644 --- a/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default.js +++ b/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default.js @@ -1,7 +1,7 @@ // Copyright 2023 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: resolved ignorePunctuation come from locale default instead of false. locale: [en, th, ja] ---*/ diff --git a/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js b/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js index 2dabdaf96f72..54ec7ffacbd2 100644 --- a/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js +++ b/JSTests/test262/test/intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js @@ -1,7 +1,7 @@ // Copyright 2023 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: resolved ignorePunctuation is the same as the one specified in option bag. locale: [en, th, ja] ---*/ diff --git a/JSTests/test262/test/intl402/Collator/unicode-ext-seq-in-private-tag.js b/JSTests/test262/test/intl402/Collator/unicode-ext-seq-in-private-tag.js index 320717d2011d..5abff49579d2 100644 --- a/JSTests/test262/test/intl402/Collator/unicode-ext-seq-in-private-tag.js +++ b/JSTests/test262/test/intl402/Collator/unicode-ext-seq-in-private-tag.js @@ -2,18 +2,15 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: > Unicode extension sequence-like parts are ignored in private-use tags. info: | - 10.1.1 InitializeCollator ( collator, locales, options ) - ... - 15. For each element key of relevantExtensionKeys in List order, do - a. If key is "co", then - i. Let value be r.[[co]]. - ii. If value is null, let value be "default". - iii. Set collator.[[Collation]] to value. - ... + Intl.Collator ( [ locales [ , options ] ] ) + + 1. If _r_.[[co]] is *null*, let _collation_ be *"default"*. Otherwise, let + _collation_ be _r_.[[co]]. + 1. Set _collator_.[[Collation]] to _collation_. 10.3.5 Intl.Collator.prototype.resolvedOptions () The function returns a new object whose properties and attributes are set as if constructed diff --git a/JSTests/test262/test/intl402/Collator/unicode-ext-seq-with-attribute.js b/JSTests/test262/test/intl402/Collator/unicode-ext-seq-with-attribute.js index fb4daf257ed5..ab1f86a1bbfa 100644 --- a/JSTests/test262/test/intl402/Collator/unicode-ext-seq-with-attribute.js +++ b/JSTests/test262/test/intl402/Collator/unicode-ext-seq-with-attribute.js @@ -2,18 +2,15 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: > Attributes in Unicode extension subtags should be ignored. info: | - 10.1.1 InitializeCollator ( collator, locales, options ) - ... - 15. For each element key of relevantExtensionKeys in List order, do - a. If key is "co", then - i. Let value be r.[[co]]. - ii. If value is null, let value be "default". - iii. Set collator.[[Collation]] to value. - ... + Intl.Collator ( [ locales [ , options ] ] ) + + 1. If _r_.[[co]] is *null*, let _collation_ be *"default"*. Otherwise, let + _collation_ be _r_.[[co]]. + 1. Set _collator_.[[Collation]] to _collation_. 10.3.5 Intl.Collator.prototype.resolvedOptions () The function returns a new object whose properties and attributes are set as if constructed diff --git a/JSTests/test262/test/intl402/Collator/usage-de.js b/JSTests/test262/test/intl402/Collator/usage-de.js index 6af9f050b7f6..9e82513c244c 100644 --- a/JSTests/test262/test/intl402/Collator/usage-de.js +++ b/JSTests/test262/test/intl402/Collator/usage-de.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: Checks the behavior of search and sort in German. includes: [compareArray.js] locale: [de] diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-calendar-future-fallback.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-calendar-future-fallback.js new file mode 100644 index 000000000000..e524189dca92 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-calendar-future-fallback.js @@ -0,0 +1,45 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.datetimeformat +description: > + Tests that fallbacks for not-yet-adopted calendars are selected from one of + the values returned from `AvailableCalendars`. +locale: [en] +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode] +---*/ + +const availableCalendars = [ + "buddhist", + "chinese", + "coptic", + "dangi", + "ethioaa", + "ethiopic", + "gregory", + "hebrew", + "indian", + "islamic-civil", + "islamic-tbla", + "islamic-umalqura", + "iso8601", + "japanese", + "persian", + "roc", +]; + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + const option = new Intl.DateTimeFormat("en", { calendar }); + assert( + availableCalendars.includes(option.resolvedOptions().calendar), + `${calendar} should fall back to an available calendar` + ); + + const uExtension = new Intl.DateTimeFormat(`en-u-ca-${calendar}`); + assert( + availableCalendars.includes(uExtension.resolvedOptions().calendar), + `${calendar} should fall back to an available calendar` + ); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js deleted file mode 100644 index 1f7010b25b18..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2019 Googe Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the order of getting options of 'dayPeriod' for the DateTimeFormat constructor. -info: | - CreateDateTimeFormat ( newTarget, locales, options, required, defaults ) - ... - 36. For each row of Table 7, except the header row, in table order, do - a. Let prop be the name given in the Property column of the row. - b. If prop is "fractionalSecondDigits", then - i. Let value be ? GetNumberOption(options, "fractionalSecondDigits", 1, 3, undefined). - c. Else, - i. Let values be a List whose elements are the strings given in the Values column of the row. - ii. Let value be ? GetOption(options, prop, string, values, undefined). - d. Set formatOptions.[[]] to value. - ... -includes: [compareArray.js] -features: [Intl.DateTimeFormat-dayPeriod] - ----*/ - -// Just need to ensure dayPeriod are get between day and hour. -const expected = [ - // CreateDateTimeFormat step 36. - "day", - "dayPeriod", - "hour" -]; - -const actual = []; - -const options = { - get day() { - actual.push("day"); - return "numeric"; - }, - get dayPeriod() { - actual.push("dayPeriod"); - return "long"; - }, - get hour() { - actual.push("hour"); - return "numeric"; - }, -}; - -new Intl.DateTimeFormat("en", options); -assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js deleted file mode 100644 index a1cf9eed50bd..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 Googe Inc. All rights reserved. -// Copyright 2020 Apple Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the order of getting options of 'fractionalSecondDigits' for the DateTimeFormat constructor. -info: | - CreateDateTimeFormat ( newTarget, locales, options, required, defaults ) - ... - 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - ... - 36. For each row of Table 7, except the header row, in table order, do - a. Let prop be the name given in the Property column of the row. - b. If prop is "fractionalSecondDigits", then - i. Let value be ? GetNumberOption(options, "fractionalSecondDigits", 1, 3, undefined). - c. Else, - i. Let values be a List whose elements are the strings given in the Values column of the row. - ii. Let value be ? GetOption(options, prop, string, values, undefined). - d. Set formatOptions.[[]] to value. - 37. Let matcher be ? GetOption(options, "formatMatcher", "string", « "basic", "best fit" », "best fit"). - ... -includes: [compareArray.js] -features: [Intl.DateTimeFormat-fractionalSecondDigits] ----*/ - -// Just need to ensure fractionalSecondDigits are get -// between "second" and "timeZoneName". -const expected = [ - // CreateDateTimeFormat step 4. - "localeMatcher", - // CreateDateTimeFormat step 36. - "second", - "fractionalSecondDigits", - "timeZoneName", - // CreateDateTimeFormat step 37. - "formatMatcher", -]; - -const actual = []; - -const options = { - get second() { - actual.push("second"); - return "numeric"; - }, - get fractionalSecondDigits() { - actual.push("fractionalSecondDigits"); - return undefined; - }, - get localeMatcher() { - actual.push("localeMatcher"); - return undefined; - }, - get timeZoneName() { - actual.push("timeZoneName"); - return undefined; - }, - get formatMatcher() { - actual.push("formatMatcher"); - return undefined; - }, -}; - -new Intl.DateTimeFormat("en", options); -assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-timedate-style.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-timedate-style.js deleted file mode 100644 index 6ea1ed28a47d..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-timedate-style.js +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2018 Igalia, S.L. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the order of getting options for the DateTimeFormat constructor. -includes: [compareArray.js] -features: [Intl.DateTimeFormat-datetimestyle] ----*/ - -// To be merged into constructor-options-order.js when the feature is removed. - -const expected = [ - // CreateDateTimeFormat step 4. - "localeMatcher", - // CreateDateTimeFormat step 12. - "hour12", - // CreateDateTimeFormat step 13. - "hourCycle", - // CreateDateTimeFormat step 29. - "timeZone", - // CreateDateTimeFormat step 36. - "weekday", - "era", - "year", - "month", - "day", - "hour", - "minute", - "second", - "timeZoneName", - "formatMatcher", - // CreateDateTimeFormat step 38. - "dateStyle", - // CreateDateTimeFormat step 40. - "timeStyle", -]; - -const actual = []; - -const options = { - get dateStyle() { - actual.push("dateStyle"); - return undefined; - }, - - get day() { - actual.push("day"); - return "numeric"; - }, - - get era() { - actual.push("era"); - return "long"; - }, - - get formatMatcher() { - actual.push("formatMatcher"); - return "best fit"; - }, - - get hour() { - actual.push("hour"); - return "numeric"; - }, - - get hour12() { - actual.push("hour12"); - return true; - }, - - get hourCycle() { - actual.push("hourCycle"); - return "h24"; - }, - - get localeMatcher() { - actual.push("localeMatcher"); - return "best fit"; - }, - - get minute() { - actual.push("minute"); - return "numeric"; - }, - - get month() { - actual.push("month"); - return "numeric"; - }, - - get second() { - actual.push("second"); - return "numeric"; - }, - - get timeStyle() { - actual.push("timeStyle"); - return undefined; - }, - - get timeZone() { - actual.push("timeZone"); - return "UTC"; - }, - - get timeZoneName() { - actual.push("timeZoneName"); - return "long"; - }, - - get weekday() { - actual.push("weekday"); - return "long"; - }, - - get year() { - actual.push("year"); - return "numeric"; - }, -}; - -new Intl.DateTimeFormat("en", options); - -assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order.js index fa626f0dffca..0939372dbd60 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order.js @@ -4,105 +4,103 @@ /*--- esid: sec-createdatetimeformat description: Checks the order of getting options for the DateTimeFormat constructor. -includes: [compareArray.js] +includes: [compareArray.js, temporalHelpers.js] +features: + - Intl.DateTimeFormat-dayPeriod + - Intl.DateTimeFormat-fractionalSecondDigits + - Intl.DateTimeFormat-datetimestyle +locale: [en] ---*/ const expected = [ // CreateDateTimeFormat step 4. - "localeMatcher", + "get options.localeMatcher", + "get options.localeMatcher.toString", + "call options.localeMatcher.toString", + "get options.calendar", + "get options.calendar.toString", + "call options.calendar.toString", + "get options.numberingSystem", + "get options.numberingSystem.toString", + "call options.numberingSystem.toString", // CreateDateTimeFormat step 12. - "hour12", + "get options.hour12", // CreateDateTimeFormat step 13. - "hourCycle", + "get options.hourCycle", + "get options.hourCycle.toString", + "call options.hourCycle.toString", // CreateDateTimeFormat step 29. - "timeZone", + "get options.timeZone", + "get options.timeZone.toString", + "call options.timeZone.toString", // CreateDateTimeFormat step 36. - "weekday", - "era", - "year", - "month", - "day", - "hour", - "minute", - "second", - "timeZoneName", + "get options.weekday", + "get options.weekday.toString", + "call options.weekday.toString", + "get options.era", + "get options.era.toString", + "call options.era.toString", + "get options.year", + "get options.year.toString", + "call options.year.toString", + "get options.month", + "get options.month.toString", + "call options.month.toString", + "get options.day", + "get options.day.toString", + "call options.day.toString", + "get options.dayPeriod", + "get options.dayPeriod.toString", + "call options.dayPeriod.toString", + "get options.hour", + "get options.hour.toString", + "call options.hour.toString", + "get options.minute", + "get options.minute.toString", + "call options.minute.toString", + "get options.second", + "get options.second.toString", + "call options.second.toString", + "get options.fractionalSecondDigits", + "get options.fractionalSecondDigits.valueOf", + "call options.fractionalSecondDigits.valueOf", + "get options.timeZoneName", + "get options.timeZoneName.toString", + "call options.timeZoneName.toString", // CreateDateTimeFormat step 37. - "formatMatcher", + "get options.formatMatcher", + "get options.formatMatcher.toString", + "call options.formatMatcher.toString", + // CreateDateTimeFormat step 38. + "get options.dateStyle", + // CreateDateTimeFormat step 40. + "get options.timeStyle", ]; const actual = []; -const options = { - get day() { - actual.push("day"); - return "numeric"; - }, - - get era() { - actual.push("era"); - return "long"; - }, - - get formatMatcher() { - actual.push("formatMatcher"); - return "best fit"; - }, - - get hour() { - actual.push("hour"); - return "numeric"; - }, - - get hour12() { - actual.push("hour12"); - return true; - }, - - get hourCycle() { - actual.push("hourCycle"); - return "h24"; - }, - - get localeMatcher() { - actual.push("localeMatcher"); - return "best fit"; - }, - - get minute() { - actual.push("minute"); - return "numeric"; - }, - - get month() { - actual.push("month"); - return "numeric"; - }, - - get second() { - actual.push("second"); - return "numeric"; - }, - - get timeZone() { - actual.push("timeZone"); - return "UTC"; - }, - - get timeZoneName() { - actual.push("timeZoneName"); - return "long"; - }, - - get weekday() { - actual.push("weekday"); - return "long"; - }, - - get year() { - actual.push("year"); - return "numeric"; - }, -}; +const options = TemporalHelpers.propertyBagObserver(actual, { + calendar: "gregory", + dateStyle: undefined, + day: "numeric", + dayPeriod: "long", + era: "long", + formatMatcher: "best fit", + fractionalSecondDigits: 3, + hour: "numeric", + hour12: true, + hourCycle: "h24", + localeMatcher: "best fit", + minute: "numeric", + month: "numeric", + numberingSystem: "latn", + second: "numeric", + timeStyle: undefined, + timeZone: "UTC", + timeZoneName: "long", + weekday: "long", + year: "numeric", +}, "options"); new Intl.DateTimeFormat("en", options); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-style-conflict.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-style-conflict.js index 3ac721e9846a..ee5391ca1dd0 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-style-conflict.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-style-conflict.js @@ -6,16 +6,15 @@ esid: sec-createdatetimeformat description: > Conflicting properties of dateStyle/timeStyle must be rejected with a TypeError for the options argument to the DateTimeFormat constructor. info: | - InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + CreateDateTimeFormat ( newTarget, locales, options, required, defaults ) - ... - 43. If dateStyle is not undefined or timeStyle is not undefined, then - a. If hasExplicitFormatComponents is true, then - i. Throw a TypeError exception. - b. If required is date and timeStyle is not undefined, then - i. Throw a TypeError exception. - c. If required is time and dateStyle is not undefined, then - i. Throw a TypeError exception. + 1. If _dateStyle_ is not *undefined* or _timeStyle_ is not *undefined*, then + 1. If _hasExplicitFormatComponents_ is *true*, then + 1. Throw a *TypeError* exception. + 1. If _required_ is ~date~ and _timeStyle_ is not *undefined*, then + 1. Throw a *TypeError* exception. + 1. If _required_ is ~time~ and _dateStyle_ is not *undefined*, then + 1. Throw a *TypeError* exception. ---*/ diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js deleted file mode 100644 index 789ce8562fa2..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 Google Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. -features: [Intl.DateTimeFormat-dayPeriod] ----*/ - -function CustomError() {} - -const options = [ - "dayPeriod", -]; - -for (const option of options) { - assert.throws(CustomError, () => { - new Intl.DateTimeFormat("en", { - get [option]() { - throw new CustomError(); - } - }); - }, `Exception from ${option} getter should be propagated`); -} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js deleted file mode 100644 index 5fb76b7899f6..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 Google Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. -features: [Intl.DateTimeFormat-fractionalSecondDigits] ----*/ - -function CustomError() {} - -const options = [ - "fractionalSecondDigits", -]; - -for (const option of options) { - assert.throws(CustomError, () => { - new Intl.DateTimeFormat("en", { - get [option]() { - throw new CustomError(); - } - }); - }, `Exception from ${option} getter should be propagated`); -} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-timedate-style.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-timedate-style.js deleted file mode 100644 index 2c2e27197ed8..000000000000 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-timedate-style.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2018 Igalia, S.L. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-createdatetimeformat -description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. -features: [Intl.DateTimeFormat-datetimestyle] ----*/ - -// To be merged into constructor-options-throwing-getters.js when the feature is removed. - -function CustomError() {} - -const options = [ - // CreateDateTimeFormat step 39 - "dateStyle", - // CreateDateTimeFormat step 41 - "timeStyle", -]; - -for (const option of options) { - assert.throws(CustomError, () => { - new Intl.DateTimeFormat("en", { - get [option]() { - throw new CustomError(); - } - }); - }, `Exception from ${option} getter should be propagated`); -} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters.js index 93af7e9195c6..3d6b4fa84e6c 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters.js @@ -4,20 +4,31 @@ /*--- esid: sec-createdatetimeformat description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. +features: + - Intl.DateTimeFormat-datetimestyle + - Intl.DateTimeFormat-dayPeriod + - Intl.DateTimeFormat-fractionalSecondDigits +locale: [en] ---*/ function CustomError() {} const options = [ "weekday", "year", "month", "day", + "dayPeriod", "hour", "minute", "second", + "fractionalSecondDigits", "localeMatcher", + "calendar", + "numberingSystem", "hour12", "hourCycle", "timeZone", "era", "timeZoneName", "formatMatcher", + "dateStyle", + "timeStyle", ]; for (const option of options) { diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-toobject.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-toobject.js index 26799a2e3f8d..ef3d70a3610a 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-toobject.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-toobject.js @@ -4,7 +4,7 @@ /*--- esid: sec-createdatetimeformat description: > - Tests that Intl.DateTimeFormat contructor converts the options argument + Tests that Intl.DateTimeFormat constructor converts the options argument to an object using `ToObject` (7.1.13). ---*/ diff --git a/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js index 7536139e3735..8b01b9beb5ea 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js @@ -12,21 +12,14 @@ features: [intl-normative-optional] let object = new Intl.DateTimeFormat(); let newObject = Intl.DateTimeFormat.call(object); let symbol = null; -let error = null; -try { - let proxy = new Proxy(newObject, { - get(target, property) { - symbol = property; - return target[property]; - } - }); - Intl.DateTimeFormat.prototype.resolvedOptions.call(proxy); -} catch (e) { - // If normative optional is not implemented, an error will be thrown. - error = e; - assert(error instanceof TypeError); -} -if (error === null) { - assert.sameValue(typeof symbol, "symbol"); - assert.sameValue(symbol.description, "IntlLegacyConstructedSymbol"); -} + +let proxy = new Proxy(newObject, { + get(target, property) { + symbol = property; + return target[property]; + } +}); +Intl.DateTimeFormat.prototype.resolvedOptions.call(proxy); + +assert.sameValue(typeof symbol, "symbol"); +assert.sameValue(symbol.description, "IntlLegacyConstructedSymbol"); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-property.js b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-property.js new file mode 100644 index 000000000000..eacf6924406d --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol-property.js @@ -0,0 +1,37 @@ +// Copyright 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.datetimeformat +description: Property descriptor of %Intl%.[[FallbackSymbol]] +info: | + ChainDateTimeFormat ( dateTimeFormat, newTarget, this ) + + 1.a. Perform ? DefinePropertyOrThrow(_this_, %Intl%.[[FallbackSymbol]], + PropertyDescriptor{ [[Value]]: _dateTimeFormat_, [[Writable]]: *false*, + [[Enumerable]]: *false*, [[Configurable]]: *false* }). +includes: [propertyHelper.js] +features: [intl-normative-optional] +---*/ + +const object = Object.create(Intl.DateTimeFormat.prototype); +const fallbackDTF = Intl.DateTimeFormat.call(object); +assert.sameValue(object, fallbackDTF, "return value of Intl.DateTimeFormat constructor"); + +const symbolProps = Object.getOwnPropertySymbols(fallbackDTF); +const fallbackSymbol = symbolProps.find((sym) => sym.description === "IntlLegacyConstructedSymbol"); + +assert( + fallbackDTF[fallbackSymbol] instanceof Intl.DateTimeFormat, + "value of legacy symbol property must be an Intl.DateTimeFormat" +); +verifyProperty( + fallbackDTF, + fallbackSymbol, + { + writable: false, + enumerable: false, + configurable: false + }, + { label: "%Intl%.[[FallbackSymbol]]" } +); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol.js b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol.js index 1050c902fa09..ee057b4875b1 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/intl-legacy-constructed-symbol.js @@ -12,7 +12,5 @@ features: [intl-normative-optional] let object = new Intl.DateTimeFormat(); let newObject = Intl.DateTimeFormat.call(object); let symbols = Object.getOwnPropertySymbols(newObject); -if (symbols.length !== 0) { - assert.sameValue(symbols.length, 1); - assert.sameValue(symbols[0].description, "IntlLegacyConstructedSymbol"); -} + +assert(symbols.some((symbol) => symbol.description === "IntlLegacyConstructedSymbol")); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js index 666bd8f7103a..6512c7ec55e2 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializedatetimeformat +esid: sec-createdatetimeformat description: Checks basic handling of dayPeriod, short format. features: [Intl.DateTimeFormat-dayPeriod] locale: [en] diff --git a/JSTests/test262/test/intl402/DateTimeFormat/timezone-case-insensitive.js b/JSTests/test262/test/intl402/DateTimeFormat/timezone-case-insensitive.js index 46354004b8d1..d733b63a8e22 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/timezone-case-insensitive.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/timezone-case-insensitive.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializedatetimeformat +esid: sec-createdatetimeformat description: Time zone identifiers are case-normalized features: [canonical-tz] ---*/ diff --git a/JSTests/test262/test/intl402/DateTimeFormat/timezone-legacy-non-iana.js b/JSTests/test262/test/intl402/DateTimeFormat/timezone-legacy-non-iana.js index e0adeca9996a..9d53e13b241e 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/timezone-legacy-non-iana.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/timezone-legacy-non-iana.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializedatetimeformat +esid: sec-createdatetimeformat description: Only IANA time zone identifiers are allowed. ---*/ diff --git a/JSTests/test262/test/intl402/DateTimeFormat/timezone-not-canonicalized.js b/JSTests/test262/test/intl402/DateTimeFormat/timezone-not-canonicalized.js index e2964f617f62..795df85e70fb 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/timezone-not-canonicalized.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/timezone-not-canonicalized.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializedatetimeformat +esid: sec-createdatetimeformat description: Time zone identifiers are not canonicalized before storing in internal slots features: [canonical-tz] ---*/ diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-option-read-order.js b/JSTests/test262/test/intl402/DurationFormat/constructor-option-read-order.js deleted file mode 100644 index a37cf5ed59ae..000000000000 --- a/JSTests/test262/test/intl402/DurationFormat/constructor-option-read-order.js +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2023 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-Intl.DurationFormat -description: Checks the order of option read. -features: [Intl.DurationFormat] -includes: [compareArray.js] ----*/ - -let optionKeys = Object.keys((new Intl.DurationFormat()).resolvedOptions()); -let opt = {}; -let readKeys = new Array(); -// For each item returned by resolvedOptions of default, add a getter -// to track the reading order. -optionKeys.forEach((property) => - Object.defineProperty(opt, property, { - get() { - readKeys[readKeys.length] = property; - return undefined; - }, - })); -let p = new Intl.DurationFormat(undefined, opt); -assert.compareArray( - readKeys, - ['numberingSystem', - 'style', - 'years', - 'yearsDisplay', - 'months', - 'monthsDisplay', - 'weeks', - 'weeksDisplay', - 'days', - 'daysDisplay', - 'hours', - 'hoursDisplay', - 'minutes', - 'minutesDisplay', - 'seconds', - 'secondsDisplay', - 'milliseconds', - 'millisecondsDisplay', - 'microseconds', - 'microsecondsDisplay', - 'nanoseconds', - 'nanosecondsDisplay']); diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js index 7f91288b31d9..c4a7c8b0a09c 100644 --- a/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js +++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js @@ -10,32 +10,40 @@ info: | 5. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow", "digital" », "long"). -includes: [compareArray.js] +includes: [compareArray.js, temporalHelpers.js] features: [Intl.DurationFormat] ---*/ var actual = []; -const options = { - get localeMatcher() { - actual.push("localeMatcher"); - return undefined; - }, - get numberingSystem() { - actual.push("numberingSystem"); - return undefined; - }, - get style() { - actual.push("style"); - return undefined; - }, -}; - const expected = [ - "localeMatcher", - "numberingSystem", - "style" + "get options.localeMatcher", + "get options.numberingSystem", + "get options.style", + "get options.years", + "get options.yearsDisplay", + "get options.months", + "get options.monthsDisplay", + "get options.weeks", + "get options.weeksDisplay", + "get options.days", + "get options.daysDisplay", + "get options.hours", + "get options.hoursDisplay", + "get options.minutes", + "get options.minutesDisplay", + "get options.seconds", + "get options.secondsDisplay", + "get options.milliseconds", + "get options.millisecondsDisplay", + "get options.microseconds", + "get options.microsecondsDisplay", + "get options.nanoseconds", + "get options.nanosecondsDisplay", + "get options.fractionalDigits", ]; +const options = TemporalHelpers.propertyBagObserver(actual, {}, "options"); + let nf = new Intl.DurationFormat(undefined, options); assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/FallbackSymbol/description.js b/JSTests/test262/test/intl402/FallbackSymbol/description.js new file mode 100644 index 000000000000..b32b72117694 --- /dev/null +++ b/JSTests/test262/test/intl402/FallbackSymbol/description.js @@ -0,0 +1,22 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: intl-object +description: "%Intl%.[[FallbackSymbol]] description" +info: | + The Intl object: + - has a [[FallbackSymbol]] internal slot, which is a new %Symbol% in the + current realm with the [[Description]] *"IntlLegacyConstructedSymbol"*. +features: [intl-normative-optional] +---*/ + +const fallbackDTF = Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)); +const symbolProps = Object.getOwnPropertySymbols(fallbackDTF); +const fallbackSymbol = symbolProps.find((sym) => sym.description === "IntlLegacyConstructedSymbol"); + +assert.notSameValue( + fallbackSymbol, + undefined, + "%Intl%.[[FallbackSymbol]] with description IntlLegacyConstructedSymbol should exist" +); diff --git a/JSTests/test262/test/intl402/FallbackSymbol/per-realm.js b/JSTests/test262/test/intl402/FallbackSymbol/per-realm.js new file mode 100644 index 000000000000..66c64064d62e --- /dev/null +++ b/JSTests/test262/test/intl402/FallbackSymbol/per-realm.js @@ -0,0 +1,29 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: intl-object +description: "%Intl%.[[FallbackSymbol]] is per-realm" +info: | + The Intl object: + - has a [[FallbackSymbol]] internal slot, which is a new %Symbol% in the + current realm with the [[Description]] *"IntlLegacyConstructedSymbol"*. +features: [intl-normative-optional] +---*/ + +const fallbackDTF = Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)); +const symbolProps = Object.getOwnPropertySymbols(fallbackDTF); +const fallbackSymbol = symbolProps.find((sym) => sym.description === "IntlLegacyConstructedSymbol"); + +assert.notSameValue(fallbackSymbol, undefined, "%Intl%.[[FallbackSymbol]] should exist in original realm"); + +const other = $262.createRealm(); +const otherFallbackSymbol = other.evalScript(` + const fallbackDTF = Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)); + const symbolProps = Object.getOwnPropertySymbols(fallbackDTF); + symbolProps.find((sym) => sym.description === "IntlLegacyConstructedSymbol"); +`); + +assert.notSameValue(otherFallbackSymbol, undefined, "%Intl%.[[FallbackSymbol]] should exist in new realm"); + +assert.notSameValue(fallbackSymbol, otherFallbackSymbol, "%Intl%.[[FallbackSymbol]] should be different per-realm"); diff --git a/JSTests/test262/test/intl402/Locale/constructor-options-throwing-getters.js b/JSTests/test262/test/intl402/Locale/constructor-options-throwing-getters.js index ba5fb0b4f61b..4c0936f7f905 100644 --- a/JSTests/test262/test/intl402/Locale/constructor-options-throwing-getters.js +++ b/JSTests/test262/test/intl402/Locale/constructor-options-throwing-getters.js @@ -4,7 +4,8 @@ /*--- esid: sec-Intl.Locale description: Checks the propagation of exceptions from the options for the Locale constructor. -features: [Intl.Locale] +features: [Intl.Locale, Intl.Locale-info] +locale: [en] ---*/ function CustomError() {} @@ -16,6 +17,7 @@ const options = [ "variants", "calendar", "collation", + "firstDayOfWeek", "hourCycle", "caseFirst", "numeric", diff --git a/JSTests/test262/test/intl402/Number/prototype/toLocaleString/default-options-object-prototype.js b/JSTests/test262/test/intl402/Number/prototype/toLocaleString/default-options-object-prototype.js index 8fc923078b18..a8198d99014f 100644 --- a/JSTests/test262/test/intl402/Number/prototype/toLocaleString/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/Number/prototype/toLocaleString/default-options-object-prototype.js @@ -2,12 +2,12 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Monkey-patching Object.prototype does not change the default options for NumberFormat as a null prototype is used. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) 1. If _options_ is *undefined*, then 1. Let _options_ be ObjectCreate(*null*). diff --git a/JSTests/test262/test/intl402/NumberFormat/casing-numbering-system-options.js b/JSTests/test262/test/intl402/NumberFormat/casing-numbering-system-options.js index 79d780e85651..92bb7ecc8171 100644 --- a/JSTests/test262/test/intl402/NumberFormat/casing-numbering-system-options.js +++ b/JSTests/test262/test/intl402/NumberFormat/casing-numbering-system-options.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options numberingSystem are mapped to lower case. author: Caio Lima diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-compact.js b/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-compact.js index fe578299bfeb..7af2abfab26c 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-compact.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-compact.js @@ -2,16 +2,16 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the compactDisplay option to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) - 19. Let compactDisplay be ? GetOption(options, "compactDisplay", "string", « "short", "long" », "short"). - 20. If notation is "compact", then - a. Set numberFormat.[[CompactDisplay]] to compactDisplay. + 1. Let _compactDisplay_ be ? GetOption(_options_, *"compactDisplay"*, + ~string~, « *"short"*, *"long"* », *"short"*). + 1. If _notation_ is *"compact"*, then + 1. Set _numberFormat_.[[CompactDisplay]] to _compactDisplay_. -includes: [compareArray.js] features: [Intl.NumberFormat-unified] ---*/ @@ -22,23 +22,8 @@ const values = [ ]; for (const [value, expected = value] of values) { - const callOrder = []; - const nf = new Intl.NumberFormat([], { - get notation() { - callOrder.push("notation"); - return "compact"; - }, - get compactDisplay() { - callOrder.push("compactDisplay"); - return value; - } - }); + const nf = new Intl.NumberFormat([], { notation: "compact", compactDisplay: value }); const resolvedOptions = nf.resolvedOptions(); assert.sameValue("compactDisplay" in resolvedOptions, true); assert.sameValue(resolvedOptions.compactDisplay, expected); - - assert.compareArray(callOrder, [ - "notation", - "compactDisplay", - ]); } diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-no-compact.js b/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-no-compact.js index af94ac1c2fe6..6a9063ce74f0 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-no-compact.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-compactDisplay-no-compact.js @@ -2,52 +2,24 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the compactDisplay option to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) - 19. Let compactDisplay be ? GetOption(options, "compactDisplay", "string", « "short", "long" », "short"). - 20. If notation is "compact", then - a. Set numberFormat.[[CompactDisplay]] to compactDisplay. + 1. Let _compactDisplay_ be ? GetOption(_options_, *"compactDisplay"*, + ~string~, « *"short"*, *"long"* », *"short"*). + 1. If _notation_ is *"compact"*, then + 1. Set _numberFormat_.[[CompactDisplay]] to _compactDisplay_. -includes: [compareArray.js] features: [Intl.NumberFormat-unified] ---*/ -const values = [ - [undefined, "short"], - ["short"], - ["long"], -]; - -const notations = [ - undefined, - "standard", - "scientific", - "engineering", -]; - -for (const notation of notations) { - for (const [value, expected = value] of values) { - const callOrder = []; - const nf = new Intl.NumberFormat([], { - get notation() { - callOrder.push("notation"); - return notation; - }, - get compactDisplay() { - callOrder.push("compactDisplay"); - return value; - } - }); +for (const notation of [undefined, "standard", "scientific", "engineering"]) { + for (const value of [undefined, "short", "long"]) { + const nf = new Intl.NumberFormat([], { notation, compactDisplay: value }); const resolvedOptions = nf.resolvedOptions(); assert.sameValue("compactDisplay" in resolvedOptions, false); assert.sameValue(resolvedOptions.compactDisplay, undefined); - - assert.compareArray(callOrder, [ - "notation", - "compactDisplay", - ]); } } diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-default-value.js b/JSTests/test262/test/intl402/NumberFormat/constructor-default-value.js index 01634ed5e6d7..fc63680bdb6c 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-default-value.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-default-value.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the constructor for Intl.NumberFormat uses appropriate default values for its arguments (locales and options). diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-arraylike.js b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-arraylike.js index d065d26c4f60..b3d13452b963 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-arraylike.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-arraylike.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the Intl.NumberFormat constructor accepts Array-like values for the locales argument and treats them well. diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-get-tostring.js b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-get-tostring.js index a8e3f4898a5f..2b8d0bf79228 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-get-tostring.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-get-tostring.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that Get(O, P) and ToString(arg) are properly called within the constructor for Intl.NumberFormat diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-hasproperty.js b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-hasproperty.js index e0d0e39464a6..b5f574f3a726 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-hasproperty.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-hasproperty.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that HasProperty(O, Pk) is properly called within the constructor for Intl.NumberFormat diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-string.js b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-string.js index b0baa3a0843f..8b2aea2c4f37 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-string.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-string.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that passing a string value to the Intl.NumberFormat constructor is equivalent to passing an Array containing the same string value. diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-toobject.js b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-toobject.js index 3d2625191bee..04b007a21951 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-locales-toobject.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-locales-toobject.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > - Tests that Intl.NumberFormat contructor converts the locales argument + Tests that Intl.NumberFormat constructor converts the locales argument to an object using `ToObject` (7.1.13). info: | 9.2.1 CanonicalizeLocaleList diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-notation.js b/JSTests/test262/test/intl402/NumberFormat/constructor-notation.js index 1aa16ff39174..2f7f3fa2a519 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-notation.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-notation.js @@ -2,13 +2,15 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the notation option to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) - 16. Let notation be ? GetOption(options, "notation", "string", « "standard", "scientific", "engineering", "compact" », "standard"). - 17. Set numberFormat.[[Notation]] to notation. + 1. Let _notation_ be ? GetOption(_options_, *"notation"*, ~string~, + « *"standard"*, *"scientific"*, *"engineering"*, *"compact"* », + *"standard"*). + 1. Set _numberFormat_.[[Notation]] to _notation_. features: [Intl.NumberFormat-unified] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-numberingSystem-order.js b/JSTests/test262/test/intl402/NumberFormat/constructor-numberingSystem-order.js deleted file mode 100644 index b99b037f3927..000000000000 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-numberingSystem-order.js +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2019 Google Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-initializenumberformat -description: > - Checks the order of getting "numberingSystem" option in the - NumberFormat is between "localeMatcher" and "style" options. -info: | - InitializeNumberFormat ( _numberFormat_, _locales_, _options_ ) - - 5. Let _matcher_ be ? GetOption(_options_, `"localeMatcher"`, `"string"`, « `"lookup"`, `"best fit"` », `"best fit"`). - ... - 7. Let _numberingSystem_ be ? GetOption(_options_, `"numberingSystem"`, `"string"`, *undefined*, *undefined*). - ... - 17. Let _style_ be ? GetOption(_options_, `"style"`, `"string"`, « `"decimal"`, `"percent"`, `"currency"` », `"decimal"`). -includes: [compareArray.js] ----*/ - -var actual = []; - -const options = { - get localeMatcher() { - actual.push("localeMatcher"); - return undefined; - }, - get numberingSystem() { - actual.push("numberingSystem"); - return undefined; - }, - get style() { - actual.push("style"); - return undefined; - }, -}; - -const expected = [ - "localeMatcher", - "numberingSystem", - "style" -]; - -let nf = new Intl.NumberFormat(undefined, options); -assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-option-read-order.js b/JSTests/test262/test/intl402/NumberFormat/constructor-option-read-order.js index 7eff141a9ccc..f76af33916e7 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-option-read-order.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-option-read-order.js @@ -2,54 +2,44 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat -description: Checks the order of option read. -features: [Intl.NumberFormat-v3] -includes: [compareArray.js] +esid: sec-intl.numberformat +description: Checks the order of options read. +features: [Intl.NumberFormat-unified, Intl.NumberFormat-v3] +includes: [compareArray.js, temporalHelpers.js] ---*/ let optionKeys = [ - // Inside InitializeNumberFormat - "localeMatcher", - "numberingSystem", + // Inside new NumberFormat() + "get options.localeMatcher", + "get options.numberingSystem", // Inside SetNumberFormatUnitOptions - "style", - "currency", - "currencyDisplay", - "currencySign", - "unit", - "unitDisplay", + "get options.style", + "get options.currency", + "get options.currencyDisplay", + "get options.currencySign", + "get options.unit", + "get options.unitDisplay", // End of SetNumberFormatUnitOptions - // Back to InitializeNumberFormat - "notation", + // Back to new NumberFormat() + "get options.notation", // Inside SetNumberFormatDigitOptions - "minimumIntegerDigits", - "minimumFractionDigits", - "maximumFractionDigits", - "minimumSignificantDigits", - "maximumSignificantDigits", - "roundingIncrement", - "roundingMode", - "roundingPriority", - "trailingZeroDisplay", + "get options.minimumIntegerDigits", + "get options.minimumFractionDigits", + "get options.maximumFractionDigits", + "get options.minimumSignificantDigits", + "get options.maximumSignificantDigits", + "get options.roundingIncrement", + "get options.roundingMode", + "get options.roundingPriority", + "get options.trailingZeroDisplay", // End of SetNumberFormatDigitOptions - // Back to InitializeNumberFormat - "compactDisplay", - "useGrouping", - "signDisplay" + // Back to new NumberFormat() + "get options.compactDisplay", + "get options.useGrouping", + "get options.signDisplay" ]; -// Use getters to track the order of reading known properties. -// TODO: Should we use a Proxy to detect *unexpected* property reads? -let reads = new Array(); -let options = {}; -optionKeys.forEach((key) => { - Object.defineProperty(options, key, { - get() { - reads.push(key); - return undefined; - }, - }); -}); +let reads = []; +let options = TemporalHelpers.propertyBagObserver(reads, {}, "options"); new Intl.NumberFormat(undefined, options); assert.compareArray(reads, optionKeys, "Intl.NumberFormat options read order"); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-numberingSystem-invalid.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-numberingSystem-invalid.js index bb9167e5bb53..103f4e467ade 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-numberingSystem-invalid.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-options-numberingSystem-invalid.js @@ -2,15 +2,16 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Checks error cases for the options argument to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + ResolveOptions ( constructor, localeData, locales, options [ , specialBehaviours [ , modifyResolutionOptions ] ] ) - ... - 8. If numberingSystem is not undefined, then - a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception. + 1. If _value_ is not *undefined*, then + 1. ... + 1. If _value_ cannot be matched by the `type` Unicode locale nonterminal, + throw a *RangeError* exception. ---*/ /* diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-roundingMode-invalid.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-roundingMode-invalid.js index 3fea7f7c6bce..500d52582221 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-roundingMode-invalid.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-options-roundingMode-invalid.js @@ -1,7 +1,7 @@ // Copyright 2021 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Abrupt completion from invalid values for `roundingMode` features: [Intl.NumberFormat-v3] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-increment.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-increment.js deleted file mode 100644 index 9e3d024c794d..000000000000 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-increment.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -esid: sec-initializenumberformat -description: > - Exception from accessing the "roundingIncrement" option for the NumberFormat - constructor should be propagated to the caller -features: [Intl.NumberFormat-v3] ----*/ - -assert.throws(Test262Error, function() { - new Intl.NumberFormat('en', { - get roundingIncrement() { - throw new Test262Error(); - } - }); -}); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-mode.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-mode.js deleted file mode 100644 index a6eedd84f203..000000000000 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-mode.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -esid: sec-initializenumberformat -description: > - Exception from accessing the "roundingMode" option for the NumberFormat - constructor should be propagated to the caller -features: [Intl.NumberFormat-v3] ----*/ - -assert.throws(Test262Error, function() { - new Intl.NumberFormat('en', { - get roundingMode() { - throw new Test262Error(); - } - }); -}); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-priority.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-priority.js deleted file mode 100644 index 7225dd2f7778..000000000000 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-rounding-priority.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -esid: sec-initializenumberformat -description: > - Exception from accessing the "roundingPriority" option for the NumberFormat - constructor should be propagated to the caller -features: [Intl.NumberFormat-v3] ----*/ - -assert.throws(Test262Error, function() { - new Intl.NumberFormat('en', { - get roundingPriority() { - throw new Test262Error(); - } - }); -}); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-trailing-zero-display.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-trailing-zero-display.js deleted file mode 100644 index 8c361fefb65d..000000000000 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters-trailing-zero-display.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -esid: sec-initializenumberformat -description: > - Exception from accessing the "trailingZeroDisplay" option for the - NumberFormat constructor should be propagated to the caller -features: [Intl.NumberFormat-v3] ----*/ - -assert.throws(Test262Error, function() { - new Intl.NumberFormat('en', { - get trailingZeroDisplay() { - throw new Test262Error(); - } - }); -}); diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters.js index 2fa894b5e672..a0e36a1dcef8 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-options-throwing-getters.js @@ -2,8 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks the propagation of exceptions from the options for the NumberFormat constructor. +features: [Intl.NumberFormat-v3] ---*/ function CustomError() {} @@ -14,12 +15,22 @@ const options = [ "style", "currency", "currencyDisplay", + "currencySign", + "unit", + "unitDisplay", + "notation", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits", + "roundingIncrement", + "roundingMode", + "roundingPriority", + "trailingZeroDisplay", "useGrouping", + "compactDisplay", + "signDisplay", ]; for (const option of options) { diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-options-toobject.js b/JSTests/test262/test/intl402/NumberFormat/constructor-options-toobject.js index 43f5d10edf1b..a85088d7c646 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-options-toobject.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-options-toobject.js @@ -2,14 +2,10 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > - Tests that Intl.NumberFormat contructor converts the options argument - to an object using `ToObject` (7.1.13). -info: | - 11.1.2 InitializeNumberFormat - - 3.a. Let options be ? ToObject(options). + Tests that Intl.NumberFormat constructor converts the options argument to an + object. ---*/ const toObjectResults = [ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-order.js b/JSTests/test262/test/intl402/NumberFormat/constructor-order.js index 4cf169034590..85e454e81ff9 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-order.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-order.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the unit option with the currency style. info: | SetNumberFormatUnitOptions ( intlObj, options ) diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js index e92266498e42..19d38b58ce6a 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js @@ -2,7 +2,7 @@ // Copyright (C) 2022 Igalia, S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Rejects invalid values for roundingIncrement option. features: [Intl.NumberFormat-v3] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js index 95a4bd5ce284..055d689da4ac 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js @@ -1,7 +1,7 @@ // Copyright 2021 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the roundingIncrement option to the NumberFormat constructor. includes: [compareArray.js] features: [Intl.NumberFormat-v3] diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay-negative.js b/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay-negative.js index 224dc028e43b..ae3926194f1c 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay-negative.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay-negative.js @@ -1,13 +1,15 @@ // Copyright 2021 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the compactDisplay option to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) - 32. Let signDisplay be ? GetOption(options, "signDisplay", "string", « "auto", "never", "always", "exceptZero", "negative" », "auto"). - 33. Set numberFormat.[[SignDisplay]] to signDisplay. + 1. Let _signDisplay_ be ? GetOption(_options_, *"signDisplay"*, ~string~, + « *"auto"*, *"never"*, *"always"*, *"exceptZero"*, *"negative"* », + *"auto"*). + 1. Set _numberFormat_.[[SignDisplay]] to _signDisplay_. includes: [propertyHelper.js] features: [Intl.NumberFormat-v3] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay.js b/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay.js index e0b6825cbf0f..3a9014d5ae9d 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-signDisplay.js @@ -2,13 +2,15 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the compactDisplay option to the NumberFormat constructor. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) - 23. Let signDisplay be ? GetOption(options, "signDisplay", "string", « "auto", "never", "always", "exceptZero" », "auto"). - 24. Set numberFormat.[[SignDisplay]] to signDisplay. + 1. Let _signDisplay_ be ? GetOption(_options_, *"signDisplay"*, ~string~, + « *"auto"*, *"never"*, *"always"*, *"exceptZero"*, *"negative"* », + *"auto"*). + 1. Set _numberFormat_.[[SignDisplay]] to _signDisplay_. features: [Intl.NumberFormat-unified] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay-invalid.js b/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay-invalid.js index 15a5a2269c8b..b7ec3cb2e20f 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay-invalid.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay-invalid.js @@ -1,7 +1,7 @@ // Copyright 2021 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Rejects invalid values for trailingZeroDisplay option. features: [Intl.NumberFormat-v3] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay.js b/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay.js index 92ab90ad3b80..9546c43ecfb4 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-trailingZeroDisplay.js @@ -1,7 +1,7 @@ // Copyright 2021 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the trailingZeroDisplay option to the NumberFormat constructor. includes: [compareArray.js] features: [Intl.NumberFormat-v3] diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-unit.js b/JSTests/test262/test/intl402/NumberFormat/constructor-unit.js index 555a07641033..fc25e6d5bb8b 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-unit.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-unit.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Checks handling of the unit style. includes: [testIntl.js] features: [Intl.NumberFormat-unified] diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-unitDisplay.js b/JSTests/test262/test/intl402/NumberFormat/constructor-unitDisplay.js index 033705ebef98..0a454c1ad747 100644 --- a/JSTests/test262/test/intl402/NumberFormat/constructor-unitDisplay.js +++ b/JSTests/test262/test/intl402/NumberFormat/constructor-unitDisplay.js @@ -2,14 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat -description: Checks handling of the compactDisplay option to the NumberFormat constructor. -info: | - InitializeNumberFormat ( numberFormat, locales, options ) - - 23. Let signDisplay be ? GetOption(options, "signDisplay", "string", « "auto", "never", "always", "exceptZero" », "auto"). - 24. Set numberFormat.[[SignDisplay]] to signDisplay. - +esid: sec-intl.numberformat +description: > + Checks handling of the unitDisplay option to the NumberFormat constructor. features: [Intl.NumberFormat-unified] ---*/ diff --git a/JSTests/test262/test/intl402/NumberFormat/default-options-object-prototype.js b/JSTests/test262/test/intl402/NumberFormat/default-options-object-prototype.js index 11356ea45781..e1c35a6792ab 100644 --- a/JSTests/test262/test/intl402/NumberFormat/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/NumberFormat/default-options-object-prototype.js @@ -2,12 +2,12 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Monkey-patching Object.prototype does not change the default options for NumberFormat as a null prototype is used. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + Intl.NumberFormat ( [ locales [ , options ] ] ) 1. If _options_ is *undefined*, then 1. Let _options_ be ObjectCreate(*null*). diff --git a/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-on-unwrap.js b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-on-unwrap.js index f38c12fbb1ff..283be9c666b4 100644 --- a/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-on-unwrap.js +++ b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-on-unwrap.js @@ -12,21 +12,14 @@ features: [intl-normative-optional] let object = new Intl.NumberFormat(); let newObject = Intl.NumberFormat.call(object); let symbol = null; -let error = null; -try { - let proxy = new Proxy(newObject, { - get(target, property) { - symbol = property; - return target[property]; - } - }); - Intl.NumberFormat.prototype.resolvedOptions.call(proxy); -} catch (e) { - // If normative optional is not implemented, an error will be thrown. - error = e; - assert(error instanceof TypeError); -} -if (error === null) { - assert.sameValue(typeof symbol, "symbol"); - assert.sameValue(symbol.description, "IntlLegacyConstructedSymbol"); -} + +let proxy = new Proxy(newObject, { + get(target, property) { + symbol = property; + return target[property]; + } +}); +Intl.NumberFormat.prototype.resolvedOptions.call(proxy); + +assert.sameValue(typeof symbol, "symbol"); +assert.sameValue(symbol.description, "IntlLegacyConstructedSymbol"); diff --git a/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-property.js b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-property.js new file mode 100644 index 000000000000..b297e3a909a5 --- /dev/null +++ b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol-property.js @@ -0,0 +1,37 @@ +// Copyright 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.numberformat +description: Property descriptor of %Intl%.[[FallbackSymbol]] +info: | + ChainNumberFormat ( numberFormat, newTarget, this ) + + 1.a. Perform ? DefinePropertyOrThrow(_this_, %Intl%.[[FallbackSymbol]], + PropertyDescriptor{ [[Value]]: _numberFormat_, [[Writable]]: *false*, + [[Enumerable]]: *false*, [[Configurable]]: *false* }). +includes: [propertyHelper.js] +features: [intl-normative-optional] +---*/ + +const object = Object.create(Intl.NumberFormat.prototype); +const fallbackNF = Intl.NumberFormat.call(object); +assert.sameValue(object, fallbackNF, "return value of Intl.NumberFormat constructor"); + +const symbolProps = Object.getOwnPropertySymbols(fallbackNF); +const fallbackSymbol = symbolProps.find((sym) => sym.description === "IntlLegacyConstructedSymbol"); + +assert( + fallbackNF[fallbackSymbol] instanceof Intl.NumberFormat, + "value of legacy symbol property must be an Intl.NumberFormat" +); +verifyProperty( + fallbackNF, + fallbackSymbol, + { + writable: false, + enumerable: false, + configurable: false + }, + { label: "%Intl%.[[FallbackSymbol]]" } +); diff --git a/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol.js b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol.js index 13726abf99aa..747a75665676 100644 --- a/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol.js +++ b/JSTests/test262/test/intl402/NumberFormat/intl-legacy-constructed-symbol.js @@ -12,7 +12,5 @@ features: [intl-normative-optional] let object = new Intl.NumberFormat(); let newObject = Intl.NumberFormat.call(object); let symbols = Object.getOwnPropertySymbols(newObject); -if (symbols.length !== 0) { - assert.sameValue(symbols.length, 1); - assert.sameValue(symbols[0].description, "IntlLegacyConstructedSymbol"); -} + +assert(symbols.some((symbol) => symbol.description === "IntlLegacyConstructedSymbol")); diff --git a/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js b/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js index e1ecf45a390c..04a768991ec2 100644 --- a/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js +++ b/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options numberingSystem and calendar can be set through either the locale or the options. diff --git a/JSTests/test262/test/intl402/NumberFormat/test-option-useGrouping-extended.js b/JSTests/test262/test/intl402/NumberFormat/test-option-useGrouping-extended.js index 2cec7fb601d1..08ca512fb814 100644 --- a/JSTests/test262/test/intl402/NumberFormat/test-option-useGrouping-extended.js +++ b/JSTests/test262/test/intl402/NumberFormat/test-option-useGrouping-extended.js @@ -4,7 +4,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: Tests that the option useGrouping is processed correctly. info: | The "Intl.NumberFormat v3" proposal contradicts the behavior required by the diff --git a/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-over-limit.js b/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-over-limit.js index f1eaedfa227c..27d81b825d1b 100644 --- a/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-over-limit.js +++ b/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-over-limit.js @@ -2,17 +2,18 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options maximumFractionDigits limit to the range 0 - 100. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation ) - 25.a.ii. Set mxfd to ? DefaultNumberOption(mxfd, 0, 100, undefined). + 23.a.ii. Set _mxfd_ to ? DefaultNumberOption(_mxfd_, 0, 100, *undefined*). - DefaultNumberOption ( value, minimum, maximum, fallback ) + DefaultNumberOption ( value, minimum, maximum, fallback ) - 3. If value is NaN or less than minimum or greater than maximum, throw a RangeError exception. + 3. If _value_ is not finite or ℝ(_value_) < _minimum_ or ℝ(_value_) > + _maximum_, throw a *RangeError* exception. ---*/ let wontThrow = new Intl.NumberFormat(undefined, {maximumFractionDigits: 100}); diff --git a/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-under-limit.js b/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-under-limit.js index 760735699e97..a2995c2c9245 100644 --- a/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-under-limit.js +++ b/JSTests/test262/test/intl402/NumberFormat/throws-for-maximumFractionDigits-under-limit.js @@ -2,17 +2,18 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options maximumFractionDigits limit to the range 0 - 100. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation ) - 25.a.ii. Set mxfd to ? DefaultNumberOption(mxfd, 0, 100, undefined). + 23.a.ii. Set _mxfd_ to ? DefaultNumberOption(_mxfd_, 0, 100, *undefined*). - DefaultNumberOption ( value, minimum, maximum, fallback ) + DefaultNumberOption ( value, minimum, maximum, fallback ) - 3. If value is NaN or less than minimum or greater than maximum, throw a RangeError exception. + 3. If _value_ is not finite or ℝ(_value_) < _minimum_ or ℝ(_value_) > + _maximum_, throw a *RangeError* exception. ---*/ let wontThrow = new Intl.NumberFormat(undefined, {maximumFractionDigits: 0}); diff --git a/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-over-limit.js b/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-over-limit.js index 59905731dc16..ca8d8aaeb311 100644 --- a/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-over-limit.js +++ b/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-over-limit.js @@ -2,17 +2,18 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options minimumFractionDigits limit to the range 0 - 100. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation ) - 25.a.ii. Set mxfd to ? DefaultNumberOption(mxfd, 0, 100, undefined). + 23.a.i. Set _mnfd_ to ? DefaultNumberOption(_mnfd_, 0, 100, *undefined*). - DefaultNumberOption ( value, minimum, maximum, fallback ) + DefaultNumberOption ( value, minimum, maximum, fallback ) - 3. If value is NaN or less than minimum or greater than maximum, throw a RangeError exception. + 3. If _value_ is not finite or ℝ(_value_) < _minimum_ or ℝ(_value_) > + _maximum_, throw a *RangeError* exception. ---*/ let wontThrow = new Intl.NumberFormat(undefined, {minimumFractionDigits: 100}); diff --git a/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-under-limit.js b/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-under-limit.js index 80e286a93e6e..c7605b134901 100644 --- a/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-under-limit.js +++ b/JSTests/test262/test/intl402/NumberFormat/throws-for-minimumFractionDigits-under-limit.js @@ -2,17 +2,18 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializenumberformat +esid: sec-intl.numberformat description: > Tests that the options minimumFractionDigits limit to the range 0 - 100. info: | - InitializeNumberFormat ( numberFormat, locales, options ) + SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation ) - 25.a.ii. Set mxfd to ? DefaultNumberOption(mxfd, 0, 100, undefined). + 23.a.i. Set _mnfd_ to ? DefaultNumberOption(_mnfd_, 0, 100, *undefined*). - DefaultNumberOption ( value, minimum, maximum, fallback ) + DefaultNumberOption ( value, minimum, maximum, fallback ) - 3. If value is NaN or less than minimum or greater than maximum, throw a RangeError exception. + 3. If _value_ is not finite or ℝ(_value_) < _minimum_ or ℝ(_value_) > + _maximum_, throw a *RangeError* exception. ---*/ let wontThrow = new Intl.NumberFormat(undefined, {minimumFractionDigits: 0}); diff --git a/JSTests/test262/test/intl402/PluralRules/compactDisplay-undefined-unless-notation-compact.js b/JSTests/test262/test/intl402/PluralRules/compactDisplay-undefined-unless-notation-compact.js new file mode 100644 index 000000000000..abd5b8cb3682 --- /dev/null +++ b/JSTests/test262/test/intl402/PluralRules/compactDisplay-undefined-unless-notation-compact.js @@ -0,0 +1,50 @@ +// Copyright 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.pluralrules +description: compactDisplay option is only set when notation is compact +info: | + 17.4 Properties of Intl.PluralRules Instances + - [[CompactDisplay]] is one of *"short"*, *"long"*, or *undefined*, specifying + whether to display compact notation affixes in short form ("5K") or long + form ("5 thousand") if formatting with the *"compact"* notation, as this can + in some cases influence plural form selection. It is only *undefined* when + [[Notation]] has a value other than *"compact"*. +---*/ + +for (const compactDisplay of ["long", "short"]) { + const compact = new Intl.PluralRules(undefined, { notation: "compact", compactDisplay }); + const compactResolved = compact.resolvedOptions(); + + assert.sameValue(compactResolved.notation, "compact", `notation (compact, ${compactDisplay})`); + assert.sameValue(compactResolved.compactDisplay, compactDisplay, `compactDisplay (compact, ${compactDisplay})`); + + const undefinedNotation = new Intl.PluralRules(undefined, { compactDisplay }); + const undefinedResolved = undefinedNotation.resolvedOptions(); + + assert.sameValue(undefinedResolved.notation, "standard", "notation (standard is the default)"); + assert(!('compactDisplay' in undefinedResolved), `compactDisplay not defined for standard notation (undefined, ${compactDisplay})`); +} + +for (const notation of ["standard", "scientific", "engineering"]) { + for (const compactDisplay of ["long", "short", undefined]) { + const pr = new Intl.PluralRules(undefined, { notation, compactDisplay }); + const resolved = pr.resolvedOptions(); + + assert.sameValue(resolved.notation, notation, `notation (${notation}, ${compactDisplay})`); + assert(!('compactDisplay' in resolved), `compactDisplay not defined (${notation}, ${compactDisplay})`); + } +} + +const compactUndefined = new Intl.PluralRules(undefined, { notation: "compact" }); +const compactUndefinedResolved = compactUndefined.resolvedOptions(); + +assert.sameValue(compactUndefinedResolved.notation, "compact", `notation (compact, undefined)`); +assert.sameValue(compactUndefinedResolved.compactDisplay, "short", "compactDisplay (short is the default)"); + +const allUndefined = new Intl.PluralRules(); +const allUndefinedResolved = allUndefined.resolvedOptions(); + +assert.sameValue(allUndefinedResolved.notation, "standard", "notation (standard is the default)"); +assert(!('compactDisplay' in allUndefinedResolved), "compactDisplay not defined for standard notation"); diff --git a/JSTests/test262/test/intl402/PluralRules/constructor-option-read-order.js b/JSTests/test262/test/intl402/PluralRules/constructor-option-read-order.js index 3a3ca0912fa8..96d11ce6b86d 100644 --- a/JSTests/test262/test/intl402/PluralRules/constructor-option-read-order.js +++ b/JSTests/test262/test/intl402/PluralRules/constructor-option-read-order.js @@ -2,41 +2,32 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializepluralrules -description: Checks the order of option read. +esid: sec-intl.pluralrules +description: Checks the order of options read. features: [Intl.NumberFormat-v3] -includes: [compareArray.js] +includes: [compareArray.js, temporalHelpers.js] ---*/ let optionKeys = [ - // Inside InitializePluralRules - "localeMatcher", - "type", - "notation", + // Inside new PluralRules() + "get options.localeMatcher", + "get options.type", + "get options.notation", + "get options.compactDisplay", // Inside SetNumberFormatDigitOptions - "minimumIntegerDigits", - "minimumFractionDigits", - "maximumFractionDigits", - "minimumSignificantDigits", - "maximumSignificantDigits", - "roundingIncrement", - "roundingMode", - "roundingPriority", - "trailingZeroDisplay", + "get options.minimumIntegerDigits", + "get options.minimumFractionDigits", + "get options.maximumFractionDigits", + "get options.minimumSignificantDigits", + "get options.maximumSignificantDigits", + "get options.roundingIncrement", + "get options.roundingMode", + "get options.roundingPriority", + "get options.trailingZeroDisplay", // End of SetNumberFormatDigitOptions ]; -// Use getters to track the order of reading known properties. -// TODO: Should we use a Proxy to detect *unexpected* property reads? -let reads = new Array(); -let options = {}; -optionKeys.forEach((key) => { - Object.defineProperty(options, key, { - get() { - reads.push(key); - return undefined; - }, - }); -}); +const reads = []; +const options = TemporalHelpers.propertyBagObserver(reads, {}, "options"); new Intl.PluralRules(undefined, options); assert.compareArray(reads, optionKeys, "Intl.PluralRules options read order"); diff --git a/JSTests/test262/test/intl402/PluralRules/constructor-options-throwing-getters.js b/JSTests/test262/test/intl402/PluralRules/constructor-options-throwing-getters.js index c240cfc037cb..293eab9a4cf6 100644 --- a/JSTests/test262/test/intl402/PluralRules/constructor-options-throwing-getters.js +++ b/JSTests/test262/test/intl402/PluralRules/constructor-options-throwing-getters.js @@ -2,8 +2,11 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializepluralrules -description: Checks the propagation of exceptions from the options for the NumberFormat constructor. +esid: sec-intl.pluralrules +description: > + Checks the propagation of exceptions from the options for the PluralRules + constructor. +locale: [en] ---*/ function CustomError() {} @@ -12,11 +15,16 @@ const options = [ "localeMatcher", "type", "notation", + "compactDisplay", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits", + "roundingIncrement", + "roundingMode", + "roundingPriority", + "trailingZeroDisplay", ]; for (const option of options) { diff --git a/JSTests/test262/test/intl402/PluralRules/default-options-object-prototype.js b/JSTests/test262/test/intl402/PluralRules/default-options-object-prototype.js index 270ed8790ca5..9cc7628f08a7 100644 --- a/JSTests/test262/test/intl402/PluralRules/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/PluralRules/default-options-object-prototype.js @@ -2,15 +2,10 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializepluralrules +esid: sec-intl.pluralrules description: > Monkey-patching Object.prototype does not change the default options for PluralRules as a null prototype is used. -info: | - InitializePluralRules ( collator, locales, options ) - - 1. If _options_ is *undefined*, then - 1. Let _options_ be ObjectCreate(*null*). ---*/ Object.prototype.type = "ordinal"; diff --git a/JSTests/test262/test/intl402/PluralRules/notation.js b/JSTests/test262/test/intl402/PluralRules/notation.js index a0957aa511bd..4a447eb534d4 100644 --- a/JSTests/test262/test/intl402/PluralRules/notation.js +++ b/JSTests/test262/test/intl402/PluralRules/notation.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializepluralrules +esid: sec-intl.pluralrules description: Checks that the notation option is picked up correctly. info: | Intl.PluralRules ( [ _locales_ [ , _options_ ] ] ) diff --git a/JSTests/test262/test/intl402/PluralRules/proto-from-ctor-realm.js b/JSTests/test262/test/intl402/PluralRules/proto-from-ctor-realm.js index 7cc7a934d738..6c21914d7da1 100644 --- a/JSTests/test262/test/intl402/PluralRules/proto-from-ctor-realm.js +++ b/JSTests/test262/test/intl402/PluralRules/proto-from-ctor-realm.js @@ -9,7 +9,6 @@ info: | 1. If NewTarget is undefined, throw a TypeError exception. 2. Let pluralRules be ? OrdinaryCreateFromConstructor(newTarget, "%PluralRulesPrototype%", « ... »). - 3. Return ? InitializePluralRules(pluralRules, locales, options). OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) diff --git a/JSTests/test262/test/intl402/PluralRules/prototype/select/tainting.js b/JSTests/test262/test/intl402/PluralRules/prototype/select/tainting.js index e69732839b90..3684bc96942c 100644 --- a/JSTests/test262/test/intl402/PluralRules/prototype/select/tainting.js +++ b/JSTests/test262/test/intl402/PluralRules/prototype/select/tainting.js @@ -7,9 +7,10 @@ description: > Tests that the behavior of a Record is not affected by adversarial changes to Object.prototype. info: | - 1.1.1. InitializePluralRules (pluralRules, locales, options) - (...) - 1.1.1_6. Let t be ? GetOption(options, "type", "string", « "cardinal", "ordinal" », "cardinal"). + Intl.PluralRules ( [ locales [ , options ] ] ) + + 1. Let _t_ be ? GetOption(_options_, *"type"*, ~string~, « *"cardinal"*, + *"ordinal"* », *"cardinal"*). author: Zibi Braniecki includes: [testIntl.js] ---*/ diff --git a/JSTests/test262/test/intl402/String/prototype/localeCompare/default-options-object-prototype.js b/JSTests/test262/test/intl402/String/prototype/localeCompare/default-options-object-prototype.js index 3ef0b8606f6b..6fbfe9b295ec 100644 --- a/JSTests/test262/test/intl402/String/prototype/localeCompare/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/String/prototype/localeCompare/default-options-object-prototype.js @@ -2,15 +2,10 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-initializecollator +esid: sec-intl.collator description: > Monkey-patching Object.prototype does not change the default options for Collator as a null prototype is used. -info: | - InitializeCollator ( collator, locales, options ) - - 1. If _options_ is *undefined*, then - 1. Let _options_ be ObjectCreate(*null*). ---*/ if (new Intl.Collator("en").resolvedOptions().locale === "en") { diff --git a/JSTests/test262/test/intl402/Temporal/PlainDate/compare/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDate/compare/future-calendar.js new file mode 100644 index 000000000000..91e02b7e67e8 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDate/compare/future-calendar.js @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.compare +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDate(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainDate.compare(`1970-01-01[u-ca=${calendar}]`, okDate); + }, `${calendar} is not yet supported (first argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainDate.compare({ year: 1970, month: 1, day: 1, calendar }, okDate); + }, `${calendar} is not yet supported (first argument, property bag)`); + assert.throws(RangeError, function () { + Temporal.PlainDate.compare(okDate, `1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (second argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainDate.compare(okDate, { year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (second argument, property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDate/from/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDate/from/future-calendar.js new file mode 100644 index 000000000000..c34c2013672b --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDate/from/future-calendar.js @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.from +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainDate.from(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + Temporal.PlainDate.from({ year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDate/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDate/future-calendar.js new file mode 100644 index 000000000000..74815358e0dd --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDate/future-calendar.js @@ -0,0 +1,15 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + new Temporal.PlainDate(1970, 1, 1, calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/equals/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/equals/future-calendar.js new file mode 100644 index 000000000000..045201b56b33 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/equals/future-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.equals +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDate(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.equals(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + okDate.equals({ year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/withCalendar/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/withCalendar/future-calendar.js new file mode 100644 index 000000000000..6ef223a8aeeb --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDate/prototype/withCalendar/future-calendar.js @@ -0,0 +1,17 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.prototype.withcalendar +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDate(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.withCalendar(calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/compare/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/compare/future-calendar.js new file mode 100644 index 000000000000..fdfe8f7f8b6c --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/compare/future-calendar.js @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.compare +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDateTime(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainDateTime.compare(`1970-01-01[u-ca=${calendar}]`, okDate); + }, `${calendar} is not yet supported (first argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainDateTime.compare({ year: 1970, month: 1, day: 1, calendar }, okDate); + }, `${calendar} is not yet supported (first argument, property bag)`); + assert.throws(RangeError, function () { + Temporal.PlainDateTime.compare(okDate, `1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (second argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainDateTime.compare(okDate, { year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (second argument, property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/from/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/from/future-calendar.js new file mode 100644 index 000000000000..ef2a5b4391ab --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/from/future-calendar.js @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.from +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainDateTime.from(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + Temporal.PlainDateTime.from({ year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/future-calendar.js new file mode 100644 index 000000000000..7a8e28cb9bec --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/future-calendar.js @@ -0,0 +1,15 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + new Temporal.PlainDateTime(1970, 1, 1, 0, 0, 0, 0, 0, 0, calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/equals/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/equals/future-calendar.js new file mode 100644 index 000000000000..edbbd5ba0df1 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/equals/future-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.equals +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDateTime(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.equals(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + okDate.equals({ year: 1970, month: 1, day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withCalendar/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withCalendar/future-calendar.js new file mode 100644 index 000000000000..3c04c90f8891 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withCalendar/future-calendar.js @@ -0,0 +1,17 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.withcalendar +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainDateTime(1970, 1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.withCalendar(calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainMonthDay/from/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/from/future-calendar.js new file mode 100644 index 000000000000..67822b6486ab --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/from/future-calendar.js @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainmonthday.from +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainMonthDay.from(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + Temporal.PlainMonthDay.from({ monthCode: "M01", day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainMonthDay/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/future-calendar.js new file mode 100644 index 000000000000..3e790b941712 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/future-calendar.js @@ -0,0 +1,15 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainmonthday +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + new Temporal.PlainMonthDay(1, 1, calendar, 1970); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/equals/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/equals/future-calendar.js new file mode 100644 index 000000000000..cada985c9227 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/equals/future-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainmonthday.prototype.equals +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainMonthDay(1, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.equals(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + okDate.equals({ monthCode: "M01", day: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString/basic.js b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString/basic.js index 6227fd6e5a37..26c47dddbe33 100644 --- a/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString/basic.js +++ b/JSTests/test262/test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString/basic.js @@ -28,6 +28,7 @@ info: | d. Perform ! CreateDataPropertyOrThrow(result, ! ToString(𝔽(n)), O). e. Increment n by 1. 5. Return result. +features: [Temporal] locale: [en-US, de-AT] ---*/ diff --git a/JSTests/test262/test/intl402/Temporal/PlainYearMonth/compare/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/compare/future-calendar.js new file mode 100644 index 000000000000..b866e7675ba9 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/compare/future-calendar.js @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.compare +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainYearMonth(1970, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.compare(`1970-01-01[u-ca=${calendar}]`, okDate); + }, `${calendar} is not yet supported (first argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.compare({ year: 1970, month: 1, calendar }, okDate); + }, `${calendar} is not yet supported (first argument, property bag)`); + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.compare(okDate, `1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (second argument, string)`); + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.compare(okDate, { year: 1970, month: 1, calendar }); + }, `${calendar} is not yet supported (second argument, property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainYearMonth/from/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/from/future-calendar.js new file mode 100644 index 000000000000..7b5f62bfbd7d --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/from/future-calendar.js @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.from +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.from(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + Temporal.PlainYearMonth.from({ year: 1970, month: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainYearMonth/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/future-calendar.js new file mode 100644 index 000000000000..88cd89d014f0 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/future-calendar.js @@ -0,0 +1,15 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + new Temporal.PlainYearMonth(1970, 1, calendar, 1); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/PlainYearMonth/prototype/equals/future-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/prototype/equals/future-calendar.js new file mode 100644 index 000000000000..7d348e8008dd --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/PlainYearMonth/prototype/equals/future-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.prototype.equals +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.PlainYearMonth(1970, 1); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.equals(`1970-01-01[u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + okDate.equals({ year: 1970, month: 1, calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/compare/future-calendar.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/compare/future-calendar.js new file mode 100644 index 000000000000..eae30935d5a9 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/compare/future-calendar.js @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.compare +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.ZonedDateTime(0n, "UTC"); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.compare(`1970-01-01[UTC][u-ca=${calendar}]`, okDate); + }, `${calendar} is not yet supported (first argument, string)`); + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.compare({ year: 1970, month: 1, day: 1, timeZone: "UTC", calendar }, okDate); + }, `${calendar} is not yet supported (first argument, property bag)`); + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.compare(okDate, `1970-01-01[UTC][u-ca=${calendar}]`); + }, `${calendar} is not yet supported (second argument, string)`); + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.compare(okDate, { year: 1970, month: 1, day: 1, timeZone: "UTC", calendar }); + }, `${calendar} is not yet supported (second argument, property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/from/future-calendar.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/from/future-calendar.js new file mode 100644 index 000000000000..3cad10c270e9 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/from/future-calendar.js @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.from +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.from(`1970-01-01[UTC][u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + Temporal.ZonedDateTime.from({ year: 1970, month: 1, day: 1, timeZone: "UTC", calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/future-calendar.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/future-calendar.js new file mode 100644 index 000000000000..682fbeeeb0d8 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/future-calendar.js @@ -0,0 +1,15 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + new Temporal.ZonedDateTime(0n, "UTC", calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/equals/future-calendar.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/equals/future-calendar.js new file mode 100644 index 000000000000..66af5eef3825 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/equals/future-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.prototype.equals +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.ZonedDateTime(0n, "UTC"); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.equals(`1970-01-01[UTC][u-ca=${calendar}]`); + }, `${calendar} is not yet supported (string)`); + assert.throws(RangeError, function () { + okDate.equals({ year: 1970, month: 1, day: 1, timeZone: "UTC", calendar }); + }, `${calendar} is not yet supported (property bag)`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js index 743dd3be44ca..a02eb3741aed 100644 --- a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/hoursInDay/same-date-starts-twice.js @@ -4,6 +4,7 @@ /*--- esid: sec-temporal.zoneddatetime.prototype.hoursinday description: Handles dates with offset transitions where midnight occurs twice. +includes: [temporalHelpers.js] features: [Temporal] ---*/ @@ -17,3 +18,23 @@ const zdt3 = Temporal.ZonedDateTime.from('2010-11-08T23:00:00-03:30[America/St_J assert.sameValue(zdt1.hoursInDay, 24); assert.sameValue(zdt2.hoursInDay, 25); assert.sameValue(zdt3.hoursInDay, 24); + +const zdt4 = Temporal.ZonedDateTime.from("2010-03-04T23:10:00+11:00[Antarctica/Casey]"); +const zdt5 = Temporal.ZonedDateTime.from("2010-03-05T00:45:00+11:00[Antarctica/Casey]"); +// 3h backwards shift from +11 to +08 at 2010-03-05 02:00 +const zdt6 = Temporal.ZonedDateTime.from("2010-03-04T23:10:00+08:00[Antarctica/Casey]"); +const zdt7 = Temporal.ZonedDateTime.from("2010-03-05T00:45:00+08:00[Antarctica/Casey]"); + +assert.sameValue(zdt4.hoursInDay, 24, "March 4 has 24 hours (excluding discontiguous piece)"); +assert.sameValue(zdt5.hoursInDay, 27, "March 5 has 27 hours (calculated from discontiguous piece)"); +assert.sameValue(zdt6.hoursInDay, 24, "March 4 has 24 hours (calculated from discontiguous piece)"); +assert.sameValue(zdt7.hoursInDay, 27, "March 5 has 27 hours (including discontiguous piece of March 4)"); + +const startOfMarch4 = Temporal.ZonedDateTime.from("2010-03-04T00:00:00+11:00[Antarctica/Casey]"); +const startOfMarch5 = Temporal.ZonedDateTime.from("2010-03-05T00:00:00+11:00[Antarctica/Casey]"); + +TemporalHelpers.assertZonedDateTimesEqual( + startOfMarch4.add({ hours: startOfMarch4.hoursInDay }), + startOfMarch5, + "start of day + hours in day = start of next day" +); diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/round/same-date-starts-twice.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/round/same-date-starts-twice.js new file mode 100644 index 000000000000..e0941c2ce5d4 --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/round/same-date-starts-twice.js @@ -0,0 +1,52 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.prototype.round +description: Always rounds to a startOfDay, even when midnight occurs twice +info: | + https://github.com/tc39/proposal-temporal/issues/2938 + https://github.com/tc39/proposal-temporal/issues/3312 +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const zdt1 = Temporal.ZonedDateTime.from('2010-03-04T23:10:00+11:00[Antarctica/Casey]'); +const zdt2 = Temporal.ZonedDateTime.from('2010-03-05T00:45:00+11:00[Antarctica/Casey]'); +// 3h backwards shift from +11 to +08 at 2010-03-05 02:00 +const zdt3 = Temporal.ZonedDateTime.from('2010-03-04T23:10:00+08:00[Antarctica/Casey]'); +const zdt4 = Temporal.ZonedDateTime.from('2010-03-05T00:45:00+08:00[Antarctica/Casey]'); + +const startOfMarch4 = Temporal.ZonedDateTime.from("2010-03-04T00:00:00+11:00[Antarctica/Casey]"); +const startOfMarch5 = Temporal.ZonedDateTime.from("2010-03-05T00:00:00+11:00[Antarctica/Casey]"); +const startOfMarch6 = Temporal.ZonedDateTime.from("2010-03-06T00:00:00+08:00[Antarctica/Casey]"); + +// Rounding down + +for (const roundingMode of ["floor", "trunc"]) { + const options = { smallestUnit: "days", roundingMode }; + TemporalHelpers.assertZonedDateTimesEqual(zdt1.round(options), startOfMarch4, `${zdt1} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt2.round(options), startOfMarch5, `${zdt2} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt3.round(options), startOfMarch4, `${zdt3} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt4.round(options), startOfMarch5, `${zdt4} ${roundingMode}`); +} + +// Rounding to nearest + +for (const roundingMode of ["halfCeil", "halfEven", "halfExpand", "halfFloor", "halfTrunc"]) { + const options = { smallestUnit: "days", roundingMode }; + TemporalHelpers.assertZonedDateTimesEqual(zdt1.round(options), startOfMarch5, `${zdt1} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt2.round(options), startOfMarch5, `${zdt2} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt3.round(options), startOfMarch5, `${zdt3} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt4.round(options), startOfMarch5, `${zdt4} ${roundingMode}`); +} + +// Rounding up + +for (const roundingMode of ["ceil", "expand"]) { + const options = { smallestUnit: "days", roundingMode }; + TemporalHelpers.assertZonedDateTimesEqual(zdt1.round(options), startOfMarch5, `${zdt1} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt2.round(options), startOfMarch6, `${zdt2} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt3.round(options), startOfMarch5, `${zdt3} ${roundingMode}`); + TemporalHelpers.assertZonedDateTimesEqual(zdt4.round(options), startOfMarch6, `${zdt4} ${roundingMode}`); +} diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/startOfDay/same-date-starts-twice.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/startOfDay/same-date-starts-twice.js index 1a43cc0a3f71..3d0d7c8a3f44 100644 --- a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/startOfDay/same-date-starts-twice.js +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/startOfDay/same-date-starts-twice.js @@ -21,3 +21,17 @@ const startOfDay3 = Temporal.ZonedDateTime.from('2010-11-08T00:00:00-03:30[Ameri TemporalHelpers.assertZonedDateTimesEqual(zdt1.startOfDay(), zdt1); TemporalHelpers.assertZonedDateTimesEqual(zdt2.startOfDay(), startOfDay2); TemporalHelpers.assertZonedDateTimesEqual(zdt3.startOfDay(), startOfDay3); + +const zdt4 = Temporal.ZonedDateTime.from("2010-03-04T23:10:00+11:00[Antarctica/Casey]"); +const zdt5 = Temporal.ZonedDateTime.from("2010-03-05T00:45:00+11:00[Antarctica/Casey]"); +// 3h backwards shift from +11 to +08 at 2010-03-05 02:00 +const zdt6 = Temporal.ZonedDateTime.from("2010-03-04T23:10:00+08:00[Antarctica/Casey]"); +const zdt7 = Temporal.ZonedDateTime.from("2010-03-05T00:45:00+08:00[Antarctica/Casey]"); + +const startOfMarch4 = Temporal.ZonedDateTime.from("2010-03-04T00:00:00+11:00[Antarctica/Casey]"); +const startOfMarch5 = Temporal.ZonedDateTime.from("2010-03-05T00:00:00+11:00[Antarctica/Casey]"); + +TemporalHelpers.assertZonedDateTimesEqual(zdt4.startOfDay(), startOfMarch4, "start of March 4"); +TemporalHelpers.assertZonedDateTimesEqual(zdt5.startOfDay(), startOfMarch5, "start of March 5, calculated from discontiguous piece"); +TemporalHelpers.assertZonedDateTimesEqual(zdt6.startOfDay(), startOfMarch4, "start of March 4, calculated from discontiguous piece"); +TemporalHelpers.assertZonedDateTimesEqual(zdt7.startOfDay(), startOfMarch5, "start of March 5"); diff --git a/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/withCalendar/future-calendar.js b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/withCalendar/future-calendar.js new file mode 100644 index 000000000000..ee1ccd3db0fc --- /dev/null +++ b/JSTests/test262/test/intl402/Temporal/ZonedDateTime/prototype/withCalendar/future-calendar.js @@ -0,0 +1,17 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.prototype.withcalendar +description: Not-yet-adopted calendar IDs are rejected +includes: [temporalHelpers.js] +features: [Intl.Era-monthcode, Temporal] +---*/ + +const okDate = new Temporal.ZonedDateTime(0n, "UTC"); + +for (const calendar of TemporalHelpers.NotYetSupportedCalendars) { + assert.throws(RangeError, function () { + okDate.withCalendar(calendar); + }, `${calendar} is not yet supported`); +} diff --git a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-generator.js b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-generator.js index a1a056c69acd..e4b8a642f2cb 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-generator.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-generator.js @@ -112,7 +112,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-method.js b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-method.js index e9600518b518..bf550f23531a 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-method.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-async-method.js @@ -109,7 +109,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-generator.js b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-generator.js index 16e61183d085..867dbb52482b 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-generator.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-generator.js @@ -107,7 +107,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js index 1eccf62f430f..313218894634 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js @@ -125,7 +125,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method.js b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method.js index d4ffde2416e2..b32b929ea211 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-methods/prod-private-method.js @@ -105,7 +105,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-1_FIXTURE.js b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-1_FIXTURE.js new file mode 100644 index 000000000000..da46f44a8b50 --- /dev/null +++ b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-1_FIXTURE.js @@ -0,0 +1,5 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +import source mod from ''; +export { mod }; diff --git a/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-2_FIXTURE.js b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-2_FIXTURE.js new file mode 100644 index 000000000000..da46f44a8b50 --- /dev/null +++ b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-2_FIXTURE.js @@ -0,0 +1,5 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +import source mod from ''; +export { mod }; diff --git a/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-reexport_FIXTURE.js b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-reexport_FIXTURE.js new file mode 100644 index 000000000000..116974655c1d --- /dev/null +++ b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-import-source-and-export-reexport_FIXTURE.js @@ -0,0 +1,5 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +export * from './namespace-import-source-and-export-1_FIXTURE.js'; +export * from './namespace-import-source-and-export-2_FIXTURE.js'; diff --git a/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-source-and-export.js b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-source-and-export.js new file mode 100644 index 000000000000..64c552aa69ba --- /dev/null +++ b/JSTests/test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-source-and-export.js @@ -0,0 +1,57 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + Re-exporting the same source-phase import via `import source mod from + ''; export { mod }` from two different modules produces an + unambiguous binding. +esid: sec-resolveexport +info: | + When ParseModule encounters `export { mod }` where `mod` is a local binding + introduced by `import source mod from "..."`, the ExportEntry is + reclassified as an indirect ExportEntry whose [[ImportName]] is ~source~. + + ResolveExport ( exportName, resolveSet ) + + [...] + For each ExportEntry Record e of module.[[IndirectExportEntries]], do + a. If e.[[ExportName]] is exportName, then + [...] + iii. If e.[[ImportName]] is namespace, then [...] + iv. Else if e.[[ImportName]] is source, then + 1. Assert: module does not provide the direct binding for this export. + 2. Return ResolvedBinding Record { [[Module]]: importedModule, + [[BindingName]]: source }. + [...] + + [...] + For each ExportEntry Record e of module.[[StarExportEntries]], do + a. Let importedModule be GetImportedModule(module, e.[[ModuleRequest]]). + b. Let resolution be ? importedModule.ResolveExport(exportName, resolveSet). + c. If resolution is ambiguous, return ambiguous. + d. If resolution is not null, then + i. If starResolution is null, set starResolution to resolution. + ii. Else, + 1. Assert: there is more than one * import that includes the requested name. + 2. If resolution.[[Module]] and starResolution.[[Module]] are not the + same Module Record, return ambiguous. + 3. If resolution.[[BindingName]] is not starResolution.[[BindingName]], + return ambiguous. + + Both fixtures contain `import source mod from ''; export { mod };`. + The host resolves '' to the same Module Record in both, so + the two ResolveExport results carry the same [[Module]] and the same + [[BindingName]] (~source~). The star-export ambiguity check therefore + succeeds, the named import of `mod` from the re-export resolves to a + ResolvedBinding Record with [[BindingName]] ~source~, and InitializeEnvironment + initializes `mod` to the underlying [[ModuleSource]]. +features: [source-phase-imports, source-phase-imports-module-source] +flags: [module] +---*/ + +import { mod } from './namespace-import-source-and-export-reexport_FIXTURE.js'; + +assert.sameValue(typeof mod, 'object', + 'Re-exported source-phase binding should resolve to a ModuleSource object'); +assert(mod instanceof $262.AbstractModuleSource, + '`mod` should be an instance of %AbstractModuleSource%'); diff --git a/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-named-import.js b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-named-import.js new file mode 100644 index 000000000000..80cd1f9a29c1 --- /dev/null +++ b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-named-import.js @@ -0,0 +1,41 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + A named import of a re-exported source-phase binding is initialized to the + imported module's ModuleSource object. +esid: sec-source-text-module-record-initialize-environment +info: | + When a module does `import source x from "..."; export { x };`, ParseModule + reclassifies the local re-export to an indirect ExportEntry whose + [[ImportName]] is ~source~. ResolveExport on the re-exporting module returns + a ResolvedBinding Record with [[BindingName]] ~source~ and [[Module]] set to + the source-phase target module. + + InitializeEnvironment ( ) + + 7. For each ImportEntry Record in of module.[[ImportEntries]], do + [...] + d. Else, + i. Assert: in.[[ImportName]] is a String. + ii. Let resolution be importedModule.ResolveExport(in.[[ImportName]]). + iii. If resolution is either null or ambiguous, throw a SyntaxError. + iv. If resolution.[[BindingName]] is namespace, then [...] + v. Else if resolution.[[BindingName]] is source, then + 1. Let moduleSourceObject be resolution.[[Module]].[[ModuleSource]]. + 2. If moduleSourceObject is empty, throw a SyntaxError exception. + 3. Perform ! env.CreateImmutableBinding(in.[[LocalName]], true). + 4. Perform ! env.InitializeBinding(in.[[LocalName]], moduleSourceObject). + + The named import `x` is therefore bound directly to the ModuleSource object + of the underlying module, an instance of %AbstractModuleSource%. +features: [source-phase-imports, source-phase-imports-module-source] +flags: [module] +---*/ + +import { x } from './reexport-source-binding_FIXTURE.js'; + +assert.sameValue(typeof x, 'object', + 'Named import of a re-exported source binding should be bound to an object'); +assert(x instanceof $262.AbstractModuleSource, + 'x should be a %AbstractModuleSource% instance (the underlying ModuleSource)'); diff --git a/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-namespace-get.js b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-namespace-get.js new file mode 100644 index 000000000000..8cff020abd6e --- /dev/null +++ b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding-namespace-get.js @@ -0,0 +1,38 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + Namespace [[Get]] of a re-exported source-phase binding returns the + imported module's ModuleSource object. +esid: sec-module-namespace-exotic-objects-get-p-receiver +info: | + When a module does `import source x from "..."; export { x };`, ParseModule + reclassifies the local re-export to an indirect ExportEntry whose + [[ImportName]] is ~source~. ResolveExport on the re-exporting module returns + a ResolvedBinding Record with [[BindingName]] ~source~ and [[Module]] set to + the source-phase target module. + + Module Namespace Exotic Object [[Get]] ( P, Receiver ) + + [...] + 7. If binding.[[BindingName]] is namespace, then + a. Return GetModuleNamespace(targetModule). + 8. If binding.[[BindingName]] is source, then + a. Let moduleSourceObject be targetModule.[[ModuleSource]]. + b. If moduleSourceObject is empty, throw a ReferenceError exception. + c. Return moduleSourceObject. + 9. [...] + + Accessing the re-exported binding via `ns.x` therefore returns the + ModuleSource object of the underlying module, an instance of + %AbstractModuleSource%. +features: [source-phase-imports, source-phase-imports-module-source] +flags: [module] +---*/ + +import * as ns from './reexport-source-binding_FIXTURE.js'; + +assert.sameValue(typeof ns.x, 'object', + 'Namespace [[Get]] of a re-exported source binding should return an object'); +assert(ns.x instanceof $262.AbstractModuleSource, + 'ns.x should be a %AbstractModuleSource% instance (the underlying ModuleSource)'); diff --git a/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding_FIXTURE.js b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding_FIXTURE.js new file mode 100644 index 000000000000..3f5d4ba216cc --- /dev/null +++ b/JSTests/test262/test/language/module-code/source-phase-import/reexport-source-binding_FIXTURE.js @@ -0,0 +1,5 @@ +// Copyright (C) 2026 Guy Bedford. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +import source x from ''; +export { x }; diff --git a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-generator.js b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-generator.js index 829b9242ca8b..75e9804fa07c 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-generator.js +++ b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-generator.js @@ -111,7 +111,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-method.js b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-method.js index 59bf71e7a0b3..a84358595d7d 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-method.js +++ b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-async-method.js @@ -108,7 +108,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-generator.js b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-generator.js index 4e45792c85f8..0432e06be31e 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-generator.js +++ b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-generator.js @@ -106,7 +106,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js index 51f70e2b6c0f..e5b64784874c 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js +++ b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js @@ -124,7 +124,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method.js b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method.js index 7f4d1e2a0ad8..04af993cb3df 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method.js +++ b/JSTests/test262/test/language/statements/class/elements/private-methods/prod-private-method.js @@ -104,7 +104,7 @@ var c = new C(); var other = new C(); hasProp(C.prototype, '#m', false, 'method is not defined in the prototype'); -hasProp(C, '#m', false, 'method is not defined in the contructor'); +hasProp(C, '#m', false, 'method is not defined in the constructor'); hasProp(c, '#m', false, 'method cannot be seen outside of the class'); /*** diff --git a/JSTests/test262/test/staging/sm/Error/constructor-proto.js b/JSTests/test262/test/staging/sm/Error/constructor-proto.js index 8893d43ebd8f..e26856deb1f4 100644 --- a/JSTests/test262/test/staging/sm/Error/constructor-proto.js +++ b/JSTests/test262/test/staging/sm/Error/constructor-proto.js @@ -5,17 +5,10 @@ description: | pending esid: pending +includes: [nativeErrors.js] ---*/ -const nativeErrors = [ - EvalError, - RangeError, - ReferenceError, - SyntaxError, - TypeError, - URIError -]; -assert.sameValue(Reflect.getPrototypeOf(Error), Function.prototype) +assert.sameValue(Reflect.getPrototypeOf(Error), Function.prototype); for (const error of nativeErrors) assert.sameValue(Reflect.getPrototypeOf(error), Error); diff --git a/JSTests/test262/test/staging/sm/Error/prototype-properties.js b/JSTests/test262/test/staging/sm/Error/prototype-properties.js index 983b3885f38f..e2179889785a 100644 --- a/JSTests/test262/test/staging/sm/Error/prototype-properties.js +++ b/JSTests/test262/test/staging/sm/Error/prototype-properties.js @@ -5,15 +5,8 @@ description: | pending esid: pending +includes: [nativeErrors.js] ---*/ -const nativeErrors = [ - EvalError, - RangeError, - ReferenceError, - SyntaxError, - TypeError, - URIError -]; const ownKeys = Reflect.ownKeys(Error.prototype); for (const expected of ["constructor", "message", "name", "toString"]) { diff --git a/JSTests/test262/test/staging/sm/Error/prototype.js b/JSTests/test262/test/staging/sm/Error/prototype.js index a590505c30f8..5afcd9a40c09 100644 --- a/JSTests/test262/test/staging/sm/Error/prototype.js +++ b/JSTests/test262/test/staging/sm/Error/prototype.js @@ -5,15 +5,8 @@ description: | pending esid: pending +includes: [nativeErrors.js] ---*/ -const nativeErrors = [ - EvalError, - RangeError, - ReferenceError, - SyntaxError, - TypeError, - URIError -]; assert.sameValue(Reflect.getPrototypeOf(Error.prototype), Object.prototype) diff --git a/JSTests/test262/test/staging/sm/Function/builtin-no-construct.js b/JSTests/test262/test/staging/sm/Function/builtin-no-construct.js index 9b32ff399b13..d8563ad6b07b 100644 --- a/JSTests/test262/test/staging/sm/Function/builtin-no-construct.js +++ b/JSTests/test262/test/staging/sm/Function/builtin-no-construct.js @@ -7,6 +7,7 @@ description: | pending esid: pending +includes: [nativeErrors.js] ---*/ function checkMethod(method) { @@ -33,9 +34,8 @@ checkMethods(Math); checkMethods(Proxy); var builtin_ctors = [ - Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, - EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, -]; + Object, Function, Array, String, Boolean, Number, Date, RegExp +].concat(nativeErrors); for (var i = 0; i < builtin_ctors.length; i++) { checkMethods(builtin_ctors[i]); diff --git a/JSTests/test262/test/staging/sm/Function/builtin-no-prototype.js b/JSTests/test262/test/staging/sm/Function/builtin-no-prototype.js index 9a059fabada3..5a9d1310accc 100644 --- a/JSTests/test262/test/staging/sm/Function/builtin-no-prototype.js +++ b/JSTests/test262/test/staging/sm/Function/builtin-no-prototype.js @@ -7,6 +7,7 @@ description: | pending esid: pending +includes: [nativeErrors.js] ---*/ assert.sameValue(undefined, void 0); @@ -14,9 +15,8 @@ assert.sameValue(Function.prototype.hasOwnProperty('prototype'), false); assert.sameValue(Function.prototype.prototype, undefined); var builtin_ctors = [ - Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, - EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError -]; + Object, Function, Array, String, Boolean, Number, Date, RegExp +].concat(nativeErrors); for (var i = 0; i < builtin_ctors.length; i++) { var c = builtin_ctors[i]; diff --git a/JSTests/test262/test262-Revision.txt b/JSTests/test262/test262-Revision.txt index 9aaff89f0001..10b84f9fb23f 100644 --- a/JSTests/test262/test262-Revision.txt +++ b/JSTests/test262/test262-Revision.txt @@ -1,2 +1,2 @@ test262 remote url: https://github.com/tc39/test262.git -test262 revision: 578794183cf5f51a453ff9a793416f2ae20d3458 +test262 revision: 4249661388e5d3f92a85186213da140a6481490f diff --git a/JSTests/wasm/gc/struct-write-barrier.js b/JSTests/wasm/gc/struct-write-barrier.js index b16e51720bfe..8fd6e96a71bf 100644 --- a/JSTests/wasm/gc/struct-write-barrier.js +++ b/JSTests/wasm/gc/struct-write-barrier.js @@ -1,4 +1,4 @@ -// requireOptions("--collectContinuously=1") +//@ requireOptions("--collectContinuously=1") import * as assert from "../assert.js"; import { instantiate } from "./wast-wrapper.js"; diff --git a/JSTests/wasm/regress/309628.js b/JSTests/wasm/regress/309628.js new file mode 100644 index 000000000000..ccd11bdf0bca --- /dev/null +++ b/JSTests/wasm/regress/309628.js @@ -0,0 +1,53 @@ +"use strict"; + +function leb(n) { + const out = []; + do { + let b = n & 0x7f; + n >>>= 7; + if (n) b |= 0x80; + out.push(b); + } while (n); + return out; +} + +/* + * (module + * (func (export "f") + * (local $0 i64) ;; numLocals times + * (drop (local.get 0)))) + */ +function makeModule(numLocals) { + const body = [ + 0x01, ...leb(numLocals), 0x7e, + 0x20, 0x00, + 0x1a, + 0x0b, + ]; + const code = [0x01, ...leb(body.length), ...body]; + return new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x04, 0x01, 0x60, 0x00, 0x00, + 0x03, 0x02, 0x01, 0x00, + 0x07, 0x05, 0x01, 0x01, 0x66, 0x00, 0x00, + 0x0a, ...leb(code.length), ...code, + ]); +} + +const workerSrc = ` +${leb.toString()} +${makeModule.toString()} + +for (let L = 35000; L >= 8000; L -= 2000) { + const bytes = makeModule(L); + const inst = new WebAssembly.Instance(new WebAssembly.Module(bytes)); + try { + inst.exports.f(); + break; + } catch (e) { + } +} +`; + +$.agent.start(workerSrc); +$.agent.sleep(2000); diff --git a/JSTests/wasm/stress/deferred-work-timer-cancel-duplicate-ticket.js b/JSTests/wasm/stress/deferred-work-timer-cancel-duplicate-ticket.js new file mode 100644 index 000000000000..2ff35882d7b8 --- /dev/null +++ b/JSTests/wasm/stress/deferred-work-timer-cancel-duplicate-ticket.js @@ -0,0 +1,52 @@ +var N_REGISTRIES = 300; +var N_DEFERRED_WORK1 = 400; +var N_DEFERRED_WORK2 = 1500; + +var sab = new SharedArrayBuffer(8); +var i32 = new Int32Array(sab); + +function setupChildGlobal() { + var childGlobal = createGlobalObject(); + childGlobal.N_REGISTRIES = N_REGISTRIES; + childGlobal.eval( + 'globalThis.__registries = [];' + + 'for (var k = 0; k < this.N_REGISTRIES; k++) {' + + ' var fr = new FinalizationRegistry(function(h){});' + + ' (function(){ fr.register({}, 1); })();' + + ' globalThis.__registries.push(fr);' + + '}' + ); + gc(); + return childGlobal; +} +noDFG(setupChildGlobal); + +function run() { + var childGlobal = setupChildGlobal(); + globalThis.p1 = Atomics.waitAsync(i32, 0, 0).value; + Atomics.notify(i32, 0); + childGlobal = null; + return 0; +} +noDFG(run); +run(); + +p1.then(function () { + for (var i = 0; i < N_DEFERRED_WORK1; i++) + setTimeout(function () { }, 10); +}); + +gc(); gc(); gc(); + +var p2 = Atomics.waitAsync(i32, 0, 0).value; +Atomics.notify(i32, 0); +p2.then(function () { + for (var j = 0; j < N_DEFERRED_WORK2; j++) + setTimeout(function () { }, 50); + + gc(); gc(); + globalThis.__fns = []; + for (var k = 0; k < 10; k++) __fns.push(function () { }); +}); + +setTimeout(function () { }, 200); diff --git a/JSTests/wasm/stress/grow-funcref-table-with-default.js b/JSTests/wasm/stress/grow-funcref-table-with-default.js new file mode 100644 index 000000000000..2c35d6067dd4 --- /dev/null +++ b/JSTests/wasm/stress/grow-funcref-table-with-default.js @@ -0,0 +1,92 @@ +import { instantiate } from "../wabt-wrapper.js" +import * as assert from "../assert.js" + +// JS-API WebAssembly.Table.prototype.grow with a non-null funcref default +// goes through Wasm::Table::grow with a real fill value. That path used to +// populate only m_value while leaving m_function default-constructed +// (Bug A: call_indirect would dereference null rtt; Bug B: isEmpty() +// reading m_function.rtt was true, so visitAggregate skipped marking the +// wrapper held in m_value). +// +// Wasm-side `(table.grow ...)` lowers to tableGrow + tableSet which +// populate the slot correctly, so this test must use the JS API to +// reach the buggy path. + +let mainWat = ` +(module + (type $sig (func (param i32) (result i32))) + (table $t (export "t") 1 funcref) + (elem (i32.const 0) $base) + (func $base (param i32) (result i32) (i32.add (local.get 0) (i32.const 100))) + (func (export "callIndirect") (param i32 i32) (result i32) + (call_indirect (type $sig) (local.get 1) (local.get 0))) +) +` + +let helperWat = ` +(module + (func (export "f") (param i32) (result i32) (i32.add (local.get 0) (i32.const 7))) +) +` + +async function testCallIndirectAfterGrow() { + const main = (await instantiate(mainWat, {}, {})).exports + const fn = (await instantiate(helperWat, {}, {})).exports.f + + const oldSize = main.t.grow(4, fn) + assert.eq(oldSize, 1) + assert.eq(main.t.length, 5) + + for (let i = 1; i < 5; ++i) + assert.eq(main.callIndirect(i, 10), 17) + + assert.eq(main.callIndirect(0, 10), 110) +} + +async function testGCPreservesWrapperAfterGrow() { + const main = (await instantiate(mainWat, {}, {})).exports + + // Many grows, each with an ephemeral wrapper from a fresh instance. + // After the loop, the only path to each wrapper is the slot's m_value; + // with the marking gap, fullGC reclaims them and table.get / call return + // dangling cells. + const N = 200; + for (let i = 0; i < N; ++i) { + const fn = (await instantiate(helperWat, {}, {})).exports.f + main.t.grow(1, fn) + } + + fullGC() + + for (let i = 1; i <= N; ++i) { + const f = main.t.get(i) + assert.eq(typeof f, "function") + assert.eq(f(5), 12) + assert.eq(main.callIndirect(i, 5), 12) + } +} + +async function testNullDefault() { + const main = (await instantiate(mainWat, {}, {})).exports + + const oldSize = main.t.grow(3, null) + assert.eq(oldSize, 1) + assert.eq(main.t.get(1), null) + assert.eq(main.t.get(2), null) + + let threw = false + try { + main.callIndirect(2, 0) + } catch (e) { + threw = e instanceof WebAssembly.RuntimeError + } + assert.eq(threw, true) +} + +async function test() { + await testCallIndirectAfterGrow() + await testGCPreservesWrapperAfterGrow() + await testNullDefault() +} + +await assert.asyncTest(test()) diff --git a/JSTests/wasm/stress/instance-anchor.js b/JSTests/wasm/stress/instance-anchor.js new file mode 100644 index 000000000000..b2b59cb78edd --- /dev/null +++ b/JSTests/wasm/stress/instance-anchor.js @@ -0,0 +1,42 @@ +//@ runDefault("--jitPolicyScale=0.1") +/* +(module + (func (export "foo") (result i32) + i32.const 42 + ) +) +*/ + +const WASM_CODE = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x07, 0x01, 0x03, 0x66, 0x6f, 0x6f, 0x00, 0x00, 0x0a, 0x06, 0x01, 0x04, 0x00, 0x41, 0x2a, 0x0b]); + +function bury(f, n) { + if (n === 0) { + return f(); + } + + return bury(f, n - 1); +} + +function main() { + const mod = new WebAssembly.Module(WASM_CODE); + + function warmUpInstanceB() { + const instanceB = new WebAssembly.Instance(mod); + + instanceB.exports.foo(); + } + + bury(warmUpInstanceB, 500); + + const instanceA = new WebAssembly.Instance(mod); + + for (let i = 0; i < 500; i++) + instanceA.exports.foo(); + + gc(); + + print("done (should have crashed above)"); + +} + +main(); diff --git a/JSTests/wasm/stress/wasm-imported-string-oom-exception.js b/JSTests/wasm/stress/wasm-imported-string-oom-exception.js new file mode 100644 index 000000000000..8b68ebe64a06 --- /dev/null +++ b/JSTests/wasm/stress/wasm-imported-string-oom-exception.js @@ -0,0 +1,15 @@ +//@ requireOptions("--useConcurrentJIT=0") +//@ skip if $memoryLimited or $addressBits <= 32 + +function main() { + const wasmCode = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]); + + const options = { + importedStringConstants: 'a'.repeat(0x7ffffffe) + '\u1234', + builtins: [] + }; + + new WebAssembly.Module(wasmCode, options); +} + +try { main(); } catch(e) { } diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations index 80c6a6eb0a5d..186d20cc8610 100644 --- a/LayoutTests/TestExpectations +++ b/LayoutTests/TestExpectations @@ -17,6 +17,8 @@ accessibility/gtk [ Skip ] accessibility/mac [ Skip ] accessibility/win [ Skip ] http/tests/site-isolation/accessibility/client [ Skip ] +# Exercises iOS-specific remote-frame accessibility search behavior; enabled only on iOS (see platform/ios/TestExpectations). +http/tests/site-isolation/accessibility/heading-search-returns-remote-frame.html [ Skip ] displaylists [ Skip ] editing/mac [ Skip ] editing/caret/ios [ Skip ] @@ -556,6 +558,13 @@ webkit.org/b/176929 imported/w3c/web-platform-tests/html/semantics/embedded-cont webkit.org/b/311501 imported/w3c/web-platform-tests/mediasession/media-session-artwork-fetch.https.html [ Pass Failure ] +# Media Session tests: rdar://178443322 +imported/w3c/web-platform-tests/mediasession/idlharness.window.html [ Failure ] +imported/w3c/web-platform-tests/mediasession/mediametadata.html [ Failure ] +imported/w3c/web-platform-tests/mediasession/setactionhandler.html [ Failure ] +imported/w3c/web-platform-tests/mediasession/setcameraactive.html [ Pass Failure ] +imported/w3c/web-platform-tests/mediasession/setmicrophoneactive.html [ Pass Failure ] + # Requires additional test infrastructure. imported/w3c/web-platform-tests/service-workers/service-worker/update-after-oneday.https.html [ Skip ] @@ -617,6 +626,7 @@ imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-mode imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/bidi/u06E9_no_strong_dir.html [ Pass ] +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority_layer.html [ Pass ] @@ -645,7 +655,10 @@ imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-mode imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ Pass ] +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html [ Pass ] +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/too_many_cues.html [ Pass ] +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/too_many_cues_wrapped.html [ Pass ] ## -- Enhanced + + + + + + + diff --git a/LayoutTests/accessibility/mac/menu-parameterized-attributes-expected.txt b/LayoutTests/accessibility/mac/menu-parameterized-attributes-expected.txt index 17d3be37ffc3..e86cf22d2aa6 100644 --- a/LayoutTests/accessibility/mac/menu-parameterized-attributes-expected.txt +++ b/LayoutTests/accessibility/mac/menu-parameterized-attributes-expected.txt @@ -42,6 +42,7 @@ AXTextOperation AXTextMarkerForIndex AXTextMarkerIsValid AXIndexForTextMarker +AXRelativeIndexForTextMarker #menuitem supported paramterized attributes: @@ -86,6 +87,7 @@ AXTextOperation AXTextMarkerForIndex AXTextMarkerIsValid AXIndexForTextMarker +AXRelativeIndexForTextMarker diff --git a/LayoutTests/accessibility/mac/relative-index-for-text-marker-expected.txt b/LayoutTests/accessibility/mac/relative-index-for-text-marker-expected.txt new file mode 100644 index 000000000000..5c36a59cd3e6 --- /dev/null +++ b/LayoutTests/accessibility/mac/relative-index-for-text-marker-expected.txt @@ -0,0 +1,21 @@ +Tests AXRelativeIndexForTextMarker. The attribute returns the receiver-local character offset of a text marker, 0..numberOfCharacters, or NSNotFound when the marker does not lie within the receiver's range. + +Markers within target's range: +PASS: target.relativeIndexForTextMarker(targetStart) === 0 +PASS: target.relativeIndexForTextMarker(targetEnd) === 11 +PASS: target.relativeIndexForTextMarker(targetSpaceMarker) === 6 + +Markers outside target's range (expect NSNotFound, surfaced as -1 by the test bindings' int truncation): +PASS: target.relativeIndexForTextMarker(preambleStart) === -1 +PASS: target.relativeIndexForTextMarker(trailStart) === -1 + +Receiver-relative (preambleStart on preamble vs target): +PASS: preamble.relativeIndexForTextMarker(preambleStart) === 0 + +PASS successfullyParsed is true + +TEST COMPLETE +Lorem ipsum dolor sit amet. +Hello world + +Trailing text. diff --git a/LayoutTests/accessibility/mac/relative-index-for-text-marker.html b/LayoutTests/accessibility/mac/relative-index-for-text-marker.html new file mode 100644 index 000000000000..a6e10d99b59e --- /dev/null +++ b/LayoutTests/accessibility/mac/relative-index-for-text-marker.html @@ -0,0 +1,54 @@ + + + + + + + + +
Lorem ipsum dolor sit amet.
+

Hello world

+
Trailing text.
+ + + + diff --git a/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset-expected.txt b/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset-expected.txt index e6167e487f03..5c722515811b 100644 --- a/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset-expected.txt +++ b/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset-expected.txt @@ -1,5 +1,171 @@ +Layer tree when scrolled to top left + +(GraphicsLayer + (children 5 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 800.00 600.00) + (backgroundColor #FFFFFF) + ) + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 785.00 585.00) + (clips 1) + (children 1 + (GraphicsLayer + (anchor 0.00 0.00) + (children 1 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 2000.00 2000.00) + (children 1 + (GraphicsLayer + (bounds 2000.00 2000.00) + (contentsOpaque 1) + (children 1 + (GraphicsLayer + (bounds 100.00 100.00) + (contentsOpaque 1) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (GraphicsLayer + (position 745.00 0.00) + (bounds 15.00 535.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 0.00 535.00) + (bounds 745.00 15.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 745.00 535.00) + (bounds 15.00 15.00) + (drawsContent 1) + ) + ) +) +Layer tree when scrolled to top right + +(GraphicsLayer + (children 5 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 800.00 600.00) + (backgroundColor #FFFFFF) + ) + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 745.00 585.00) + (clips 1) + (children 1 + (GraphicsLayer + (position -1255.00 0.00) + (anchor 0.00 0.00) + (children 1 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 2000.00 2000.00) + (children 1 + (GraphicsLayer + (bounds 2000.00 2000.00) + (contentsOpaque 1) + (children 1 + (GraphicsLayer + (bounds 100.00 100.00) + (contentsOpaque 1) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (GraphicsLayer + (position 745.00 0.00) + (bounds 15.00 535.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 0.00 535.00) + (bounds 745.00 15.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 745.00 535.00) + (bounds 15.00 15.00) + (drawsContent 1) + ) + ) +) +Layer tree when scrolled to bottom left + +(GraphicsLayer + (children 5 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 800.00 600.00) + (backgroundColor #FFFFFF) + ) + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 785.00 535.00) + (clips 1) + (children 1 + (GraphicsLayer + (position 0.00 -1465.00) + (anchor 0.00 0.00) + (children 1 + (GraphicsLayer + (anchor 0.00 0.00) + (bounds 2000.00 2000.00) + (children 1 + (GraphicsLayer + (bounds 2000.00 2000.00) + (contentsOpaque 1) + (children 1 + (GraphicsLayer + (bounds 100.00 100.00) + (contentsOpaque 1) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (GraphicsLayer + (position 745.00 0.00) + (bounds 15.00 535.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 0.00 535.00) + (bounds 745.00 15.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 745.00 535.00) + (bounds 15.00 15.00) + (drawsContent 1) + ) + ) +) +Layer tree when scrolled to bottom right + (GraphicsLayer - (children 3 + (children 5 (GraphicsLayer (anchor 0.00 0.00) (bounds 800.00 600.00) @@ -7,18 +173,19 @@ ) (GraphicsLayer (anchor 0.00 0.00) - (bounds 735.00 550.00) + (bounds 745.00 535.00) (clips 1) (children 1 (GraphicsLayer + (position -1255.00 -1465.00) (anchor 0.00 0.00) (children 1 (GraphicsLayer (anchor 0.00 0.00) - (bounds 735.00 2000.00) + (bounds 2000.00 2000.00) (children 1 (GraphicsLayer - (bounds 735.00 2000.00) + (bounds 2000.00 2000.00) (contentsOpaque 1) (children 1 (GraphicsLayer @@ -34,8 +201,18 @@ ) ) (GraphicsLayer - (position 735.00 0.00) - (bounds 15.00 550.00) + (position 745.00 0.00) + (bounds 15.00 535.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 0.00 535.00) + (bounds 745.00 15.00) + (drawsContent 1) + ) + (GraphicsLayer + (position 745.00 535.00) + (bounds 15.00 15.00) (drawsContent 1) ) ) diff --git a/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset.html b/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset.html index 41a723a8bb96..5aaf48c21995 100644 --- a/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset.html +++ b/LayoutTests/compositing/geometry/frame-clipping-layer-with-bottom-right-inset.html @@ -4,6 +4,7 @@ +
+
+
+
diff --git a/LayoutTests/css3/filters/backdrop/backdrop-inset-opacity.html b/LayoutTests/css3/filters/backdrop/backdrop-inset-opacity.html new file mode 100644 index 000000000000..9a93a1d25c96 --- /dev/null +++ b/LayoutTests/css3/filters/backdrop/backdrop-inset-opacity.html @@ -0,0 +1,35 @@ + + +
+
+
+
diff --git a/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll-expected.txt b/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll-expected.txt new file mode 100644 index 000000000000..169e5f49bd66 --- /dev/null +++ b/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll-expected.txt @@ -0,0 +1,10 @@ +Changing page zoom on a horizontal scroll-snap carousel should not crash + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Did not crash. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll.html b/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll.html new file mode 100644 index 000000000000..0f24a26766de --- /dev/null +++ b/LayoutTests/css3/scroll-snap/scroll-snap-zoom-after-overflow-scroll.html @@ -0,0 +1,82 @@ + + + + + + + + + +
+ + diff --git a/LayoutTests/css3/text-decoration/text-decoration-line-spelling-error-1.html b/LayoutTests/css3/text-decoration/text-decoration-line-spelling-error-1.html index 05182c12dad7..2fb2b2bdd6ab 100644 --- a/LayoutTests/css3/text-decoration/text-decoration-line-spelling-error-1.html +++ b/LayoutTests/css3/text-decoration/text-decoration-line-spelling-error-1.html @@ -1,7 +1,7 @@ - + +
+
+
diff --git a/LayoutTests/fast/box-sizing/abspos-height-fill-available-uses-cb-content.html b/LayoutTests/fast/box-sizing/abspos-height-fill-available-uses-cb-content.html new file mode 100644 index 000000000000..113b8174ee41 --- /dev/null +++ b/LayoutTests/fast/box-sizing/abspos-height-fill-available-uses-cb-content.html @@ -0,0 +1,24 @@ + +-webkit-fill-available height on out-of-flow element uses containing block content height, not inset-bounded space + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content-expected.html b/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content-expected.html new file mode 100644 index 000000000000..e573adf9a252 --- /dev/null +++ b/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content-expected.html @@ -0,0 +1,22 @@ + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content.html b/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content.html new file mode 100644 index 000000000000..d9246cb0fe03 --- /dev/null +++ b/LayoutTests/fast/box-sizing/abspos-max-height-fill-available-uses-cb-content.html @@ -0,0 +1,25 @@ + +max-height: -webkit-fill-available on out-of-flow element uses containing block content height, not inset-bounded space + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content-expected.html b/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content-expected.html new file mode 100644 index 000000000000..f799bead3fed --- /dev/null +++ b/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content-expected.html @@ -0,0 +1,22 @@ + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content.html b/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content.html new file mode 100644 index 000000000000..0480e8949c1a --- /dev/null +++ b/LayoutTests/fast/box-sizing/abspos-min-height-fill-available-uses-cb-content.html @@ -0,0 +1,24 @@ + +min-height: -webkit-fill-available on out-of-flow element uses containing block content height, not inset-bounded space + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side-expected.html b/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side-expected.html new file mode 100644 index 000000000000..d1caec4be5a6 --- /dev/null +++ b/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side-expected.html @@ -0,0 +1,19 @@ + + +
+
diff --git a/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side.html b/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side.html new file mode 100644 index 000000000000..e5a546b60f7b --- /dev/null +++ b/LayoutTests/fast/box-sizing/fill-available-and-stretch-side-by-side.html @@ -0,0 +1,22 @@ + +stretch and -webkit-fill-available are distinct keywords with different resolution in indefinite containing blocks + + +
+
diff --git a/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex-expected.html b/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex-expected.html new file mode 100644 index 000000000000..5504b87d69c3 --- /dev/null +++ b/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex-expected.html @@ -0,0 +1,18 @@ + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex.html b/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex.html new file mode 100644 index 000000000000..fb8d76654f83 --- /dev/null +++ b/LayoutTests/fast/box-sizing/flex-basis-fill-available-column-flex.html @@ -0,0 +1,20 @@ + +flex-basis: -webkit-fill-available on a column flex item resolves through indefinite containing block + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch-expected.txt b/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch-expected.txt new file mode 100644 index 000000000000..78329b419f2e --- /dev/null +++ b/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch-expected.txt @@ -0,0 +1,3 @@ + +PASS -webkit-fill-available and stretch are distinct keywords in computed style + diff --git a/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch.html b/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch.html new file mode 100644 index 000000000000..5204af29729f --- /dev/null +++ b/LayoutTests/fast/box-sizing/getComputedStyle-distinguishes-fill-available-from-stretch.html @@ -0,0 +1,15 @@ + +getComputedStyle distinguishes -webkit-fill-available from stretch + + +
+
+ diff --git a/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb-expected.html b/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb-expected.html new file mode 100644 index 000000000000..dce3ca551a92 --- /dev/null +++ b/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb-expected.html @@ -0,0 +1,11 @@ + + +
diff --git a/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb.html b/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb.html new file mode 100644 index 000000000000..a77c275b6897 --- /dev/null +++ b/LayoutTests/fast/box-sizing/height-fill-available-indefinite-cb.html @@ -0,0 +1,13 @@ + +height: -webkit-fill-available resolves through indefinite containing block + + +
diff --git a/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb-expected.html b/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb-expected.html new file mode 100644 index 000000000000..733998b9f0af --- /dev/null +++ b/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb-expected.html @@ -0,0 +1,17 @@ + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb.html b/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb.html new file mode 100644 index 000000000000..3f552c914a80 --- /dev/null +++ b/LayoutTests/fast/box-sizing/max-height-fill-available-indefinite-cb.html @@ -0,0 +1,19 @@ + +max-height: -webkit-fill-available caps content at viewport size in an indefinite containing block + + +
+
+
diff --git a/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb-expected.html b/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb-expected.html new file mode 100644 index 000000000000..d8eb24ea77c2 --- /dev/null +++ b/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb-expected.html @@ -0,0 +1,11 @@ + + +
diff --git a/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb.html b/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb.html new file mode 100644 index 000000000000..91c02a0dc397 --- /dev/null +++ b/LayoutTests/fast/box-sizing/min-height-fill-available-indefinite-cb.html @@ -0,0 +1,13 @@ + +min-height: -webkit-fill-available resolves through indefinite containing block + + +
diff --git a/LayoutTests/fast/box-sizing/quirks-height-stretch-expected.html b/LayoutTests/fast/box-sizing/quirks-height-stretch-expected.html new file mode 100644 index 000000000000..b9a611142688 --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-height-stretch-expected.html @@ -0,0 +1,12 @@ + + +
+ diff --git a/LayoutTests/fast/box-sizing/quirks-height-stretch.html b/LayoutTests/fast/box-sizing/quirks-height-stretch.html new file mode 100644 index 000000000000..d30f59708256 --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-height-stretch.html @@ -0,0 +1,14 @@ + +height: stretch resolves to viewport in quirks mode (body.stretchesToViewport) + + +
+ diff --git a/LayoutTests/fast/box-sizing/quirks-max-height-stretch-expected.html b/LayoutTests/fast/box-sizing/quirks-max-height-stretch-expected.html new file mode 100644 index 000000000000..84a18772d34f --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-max-height-stretch-expected.html @@ -0,0 +1,18 @@ + + +
+
+
+ diff --git a/LayoutTests/fast/box-sizing/quirks-max-height-stretch.html b/LayoutTests/fast/box-sizing/quirks-max-height-stretch.html new file mode 100644 index 000000000000..48d8e7931aab --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-max-height-stretch.html @@ -0,0 +1,20 @@ + +max-height: stretch caps content at viewport in quirks mode (body.stretchesToViewport) + + +
+
+
+ diff --git a/LayoutTests/fast/box-sizing/quirks-min-height-stretch-expected.html b/LayoutTests/fast/box-sizing/quirks-min-height-stretch-expected.html new file mode 100644 index 000000000000..546740bc74f5 --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-min-height-stretch-expected.html @@ -0,0 +1,12 @@ + + +
+ diff --git a/LayoutTests/fast/box-sizing/quirks-min-height-stretch.html b/LayoutTests/fast/box-sizing/quirks-min-height-stretch.html new file mode 100644 index 000000000000..60c37ab1e45e --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-min-height-stretch.html @@ -0,0 +1,14 @@ + +min-height: stretch resolves to viewport in quirks mode (body.stretchesToViewport) + + +
+ diff --git a/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch-expected.html b/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch-expected.html new file mode 100644 index 000000000000..acdf57f78650 --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch-expected.html @@ -0,0 +1,14 @@ + + + + diff --git a/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch.html b/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch.html new file mode 100644 index 000000000000..6a5832b90e4a --- /dev/null +++ b/LayoutTests/fast/box-sizing/quirks-replaced-height-stretch.html @@ -0,0 +1,16 @@ + +height: stretch on a replaced element resolves to viewport in quirks mode (body.stretchesToViewport) + + + + diff --git a/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb-expected.html b/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb-expected.html new file mode 100644 index 000000000000..6d0cb45e6080 --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb-expected.html @@ -0,0 +1,13 @@ + + + diff --git a/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb.html b/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb.html new file mode 100644 index 000000000000..a45fc7b426db --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-height-fill-available-indefinite-cb.html @@ -0,0 +1,15 @@ + +-webkit-fill-available height on replaced element resolves through indefinite containing block instead of falling back to intrinsic + + + diff --git a/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb-expected.html b/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb-expected.html new file mode 100644 index 000000000000..5953854573a7 --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb-expected.html @@ -0,0 +1,14 @@ + + + diff --git a/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb.html b/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb.html new file mode 100644 index 000000000000..4b74dd45000c --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-max-height-fill-available-indefinite-cb.html @@ -0,0 +1,16 @@ + +max-height: -webkit-fill-available on replaced element caps at viewport in indefinite containing block + + + diff --git a/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float-expected.html b/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float-expected.html new file mode 100644 index 000000000000..feb04b96f007 --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float-expected.html @@ -0,0 +1,22 @@ + + +
+
+ +
diff --git a/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float.html b/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float.html new file mode 100644 index 000000000000..c01111f39875 --- /dev/null +++ b/LayoutTests/fast/box-sizing/replaced-width-fill-available-ignores-float.html @@ -0,0 +1,24 @@ + +-webkit-fill-available on block-level replaced element does not shrink for floats + + +
+
+ +
diff --git a/LayoutTests/fast/css-intrinsic-dimensions/height-positioned-expected.html b/LayoutTests/fast/css-intrinsic-dimensions/height-positioned-expected.html index 216efb8a145f..cb861f5a001d 100644 --- a/LayoutTests/fast/css-intrinsic-dimensions/height-positioned-expected.html +++ b/LayoutTests/fast/css-intrinsic-dimensions/height-positioned-expected.html @@ -33,7 +33,7 @@ } .fill-available { - height: 391px; + height: 386px; box-sizing: border-box; } diff --git a/LayoutTests/fast/css/first-letter-punctuation-expected.html b/LayoutTests/fast/css/first-letter-punctuation-expected.html deleted file mode 100644 index 73ff30afe047..000000000000 --- a/LayoutTests/fast/css/first-letter-punctuation-expected.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -

Test passes if all the T and surrounding punctuation are green.

-
(T)est
-
“T”est
-
« T »est
-
« T »    est
-
𐄀T𐄀est
- - \ No newline at end of file diff --git a/LayoutTests/fast/css/first-letter-punctuation.html b/LayoutTests/fast/css/first-letter-punctuation.html deleted file mode 100644 index b4656b24be1c..000000000000 --- a/LayoutTests/fast/css/first-letter-punctuation.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -

Test passes if all the T and surrounding punctuation are green.

-
(T)est
-
“T”est
-
« T »est
-
« T »    est
-
𐄀T𐄀est
- - diff --git a/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt b/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt index 138825eb1a54..0956b8e2eaee 100644 --- a/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt +++ b/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt @@ -92,7 +92,6 @@ font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; -glyph-orientation-horizontal: 0deg; glyph-orientation-vertical: auto; grid-auto-columns: auto; grid-auto-flow: normal; diff --git a/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt b/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt index 141e48a40148..e8800480c05d 100644 --- a/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt +++ b/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt @@ -91,7 +91,6 @@ font-variant-ligatures: normal font-variant-numeric: normal font-variant-position: normal font-weight: 400 -glyph-orientation-horizontal: 0deg glyph-orientation-vertical: auto grid-auto-columns: auto grid-auto-flow: normal diff --git a/LayoutTests/fast/css/has-lang-jit-crash-expected.txt b/LayoutTests/fast/css/has-lang-jit-crash-expected.txt new file mode 100644 index 000000000000..7ef22e9a431a --- /dev/null +++ b/LayoutTests/fast/css/has-lang-jit-crash-expected.txt @@ -0,0 +1 @@ +PASS diff --git a/LayoutTests/fast/css/has-lang-jit-crash.html b/LayoutTests/fast/css/has-lang-jit-crash.html new file mode 100644 index 000000000000..492ccdefb375 --- /dev/null +++ b/LayoutTests/fast/css/has-lang-jit-crash.html @@ -0,0 +1,55 @@ + + + + + + + + + + diff --git a/LayoutTests/fast/css/style-enumerate-properties-expected.txt b/LayoutTests/fast/css/style-enumerate-properties-expected.txt index 1ad151b15e1e..e83da60003ae 100644 --- a/LayoutTests/fast/css/style-enumerate-properties-expected.txt +++ b/LayoutTests/fast/css/style-enumerate-properties-expected.txt @@ -9,6 +9,7 @@ PASS 'font' in document.body.style is true PASS 'webkitTransform' in document.body.style is true PASS 'WebkitTransform' in document.body.style is true PASS 'bogus-random-String' in document.body.style is false +PASS 'pad' in document.body.style is false PASS 'cssText' in document.body.style is true PASS initialIndexOfGroup2 > initialIndexOfGroup1 is true PASS initialIndexOfGroup3 > initialIndexOfGroup2 is true diff --git a/LayoutTests/fast/css/style-enumerate-properties.html b/LayoutTests/fast/css/style-enumerate-properties.html index 4822292ec1e2..04c5aac12ad7 100644 --- a/LayoutTests/fast/css/style-enumerate-properties.html +++ b/LayoutTests/fast/css/style-enumerate-properties.html @@ -18,6 +18,7 @@ shouldBeTrue("'webkitTransform' in document.body.style"); shouldBeTrue("'WebkitTransform' in document.body.style"); shouldBeFalse("'bogus-random-String' in document.body.style"); + shouldBeFalse("'pad' in document.body.style"); // descriptor only names should not be included shouldBeTrue("'cssText' in document.body.style"); // Test invariants on the order of the enumerated properties. These are not in the spec, but we diff --git a/LayoutTests/fast/dom/Document-createElementNS-html-prefix-expected.txt b/LayoutTests/fast/dom/Document-createElementNS-html-prefix-expected.txt new file mode 100644 index 000000000000..46bb70134565 --- /dev/null +++ b/LayoutTests/fast/dom/Document-createElementNS-html-prefix-expected.txt @@ -0,0 +1,21 @@ +Tests that Document.createElementNS preserves a non-null prefix on known HTML elements. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS element.prefix is "foo" +PASS element.localName is "textarea" +PASS element.tagName is "FOO:TEXTAREA" +PASS element.namespaceURI is "http://www.w3.org/1999/xhtml" +PASS element.prefix is "foo" +PASS element.localName is "article" +PASS element.tagName is "FOO:ARTICLE" +PASS element.namespaceURI is "http://www.w3.org/1999/xhtml" +PASS element.prefix is "foo" +PASS element.localName is "selectedcontent" +PASS element.tagName is "FOO:SELECTEDCONTENT" +PASS element.namespaceURI is "http://www.w3.org/1999/xhtml" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/dom/Document-createElementNS-html-prefix.html b/LayoutTests/fast/dom/Document-createElementNS-html-prefix.html new file mode 100644 index 000000000000..23244830ce8c --- /dev/null +++ b/LayoutTests/fast/dom/Document-createElementNS-html-prefix.html @@ -0,0 +1,29 @@ + + + + + + + diff --git a/LayoutTests/fast/dom/Document/createdDocument-readyState-expected.txt b/LayoutTests/fast/dom/Document/createdDocument-readyState-expected.txt deleted file mode 100644 index e3aca57dd1a5..000000000000 --- a/LayoutTests/fast/dom/Document/createdDocument-readyState-expected.txt +++ /dev/null @@ -1,19 +0,0 @@ -Tests document.readyState() for documents created by JavaScript - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - - -htmlDocument = document.implementation.createHTMLDocument() -PASS htmlDocument.readyState is "loading" -htmlDocument.close() -PASS htmlDocument.readyState is "complete" -xhtmlDocument = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null) -PASS xhtmlDocument.readyState is "complete" -svgDocument = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg', null) -PASS svgDocument.readyState is "complete" -xmlDocument = (new DOMParser()).parseFromString('', 'text/xml') -PASS xmlDocument.readyState is "complete" -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/LayoutTests/fast/dom/Document/createdDocument-readyState.html b/LayoutTests/fast/dom/Document/createdDocument-readyState.html deleted file mode 100644 index 2063c00661cd..000000000000 --- a/LayoutTests/fast/dom/Document/createdDocument-readyState.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/LayoutTests/fast/dom/Document/readystate-expected.txt b/LayoutTests/fast/dom/Document/readystate-expected.txt index daa8d9f339a8..d00f63bb096a 100644 --- a/LayoutTests/fast/dom/Document/readystate-expected.txt +++ b/LayoutTests/fast/dom/Document/readystate-expected.txt @@ -4,7 +4,6 @@ PASS document.onreadystatechange is null PASS document.readyState is "loading" PASS subdocument.readyState is "loading" PASS subdocument.readyState is "complete" -PASS htmlDocument.readyState is "loading" PASS dynamicIframe.contentDocument.readyState is "complete" PASS dynamicIframe.contentDocument.onreadystatechange is null PASS dynamicIframe.contentDocument.readyState is "loading" diff --git a/LayoutTests/fast/dom/Document/readystate.html b/LayoutTests/fast/dom/Document/readystate.html index 0ead716eadef..b91466ea5f9c 100644 --- a/LayoutTests/fast/dom/Document/readystate.html +++ b/LayoutTests/fast/dom/Document/readystate.html @@ -43,9 +43,6 @@ subdocument.close(); shouldBeEqualToString("subdocument.readyState", "complete"); - var htmlDocument = document.implementation.createHTMLDocument(); - shouldBeEqualToString("htmlDocument.readyState", "loading"); - var expectedDynamicStates = ["interactive", "complete"]; var nextExpectedDynamicState = 0; var dynamicIframe = document.createElement('iframe'); diff --git a/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once-expected.txt b/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once-expected.txt index d773d9d259ac..6c31584b2027 100644 --- a/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once-expected.txt +++ b/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once-expected.txt @@ -1,8 +1,7 @@ -data:text/css,div { background: green; width: 100px; height: 100px } - willSendRequest redirectResponse (null) -link-preload-load-once.html - didFinishLoading -data:text/css,div { background: green; width: 100px; height: 100px } - didReceiveResponse -data:text/css,div { background: green; width: 100px; height: 100px } - didFinishLoading This tests overriding rel content attribute with the same value. You should see 1 below: 1 +link-preload-load-once.html - willSendRequest redirectResponse (null) +link-preload-load-once.html - didReceiveResponse +link-preload-load-once.html - didFinishLoading diff --git a/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once.html b/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once.html index 81562fe9359f..81248a8f71a6 100644 --- a/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once.html +++ b/LayoutTests/fast/dom/HTMLLinkElement/link-preload-load-once.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.waitUntilDone(); testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); } let loadCount = 0; diff --git a/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once-expected.txt b/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once-expected.txt index 2b8e7bdc3667..4cff322342d6 100644 --- a/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once-expected.txt +++ b/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once-expected.txt @@ -1,8 +1,10 @@ -resources/link-stylesheet-load-once.css - willSendRequest redirectResponse (null) -link-stylesheet-load-once.html - didFinishLoading -resources/link-stylesheet-load-once.css - didReceiveResponse -resources/link-stylesheet-load-once.css - didFinishLoading This tests overriding rel content attribute with the same value. You should see 1 in a green box below: 1 +link-stylesheet-load-once.html - willSendRequest redirectResponse (null) +link-stylesheet-load-once.html - didReceiveResponse +link-stylesheet-load-once.html - didFinishLoading +resources/link-stylesheet-load-once.css - willSendRequest redirectResponse (null) +resources/link-stylesheet-load-once.css - didReceiveResponse +resources/link-stylesheet-load-once.css - didFinishLoading diff --git a/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once.html b/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once.html index e1cde11fbaa3..ba3aa3adcae2 100644 --- a/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once.html +++ b/LayoutTests/fast/dom/HTMLLinkElement/link-stylesheet-load-once.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.waitUntilDone(); testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); } let loadCount = 0; diff --git a/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash-expected.txt b/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash-expected.txt new file mode 100644 index 000000000000..3beacfe2a8d5 --- /dev/null +++ b/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash-expected.txt @@ -0,0 +1,4 @@ +This tests calling createContextualFragment with trusted types createHTML callback which clears range's endpoints. +WebKit should not crash or hit any assertions under ASAN and you should see PASS below: + +PASS diff --git a/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash.html b/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash.html new file mode 100644 index 000000000000..f6fead5ad91d --- /dev/null +++ b/LayoutTests/fast/dom/Range/range-create-contextual-fragment-trsuted-types-crash.html @@ -0,0 +1,39 @@ + + + + + + +

This tests calling createContextualFragment with trusted types createHTML callback which clears range's endpoints.
+WebKit should not crash or hit any assertions under ASAN and you should see PASS below:

+
+ + + + diff --git a/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash-expected.txt b/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash-expected.txt new file mode 100644 index 000000000000..c70e618a6e77 --- /dev/null +++ b/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash-expected.txt @@ -0,0 +1,10 @@ +Clearing the querySelectorAll result cache under memory pressure must also clear each node's HasValidQuerySelectorAllResults flag. Otherwise a still-alive node keeps claiming it has cached results while the document's map no longer has an entry for it, and a later class-attribute change asserts. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Did not crash changing a class after the cache was cleared under memory pressure. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash.html b/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash.html new file mode 100644 index 000000000000..741a00b7978a --- /dev/null +++ b/LayoutTests/fast/dom/query-selector-all-cache-memory-pressure-crash.html @@ -0,0 +1,42 @@ + + + + + + +
+
+ + + diff --git a/LayoutTests/fast/dom/set-outer-html-special-cases-expected.txt b/LayoutTests/fast/dom/set-outer-html-special-cases-expected.txt index ac0bb5648466..56cd083d7157 100644 --- a/LayoutTests/fast/dom/set-outer-html-special-cases-expected.txt +++ b/LayoutTests/fast/dom/set-outer-html-special-cases-expected.txt @@ -4,7 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE PASS document.getElementById('svgElement').innerHTML is "" -PASS document.documentElement.outerHTML = '' threw exception NoModificationAllowedError: Cannot set outerHTML on element because its parent is not an Element. +PASS document.documentElement.outerHTML = '' threw exception NoModificationAllowedError: Cannot set outerHTML on element because its parent is a Document. PASS a.parentNode is null PASS a.outerHTML = '' did not throw exception. PASS successfullyParsed is true diff --git a/LayoutTests/fast/dom/set-outer-html-special-cases.html b/LayoutTests/fast/dom/set-outer-html-special-cases.html index 0be0ad35e073..045e533e12cf 100644 --- a/LayoutTests/fast/dom/set-outer-html-special-cases.html +++ b/LayoutTests/fast/dom/set-outer-html-special-cases.html @@ -12,8 +12,7 @@ // We should throw a NoModificationAllowedError if the parent is a Document. shouldThrowErrorName("document.documentElement.outerHTML = ''", "NoModificationAllowedError"); - // We currently throw an exception when the parent is null, as does Blink. Gecko and the specification - // say this should be a no-op though. + // Setting outerHTML on an element with no parent is a no-op per the specification. a = document.createElement("a"); shouldBe("a.parentNode", "null"); shouldNotThrow("a.outerHTML = ''"); diff --git a/LayoutTests/fast/events/mouse-cursor-light-dark-expected.txt b/LayoutTests/fast/events/mouse-cursor-light-dark-expected.txt new file mode 100644 index 000000000000..d1602882c897 --- /dev/null +++ b/LayoutTests/fast/events/mouse-cursor-light-dark-expected.txt @@ -0,0 +1,28 @@ +Test that cursor: light-dark() resolves to the correct image based on color-scheme. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + + +TEST CASE: Light scheme - light-dark() with URL images +Cursor Info: type=Custom hotSpot=0,0 image=25x25 + +TEST CASE: Dark scheme - light-dark() with URL images +Cursor Info: type=Custom hotSpot=0,0 image=30x30 + +TEST CASE: Dark scheme (set dynamically) - light-dark() with URL images +Cursor Info: type=Custom hotSpot=0,0 image=30x30 + +TEST CASE: light-dark() with gradient as first arg (invalid value) +Cursor Info: type=IBeam hotSpot=0,0 + +TEST CASE: light-dark() with gradient as second arg (invalid value) +Cursor Info: type=IBeam hotSpot=0,0 + +TEST CASE: light-dark() with both args as gradients (invalid value) +Cursor Info: type=IBeam hotSpot=0,0 + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/mouse-cursor-light-dark.html b/LayoutTests/fast/events/mouse-cursor-light-dark.html new file mode 100644 index 000000000000..b3fcfdfced18 --- /dev/null +++ b/LayoutTests/fast/events/mouse-cursor-light-dark.html @@ -0,0 +1,69 @@ + + + + + + + + +

+
+
Light scheme - light-dark() with URL images
+
Dark scheme - light-dark() with URL images
+
Dark scheme (set dynamically) - light-dark() with URL images
+
light-dark() with gradient as first arg (invalid value)
+
light-dark() with gradient as second arg (invalid value)
+
light-dark() with both args as gradients (invalid value)
+
+
+
+ + + diff --git a/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message-expected.txt b/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message-expected.txt new file mode 100644 index 000000000000..a84eb0a31945 --- /dev/null +++ b/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message-expected.txt @@ -0,0 +1,4 @@ +This tests opening a window after a series of postMessage with a delay. WebKit should prevent a popup window from being opened after 1s. + +Start test +PASS diff --git a/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message.html b/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message.html new file mode 100644 index 000000000000..21d644818220 --- /dev/null +++ b/LayoutTests/fast/events/popup-blocked-after-user-gesture-is-expired-after-post-message.html @@ -0,0 +1,47 @@ + + + + + +

This tests opening a window after a series of postMessage with a delay. WebKit should prevent a popup window from being opened after 1s.

+Start test +
\ No newline at end of file diff --git a/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor-expected.txt b/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor-expected.txt new file mode 100644 index 000000000000..9bbd8d447106 --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor-expected.txt @@ -0,0 +1,11 @@ +Tap me +Verifies that calling preventDefault() on a pointerdown event dispatched to an ancestor does not suppress the synthetic click event when tapping a descendant. To manually test, tap the button inside the orange box; both pointerdown and click should fire on the parent div. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS pointerdownFiredOnParent is true +PASS clickFiredOnParent is true +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor.html b/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor.html new file mode 100644 index 000000000000..c91f77f2b370 --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/click-event-after-pointerdown-prevent-default-on-ancestor.html @@ -0,0 +1,59 @@ + + + + + + + + + +
+ +
+

+    

+
+
+
diff --git a/LayoutTests/fast/forms/ios/drag-range-track-expected.txt b/LayoutTests/fast/events/touch/ios/slider-touch-drag-small-thumb-expected.txt
similarity index 100%
rename from LayoutTests/fast/forms/ios/drag-range-track-expected.txt
rename to LayoutTests/fast/events/touch/ios/slider-touch-drag-small-thumb-expected.txt
diff --git a/LayoutTests/fast/events/touch/ios/slider-touch-drag-small-thumb.html b/LayoutTests/fast/events/touch/ios/slider-touch-drag-small-thumb.html
new file mode 100644
index 000000000000..ff5aa4737789
--- /dev/null
+++ b/LayoutTests/fast/events/touch/ios/slider-touch-drag-small-thumb.html
@@ -0,0 +1,55 @@
+ 
+
+
+    
+    
+    
+    
+    
+
+
+
+
+
+ + diff --git a/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-expected.txt b/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-expected.txt index fc14b6148e29..5a21f237cecf 100644 --- a/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-expected.txt +++ b/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-expected.txt @@ -1,9 +1,9 @@ (event region (rect (0,0) width=800 height=600) (touch event listener region: asynchronousDispatchRegion: - (rect (8,8) width=114 height=113) + (rect (8,8) width=120 height=120) eventSpecificSynchronousDispatchRegions: eventName: touchstart eventRect: - (rect (8,8) width=114 height=113) + (rect (8,8) width=120 height=120) ) ) diff --git a/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-with-layer-based-svg-engine-expected.txt b/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-with-layer-based-svg-engine-expected.txt index fc14b6148e29..5a21f237cecf 100644 --- a/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-with-layer-based-svg-engine-expected.txt +++ b/LayoutTests/fast/events/touch/ios/touch-event-regions-layer-tree/svg-with-layer-based-svg-engine-expected.txt @@ -1,9 +1,9 @@ (event region (rect (0,0) width=800 height=600) (touch event listener region: asynchronousDispatchRegion: - (rect (8,8) width=114 height=113) + (rect (8,8) width=120 height=120) eventSpecificSynchronousDispatchRegions: eventName: touchstart eventRect: - (rect (8,8) width=114 height=113) + (rect (8,8) width=120 height=120) ) ) diff --git a/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-expected.txt b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-expected.txt new file mode 100644 index 000000000000..c257a414bc86 --- /dev/null +++ b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-expected.txt @@ -0,0 +1,11 @@ +PASS: wheel event was dispatched to with mouse in empty interior. + +(event region + (rect (0,0) width=800 height=600) + (wheel event listener region + (rect (8,8) width=300 height=300) + (non-passive + (rect (8,8) width=300 height=300) + ) + ) + ) diff --git a/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine-expected.txt b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine-expected.txt new file mode 100644 index 000000000000..c257a414bc86 --- /dev/null +++ b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine-expected.txt @@ -0,0 +1,11 @@ +PASS: wheel event was dispatched to with mouse in empty interior. + +(event region + (rect (0,0) width=800 height=600) + (wheel event listener region + (rect (8,8) width=300 height=300) + (non-passive + (rect (8,8) width=300 height=300) + ) + ) + ) diff --git a/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine.html b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine.html new file mode 100644 index 000000000000..d5f68c71556c --- /dev/null +++ b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines-with-layer-based-svg-engine.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines.html b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines.html new file mode 100644 index 000000000000..f2aa2f743b8e --- /dev/null +++ b/LayoutTests/fast/events/wheel/wheel-event-on-svg-with-stroked-lines.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/fast/flexbox/clear-overflow-before-scroll-update-expected.txt b/LayoutTests/fast/flexbox/clear-overflow-before-scroll-update-expected.txt index 82ab464a1b1a..bf5baa7143d4 100644 --- a/LayoutTests/fast/flexbox/clear-overflow-before-scroll-update-expected.txt +++ b/LayoutTests/fast/flexbox/clear-overflow-before-scroll-update-expected.txt @@ -10,6 +10,6 @@ layer at (0,0) size 800x39 RenderText {#text} at (0,0) size 0x0 layer at (8,8) size 15x23 clip at (13,13) size 5x13 RenderMenuList {SELECT} at (0,0) size 15x23 [bgcolor=#FFFFFF] [border: (5px solid #000000)] - RenderSelectFallbackButton {DIV} at (5,5) size 5x13 - RenderText at (-9999,0) size 0x13 + RenderBlock {DIV} at (5,5) size 5x13 + RenderText {#text} at (-9999,0) size 0x13 text run at (-9999,0) width 0: " " diff --git a/LayoutTests/fast/flexbox/preferred-width-empty-inline-block-expected.txt b/LayoutTests/fast/flexbox/preferred-width-empty-inline-block-expected.txt new file mode 100644 index 000000000000..0b2e062be92b --- /dev/null +++ b/LayoutTests/fast/flexbox/preferred-width-empty-inline-block-expected.txt @@ -0,0 +1,27 @@ +Tests that preferred width for content with an empty inline-block is computed correctly. + +PASS: empty inline-block with no styles + +PASS: empty inline-block with width: 0 + +PASS: empty inline-block with padding + +PASS: empty inline-block with border + +PASS: empty inline-block with margin + +PASS: empty inline-block with explicit size 0x0 + +PASS: empty inline-block with width: 10px + +PASS: empty inline-block with height: 20px + +PASS: empty inline-block with width: 50% + +PASS: empty inline-block with width: auto + +PASS: empty inline-block with width: min-content + +PASS: empty inline-block with width: max-content + +PASS: empty inline-block with width: fit-content diff --git a/LayoutTests/fast/flexbox/preferred-width-empty-inline-block.html b/LayoutTests/fast/flexbox/preferred-width-empty-inline-block.html new file mode 100644 index 000000000000..c5b3da8195ab --- /dev/null +++ b/LayoutTests/fast/flexbox/preferred-width-empty-inline-block.html @@ -0,0 +1,53 @@ + + + +

Tests that preferred width for content with an empty inline-block is computed correctly.

+ diff --git a/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event-expected.txt b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event-expected.txt new file mode 100644 index 000000000000..d71615565c02 --- /dev/null +++ b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event-expected.txt @@ -0,0 +1,11 @@ +Test that changing the input type during an input event does not crash. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS input.type is "text" +PASS Did not crash. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event.html b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event.html new file mode 100644 index 000000000000..79d7c2bae618 --- /dev/null +++ b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-change-type-on-input-event.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color-expected.txt b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color-expected.txt new file mode 100644 index 000000000000..e4714484940b --- /dev/null +++ b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color-expected.txt @@ -0,0 +1,6 @@ +PASS getComputedStyle(field).color is not "rgb(0, 0, 0)" +PASS getComputedStyle(field).color is "rgb(0, 0, 0)" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color.html b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color.html new file mode 100644 index 000000000000..5b16872b1835 --- /dev/null +++ b/LayoutTests/fast/forms/date/date-editable-components/date-editable-components-component-set-updates-color.html @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/LayoutTests/fast/forms/ios/drag-range-track.html b/LayoutTests/fast/forms/ios/drag-range-track.html deleted file mode 100644 index 859152566087..000000000000 --- a/LayoutTests/fast/forms/ios/drag-range-track.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - -
-
- - diff --git a/LayoutTests/fast/forms/ios/insert-autofill-suggestion-expected.txt b/LayoutTests/fast/forms/ios/insert-autofill-suggestion-expected.txt new file mode 100644 index 000000000000..4da82b820a0e --- /dev/null +++ b/LayoutTests/fast/forms/ios/insert-autofill-suggestion-expected.txt @@ -0,0 +1,11 @@ + +Tests that UIHelper.insertAutofillSuggestion fills the focused username and password inputs in a same-origin login form on iOS. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS userValue is "frederik" +PASS passwordValue is "famos" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/ios/insert-autofill-suggestion.html b/LayoutTests/fast/forms/ios/insert-autofill-suggestion.html new file mode 100644 index 000000000000..2d788f7c05a2 --- /dev/null +++ b/LayoutTests/fast/forms/ios/insert-autofill-suggestion.html @@ -0,0 +1,49 @@ + + + + + + + + + + + +

+

+
+
+
diff --git a/LayoutTests/fast/forms/select-non-native-rendering-direction-expected.txt b/LayoutTests/fast/forms/select-non-native-rendering-direction-expected.txt
index 4b97edfc2ab7..63e6b19f2006 100644
--- a/LayoutTests/fast/forms/select-non-native-rendering-direction-expected.txt
+++ b/LayoutTests/fast/forms/select-non-native-rendering-direction-expected.txt
@@ -7,8 +7,8 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,7) size 122x17
           text run at (0,7) width 122: "Left to right select: "
         RenderMenuList {SELECT} at (124,2) size 140x27 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-          RenderSelectFallbackButton {DIV} at (1,1) size 138x25
-            RenderText at (4,4) size 64x17
+          RenderBlock {DIV} at (1,1) size 138x25
+            RenderText {#text} at (4,4) size 64x17
               text run at (4,4) width 64: "Alabama"
         RenderText {#text} at (0,0) size 0x0
       RenderBlock {DIV} at (0,31) size 784x31
@@ -16,7 +16,7 @@ layer at (0,0) size 800x600
           text run at (662,7) width 8 RTL: ": "
           text run at (670,7) width 114: "Right to left select"
         RenderMenuList {SELECT} at (520,2) size 140x27 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-          RenderSelectFallbackButton {DIV} at (1,1) size 138x25
-            RenderText at (70,4) size 64x17
+          RenderBlock {DIV} at (1,1) size 138x25
+            RenderText {#text} at (70,4) size 64x17
               text run at (70,4) width 64: "Alabama"
         RenderText {#text} at (0,0) size 0x0
diff --git a/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash-expected.txt b/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash-expected.txt
new file mode 100644
index 000000000000..ce750f7a0cbc
--- /dev/null
+++ b/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash-expected.txt
@@ -0,0 +1,13 @@
+Changing the selected option while the picker is open must not crash when an author rule makes ::checkmark content depend on :checked.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS select.value is "Two"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+One
+Two
+
diff --git a/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash.html b/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash.html
new file mode 100644
index 000000000000..20e54348c366
--- /dev/null
+++ b/LayoutTests/fast/forms/select/base/option-checkmark-content-change-crash.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LayoutTests/fast/grid/grid-overflow-after-style-change-crash-expected.txt b/LayoutTests/fast/grid/grid-overflow-after-style-change-crash-expected.txt
new file mode 100644
index 000000000000..c2541f4f3dd7
--- /dev/null
+++ b/LayoutTests/fast/grid/grid-overflow-after-style-change-crash-expected.txt
@@ -0,0 +1 @@
+PASS if no crash.
diff --git a/LayoutTests/fast/grid/grid-overflow-after-style-change-crash.html b/LayoutTests/fast/grid/grid-overflow-after-style-change-crash.html
new file mode 100644
index 000000000000..a9255180d071
--- /dev/null
+++ b/LayoutTests/fast/grid/grid-overflow-after-style-change-crash.html
@@ -0,0 +1,36 @@
+ 
+
+
+
+
+
+
+
+
+
PASS if no crash.
+ diff --git a/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe-expected.txt b/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe-expected.txt new file mode 100644 index 000000000000..623e49f453ee --- /dev/null +++ b/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe-expected.txt @@ -0,0 +1,9 @@ +Tests that navigating an iframe after going back does not create a new main frame history item. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe.html b/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe.html new file mode 100644 index 000000000000..6a5d88e4b86b --- /dev/null +++ b/LayoutTests/fast/history/site-isolation/go-back-then-navigate-subframe.html @@ -0,0 +1,28 @@ + + + + diff --git a/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url-expected.txt b/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url-expected.txt new file mode 100644 index 000000000000..4b4ae6df4b20 --- /dev/null +++ b/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url-expected.txt @@ -0,0 +1,22 @@ +ALERT: Initial URL loaded. +ALERT: Final URL loaded. +ALERT: Going back. +ALERT: Final URL loaded. +Checks that when going back to a page that frames that were navigated, that the final URL of the frames is loaded directly, instead the initial URL. Four alerts should appear, in this order: + +Initial URL loaded. +Final URL loaded. +Going back. +Final URL loaded. + + +-------- +Frame: '' +-------- +final page contents + +============== Back Forward List ============== +curr-> (file test):fast/history/site-isolation/history-back-initial-vs-final-url.html + (file test):fast/history/resources/frame-final-url.html (in frame "") + data:text/html, +=============================================== diff --git a/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url.html b/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url.html new file mode 100644 index 000000000000..85b3d37dde88 --- /dev/null +++ b/LayoutTests/fast/history/site-isolation/history-back-initial-vs-final-url.html @@ -0,0 +1,42 @@ + + + + + +

Checks that when going back to a page that frames that were navigated, that the final URL of the frames is loaded directly, instead the initial URL. Four alerts should appear, in this order:

+ +
    +
  1. Initial URL loaded.
  2. +
  3. Final URL loaded.
  4. +
  5. Going back.
  6. +
  7. Final URL loaded.
  8. +
+ + + + + + \ No newline at end of file diff --git a/LayoutTests/fast/images/stopped-animation-deleted-image.html b/LayoutTests/fast/images/stopped-animation-deleted-image.html index 306bd6794350..02a6dd40e6ae 100644 --- a/LayoutTests/fast/images/stopped-animation-deleted-image.html +++ b/LayoutTests/fast/images/stopped-animation-deleted-image.html @@ -10,9 +10,9 @@ jsTestIsAsync = true; internals.clearMemoryCache(); - internals.settings.setWebkitImageReadyEventEnabled(true); var image = document.getElementsByTagName("img")[0]; + var loopCount = 0; var frameIndex; function imageLoaded() @@ -25,15 +25,14 @@ function imageRemove() { - image.addEventListener("webkitImageFrameReady", function listener() { - image.removeEventListener("webkitImageFrameReady", listener, true); + setTimeout(function() { frameIndex = internals.imageFrameIndex(image); image.remove(); setTimeout(function() { shouldBe("internals.imageFrameIndex(image)", "frameIndex"); finishJSTest(); }, 50); - }, true); + }, 50); } diff --git a/LayoutTests/fast/images/support-broken-image-delegate.html b/LayoutTests/fast/images/support-broken-image-delegate.html index 0b5170e4e41a..bdd97d4b5034 100644 --- a/LayoutTests/fast/images/support-broken-image-delegate.html +++ b/LayoutTests/fast/images/support-broken-image-delegate.html @@ -1,9 +1,9 @@ + \ No newline at end of file diff --git a/LayoutTests/fast/loader/file-protocol-fragment-expected.txt b/LayoutTests/fast/loader/file-protocol-fragment-expected.txt index 16738390441c..720361782cdb 100644 --- a/LayoutTests/fast/loader/file-protocol-fragment-expected.txt +++ b/LayoutTests/fast/loader/file-protocol-fragment-expected.txt @@ -1,8 +1,10 @@ -resources/stylesheet.css - willSendRequest redirectResponse (null) -resources/stylesheet.css - willSendRequest redirectResponse (null) +This tests that file: URL are loaded separately even if they differ by the fragment only. +file-protocol-fragment.html - willSendRequest redirectResponse (null) +file-protocol-fragment.html - didReceiveResponse file-protocol-fragment.html - didFinishLoading +resources/stylesheet.css - willSendRequest redirectResponse (null) resources/stylesheet.css - didReceiveResponse resources/stylesheet.css - didFinishLoading +resources/stylesheet.css - willSendRequest redirectResponse (null) resources/stylesheet.css - didReceiveResponse resources/stylesheet.css - didFinishLoading -This tests that file: URL are loaded separately even if they differ by the fragment only. diff --git a/LayoutTests/fast/loader/file-protocol-fragment.html b/LayoutTests/fast/loader/file-protocol-fragment.html index 5e940e03c017..6e2265f267d3 100644 --- a/LayoutTests/fast/loader/file-protocol-fragment.html +++ b/LayoutTests/fast/loader/file-protocol-fragment.html @@ -1,17 +1,27 @@ + - - + This tests that file: URL are loaded separately even if they differ by the fragment only. diff --git a/LayoutTests/fast/loader/main-document-url-for-non-http-loads.html b/LayoutTests/fast/loader/main-document-url-for-non-http-loads.html index 05db21e3083b..0fc074ab8a80 100644 --- a/LayoutTests/fast/loader/main-document-url-for-non-http-loads.html +++ b/LayoutTests/fast/loader/main-document-url-for-non-http-loads.html @@ -1,9 +1,9 @@ + +PASS if no crash. diff --git a/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames-expected.txt b/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames-expected.txt new file mode 100644 index 000000000000..54c6d4978440 --- /dev/null +++ b/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames-expected.txt @@ -0,0 +1,7 @@ +PASS frame$($("frame1"), "input2").value is "value2" +PASS frame$(frame$($("frame1"), "frame2"), "input3").value is "value3" +PASS successfullyParsed is true + +TEST COMPLETE + + diff --git a/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames.html b/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames.html new file mode 100644 index 000000000000..350ddf1f55f1 --- /dev/null +++ b/LayoutTests/fast/loader/site-isolation/form-state-restore-with-frames.html @@ -0,0 +1,42 @@ + + + + + + + + + + +
+ +
+ + + + diff --git a/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks-expected.txt b/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks-expected.txt index 1b69789de918..780eed2f0d70 100644 --- a/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks-expected.txt +++ b/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks-expected.txt @@ -1 +1,4 @@ This tests that no delegate methods are sent for the user style sheet. No stylesheet load messages should be dumped. +user-style-sheet-resource-load-callbacks.html - willSendRequest redirectResponse (null) +user-style-sheet-resource-load-callbacks.html - didReceiveResponse +user-style-sheet-resource-load-callbacks.html - didFinishLoading diff --git a/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks.html b/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks.html index 81eeb5feb38a..123d6faa6c5c 100644 --- a/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks.html +++ b/LayoutTests/fast/loader/user-style-sheet-resource-load-callbacks.html @@ -1,8 +1,8 @@ + diff --git a/LayoutTests/fast/masking/parsing-mask-source-type-expected.txt b/LayoutTests/fast/masking/parsing-mask-source-type-expected.txt index b80dc6fa9447..a85ab2797b01 100644 --- a/LayoutTests/fast/masking/parsing-mask-source-type-expected.txt +++ b/LayoutTests/fast/masking/parsing-mask-source-type-expected.txt @@ -1,5 +1,5 @@ PASS setProperty("alpha, alpha, alpha, alpha") is "alpha, alpha, alpha, alpha" -PASS setProperty("luminance, alpha") is "luminance, alpha, luminance, alpha" +PASS setProperty("luminance, alpha") is "luminance, alpha" PASS setProperty("luminance, luminance, luminance, luminance") is "luminance, luminance, luminance, luminance" PASS setProperty("auto, alpha, luminance, luminance") is "alpha, alpha, luminance, luminance" PASS successfullyParsed is true diff --git a/LayoutTests/fast/masking/parsing-mask-source-type.html b/LayoutTests/fast/masking/parsing-mask-source-type.html index d5dd5227d626..ea06fac1bdc0 100644 --- a/LayoutTests/fast/masking/parsing-mask-source-type.html +++ b/LayoutTests/fast/masking/parsing-mask-source-type.html @@ -24,7 +24,7 @@ } test("alpha, alpha, alpha, alpha", "alpha, alpha, alpha, alpha"); - test("luminance, alpha", "luminance, alpha, luminance, alpha"); + test("luminance, alpha", "luminance, alpha"); test("luminance, luminance, luminance, luminance", "luminance, luminance, luminance, luminance"); test("auto, alpha, luminance, luminance", "alpha, alpha, luminance, luminance"); diff --git a/LayoutTests/fast/mediastream/MediaStream-page-muted.html b/LayoutTests/fast/mediastream/MediaStream-page-muted.html index 7da6b001b4fa..90fc85bed2a1 100644 --- a/LayoutTests/fast/mediastream/MediaStream-page-muted.html +++ b/LayoutTests/fast/mediastream/MediaStream-page-muted.html @@ -10,6 +10,7 @@ function nextStep() { if (muteChangedEvent.type == "unmute") { + mediaStream.getTracks().forEach(t => t.stop()); finishJSTest(); return; } diff --git a/LayoutTests/fast/mediastream/MediaStream-video-element-displays-buffer.html b/LayoutTests/fast/mediastream/MediaStream-video-element-displays-buffer.html index 1a4aaef695b6..cfb6d9bdbe78 100644 --- a/LayoutTests/fast/mediastream/MediaStream-video-element-displays-buffer.html +++ b/LayoutTests/fast/mediastream/MediaStream-video-element-displays-buffer.html @@ -50,6 +50,10 @@ checkPixels(x, y, currentTest ? isPixelGray : isPixelBlack, true) if (currentTest >= 1) { + if (videos[0].srcObject) + videos[0].srcObject.getTracks().forEach(t => t.stop()); + if (videos[1].srcObject) + videos[1].srcObject.getTracks().forEach(t => t.stop()); finishJSTest(); return; } diff --git a/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled.html b/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled.html index a24bc894295c..ba9b85000271 100644 --- a/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled.html +++ b/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/fast/mediastream/MediaStreamTrackEvent-constructor.html b/LayoutTests/fast/mediastream/MediaStreamTrackEvent-constructor.html index 9d4da90701b3..3d85c45b319a 100644 --- a/LayoutTests/fast/mediastream/MediaStreamTrackEvent-constructor.html +++ b/LayoutTests/fast/mediastream/MediaStreamTrackEvent-constructor.html @@ -60,7 +60,7 @@ shouldBeNonNull("mediaStream.getVideoTracks()[0]"); mediaStreamTrack = mediaStream.getVideoTracks()[0]; testMediaStreamTrackEvent(); - mediaStreamTrack.stop(); + mediaStream.getTracks().forEach(t => t.stop()); } function primeTimeout(msg) diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer-bundlePolicy-bundle-only.html b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer-bundlePolicy-bundle-only.html index ad0fb82f3e48..79171d3dfb1a 100644 --- a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer-bundlePolicy-bundle-only.html +++ b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer-bundlePolicy-bundle-only.html @@ -9,13 +9,12 @@ description("Inspect that the SDP offer contains the correct number of a=bundle-only lines according to the bundlePolicy value."); - if (window.testRunner) - testRunner.setUserMediaPermission(true); - else { + if (!window.testRunner) { debug("This test can not be run without the testRunner"); finishJSTest(); } + let gumStreams = []; function testBundlePolicySDP(bundlePolicy) { var mediaDescriptionVariables = []; var numberOfExtraTracksPerType = 5; @@ -47,6 +46,7 @@ navigator.mediaDevices.getUserMedia({ "audio": true, "video": true}) .then(function (stream) { + gumStreams.push(stream); testPassed("Start promise chain for bundlePolicy: " + bundlePolicy); var audioTrack = stream.getAudioTracks()[0]; var videoTrack = stream.getVideoTracks()[0]; @@ -61,6 +61,7 @@ pc.addTrack(videoTrackCloned, stream); mediaDescriptionVariables.push({ "trackId": audioTrackCloned.id, "streamId": stream.id }); mediaDescriptionVariables.push({ "trackId": videoTrackCloned.id, "streamId": stream.id }); + gumStreams.push(new MediaStream([audioTrackCloned, videoTrackCloned])); } return pc.createOffer(); }) @@ -92,6 +93,7 @@ if (subTestsCompleted == bundlePolicies.length) { testPassed("Tested the following bundlePolicy values: " + bundlePolicies.join(" ")); finishJSTest(); + gumStreams.forEach(stream => stream.getTracks().forEach(track => track.stop())); } else { testBundlePolicySDP(bundlePolicies[subTestsCompleted]); subTestsCompleted++; diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html b/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html index c71c25b7bc46..09efbc3b0b13 100644 --- a/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html +++ b/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html @@ -15,9 +15,7 @@ description("Test the case where an RTCRtpTransceiver gets a remotely assigned mid and also unmute the associated source"); - if (window.testRunner) - testRunner.setUserMediaPermission(true); - else { + if (!window.testRunner) { debug("This test can not be run without the testRunner"); finishJSTest(); } @@ -37,6 +35,7 @@ event.track.onunmute = function () { testPassed("B: remote track unmute event"); + stream.getTracks().forEach(t => t.stop()); finishJSTest(); }; }; diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-stats.html b/LayoutTests/fast/mediastream/RTCPeerConnection-stats.html index f58293990fba..3af5a9447308 100644 --- a/LayoutTests/fast/mediastream/RTCPeerConnection-stats.html +++ b/LayoutTests/fast/mediastream/RTCPeerConnection-stats.html @@ -69,6 +69,7 @@ // Named getter: Can access results by their ID values. shouldBeNonNull('status_g.namedItem(res.id)'); shouldBeNonNull('status_g[res.id]'); + stream.getTracks().forEach(t => t.stop()); finishJSTest(); } diff --git a/LayoutTests/fast/mediastream/audio-unit-reconfigure.html b/LayoutTests/fast/mediastream/audio-unit-reconfigure.html index f64357bf4dcc..f8d2307542fd 100644 --- a/LayoutTests/fast/mediastream/audio-unit-reconfigure.html +++ b/LayoutTests/fast/mediastream/audio-unit-reconfigure.html @@ -25,6 +25,7 @@ stream.getAudioTracks()[0].stop(); const stream2 = await navigator.mediaDevices.getUserMedia({ audio: { sampleRate: 44100 }}); + test.add_cleanup(() => stream2.getTracks().forEach(track => track.stop())); stream2.getAudioTracks()[0].onended = () => assert_not_reached("should not end"); await new Promise(resolve => setTimeout(resolve, 100)); }, "Reconfigure audio sample rate"); @@ -64,6 +65,7 @@ const stream2 = await navigator.mediaDevices.getUserMedia({ audio: musicModeAudioConstraints }); stream2.getAudioTracks()[0].onended = () => log.innerHTML += 'track ended'; await new Promise(resolve => setTimeout(resolve, 1000)); + test.add_cleanup(() => stream2.getTracks().forEach(track => track.stop())); }, "Reconfigure audio unit when being in render-only mode"); diff --git a/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html b/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html index 70d7a529f796..7ee9d6cd7181 100644 --- a/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html +++ b/LayoutTests/fast/mediastream/getUserMedia-grant-persistency3.html @@ -11,6 +11,7 @@ if (window.testRunner) testRunner.setUserMediaPermission(true); return navigator.mediaDevices.getUserMedia({audio:false, video:true}).then((stream) => { + test.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); if (window.testRunner) testRunner.setUserMediaPermission(false); isPageVisible = false; @@ -22,7 +23,8 @@ testRunner.setPageVisibility(); }, 1000); return navigator.mediaDevices.getUserMedia({audio:false, video:true}); - }).then(() => { + }).then((stream) => { + test.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); assert_true(isPageVisible, "Resolving getUserMedia promise should wait for page to be visible"); }); }, "Testing same page getUserMedia grant persistency with visibility"); diff --git a/LayoutTests/fast/mediastream/granted-denied-request-management2.html b/LayoutTests/fast/mediastream/granted-denied-request-management2.html index 751da0ce17fb..232dba834b41 100644 --- a/LayoutTests/fast/mediastream/granted-denied-request-management2.html +++ b/LayoutTests/fast/mediastream/granted-denied-request-management2.html @@ -27,7 +27,9 @@ }); await promise; - return navigator.mediaDevices.getUserMedia({ audio: true }); + return navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { + stream.getTracks().forEach(t => t.stop()); + }); }, "Remove audio denied request upon successful audio/video request"); diff --git a/LayoutTests/fast/mediastream/media-stream-track-muted.html b/LayoutTests/fast/mediastream/media-stream-track-muted.html index 24d3dbfce3b8..6d91c979ded1 100644 --- a/LayoutTests/fast/mediastream/media-stream-track-muted.html +++ b/LayoutTests/fast/mediastream/media-stream-track-muted.html @@ -26,9 +26,11 @@ setTimeout(() => { waitForPageStateChange(--numberOfTries, originalState, resolve, reject); }, 10); } - function testTrack(track, title) + function testTrack(track, title, stream) { promise_test((test) => { + if (stream) + test.add_cleanup(() => stream.getTracks().forEach(t => t.stop())); return new Promise((resolve, reject) => { let isVideo = track.kind == "video"; if (window.internals) { @@ -70,7 +72,7 @@ return navigator.mediaDevices.getUserMedia({ video: true, audio: true}) .then((stream) => { testTrack(stream.getVideoTracks()[0], "Mute video track only"); - testTrack(stream.getAudioTracks()[0], "Mute audio track only"); + testTrack(stream.getAudioTracks()[0], "Mute audio track only", stream); }); }, "Create stream"); diff --git a/LayoutTests/fast/mediastream/media-stream-wrapper-collected.html b/LayoutTests/fast/mediastream/media-stream-wrapper-collected.html index 6f97edb7509b..f26b5beb8f2d 100644 --- a/LayoutTests/fast/mediastream/media-stream-wrapper-collected.html +++ b/LayoutTests/fast/mediastream/media-stream-wrapper-collected.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/fast/mediastream/mediarecorder-close.html b/LayoutTests/fast/mediastream/mediarecorder-close.html index e80efe21d8e2..473395b286be 100644 --- a/LayoutTests/fast/mediastream/mediarecorder-close.html +++ b/LayoutTests/fast/mediastream/mediarecorder-close.html @@ -1,4 +1,4 @@ - +
PASS if not crashing
diff --git a/LayoutTests/fast/mediastream/resources/apply-constraints-utils.js b/LayoutTests/fast/mediastream/resources/apply-constraints-utils.js index 1699046fad3c..a2196cfbf585 100644 --- a/LayoutTests/fast/mediastream/resources/apply-constraints-utils.js +++ b/LayoutTests/fast/mediastream/resources/apply-constraints-utils.js @@ -52,6 +52,8 @@ ConstraintsTest = class ConstraintsTest { debug(""); if (!this.tests.length) { + if (this.video && this.video.srcObject) + this.video.srcObject.getTracks().forEach(track => track.stop()); finishJSTest(); return; } diff --git a/LayoutTests/fast/mediastream/video-mediastream-restricted-invisible-autoplay-not-allowed.html b/LayoutTests/fast/mediastream/video-mediastream-restricted-invisible-autoplay-not-allowed.html index 7b19b2d1d196..c000c7a1175f 100644 --- a/LayoutTests/fast/mediastream/video-mediastream-restricted-invisible-autoplay-not-allowed.html +++ b/LayoutTests/fast/mediastream/video-mediastream-restricted-invisible-autoplay-not-allowed.html @@ -54,7 +54,7 @@ function finish() { - video.srcObject.getVideoTracks()[0].stop(); + video.srcObject.getTracks().forEach(t => t.stop()); video.srcObject = null; endTest(); } diff --git a/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr-expected.html b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr-expected.html new file mode 100644 index 000000000000..77e0cdf58316 --- /dev/null +++ b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr-expected.html @@ -0,0 +1,27 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr.html b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr.html new file mode 100644 index 000000000000..c14b163583d6 --- /dev/null +++ b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-vertical-lr.html @@ -0,0 +1,27 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line-expected.html b/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line-expected.html new file mode 100644 index 000000000000..ba10b0a2366d --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line-expected.html @@ -0,0 +1,9 @@ + +
PASS line 1
PASS line 2
HIDDEN line 3
diff --git a/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line.html b/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line.html new file mode 100644 index 000000000000..7ba44269baaa --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-multiline-with-inline-flex-on-clamped-line.html @@ -0,0 +1,13 @@ + +
PASS line 1
PASS line 2
HIDDEN line 3
HIDDEN nested
diff --git a/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line-expected.html b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line-expected.html new file mode 100644 index 000000000000..fe37e78462e6 --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line-expected.html @@ -0,0 +1,9 @@ + +
PASS
HIDDEN
diff --git a/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line.html b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line.html new file mode 100644 index 000000000000..c17ef8dfae6f --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-as-only-content-on-clamped-line.html @@ -0,0 +1,13 @@ + +
PASS
HIDDEN
diff --git a/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line-expected.html b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line-expected.html new file mode 100644 index 000000000000..fe37e78462e6 --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line-expected.html @@ -0,0 +1,9 @@ + +
PASS
HIDDEN
diff --git a/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line.html b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line.html new file mode 100644 index 000000000000..deebeb5d957e --- /dev/null +++ b/LayoutTests/fast/overflow/line-clamp-with-inline-flex-on-clamped-line.html @@ -0,0 +1,13 @@ + +
PASS
HIDDEN
HIDDEN
diff --git a/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition-expected.txt b/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition-expected.txt new file mode 100644 index 000000000000..3270499b3bc6 --- /dev/null +++ b/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition-expected.txt @@ -0,0 +1,29 @@ +PASS successfullyParsed is true + +TEST COMPLETE +(repaint rects + (rect 78 70 300 300) +) +(GraphicsLayer + (anchor 0.00 0.00) + (bounds 800.00 600.00) + (children 1 + (GraphicsLayer + (bounds 800.00 600.00) + (contentsOpaque 1) + (children 1 + (GraphicsLayer + (position 58.00 50.00) + (bounds 340.00 340.00) + (drawsContent 1) + (repaint rects + (rect 20.00 20.00 300.00 300.00) + (rect 20.00 20.00 150.00 150.00) + (rect 20.00 20.00 150.00 150.00) + ) + ) + ) + ) + ) +) + diff --git a/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition.html b/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition.html new file mode 100644 index 000000000000..ba3c5f5f606c --- /dev/null +++ b/LayoutTests/fast/repaint/repaint-on-layer-creation-from-transition.html @@ -0,0 +1,60 @@ + + + + + + + + + +
+
+
+
+

+
+
diff --git a/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl-expected.txt b/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl-expected.txt
new file mode 100644
index 000000000000..0d707ef70d2e
--- /dev/null
+++ b/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl-expected.txt
@@ -0,0 +1,11 @@
+Verifies that a drag on the left side of the viewport, where a position:fixed overlay sits in a vertical-rl page, scrolls the overlay's contents and not the main page.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS overlayScrolled is true
+PASS documentScrolled is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl.html b/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl.html
new file mode 100644
index 000000000000..98b743f4b3cb
--- /dev/null
+++ b/LayoutTests/fast/scrolling/ios/scroll-in-fixed-overlay-in-vertical-rl.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+ + diff --git a/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-expected.txt b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-expected.txt new file mode 100644 index 000000000000..8fbe9ee1687d --- /dev/null +++ b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-expected.txt @@ -0,0 +1,3 @@ + +PASS Main frame with overscroll-behavior: contain and a non-passive wheel listener should scroll + diff --git a/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe-expected.txt b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe-expected.txt new file mode 100644 index 000000000000..bbb717642c14 --- /dev/null +++ b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe-expected.txt @@ -0,0 +1,4 @@ + + +PASS Subframe with overscroll-behavior: contain and a non-passive wheel listener should scroll without propagating to the main frame + diff --git a/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe.html b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe.html new file mode 100644 index 000000000000..ea0229dd487a --- /dev/null +++ b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener-iframe.html @@ -0,0 +1,41 @@ + + + + + + + + + diff --git a/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener.html b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener.html new file mode 100644 index 000000000000..138e5d132afc --- /dev/null +++ b/LayoutTests/fast/scrolling/mac/overscroll-behavior-with-wheel-listener.html @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit-expected.txt b/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit-expected.txt new file mode 100644 index 000000000000..3ff44194cff7 --- /dev/null +++ b/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit-expected.txt @@ -0,0 +1,11 @@ +Test that when the first scrolling tree commit for an overflow scroller contains a delta, the UI process ends up with the correct scroll position + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scroller.scrollTop is 4600 +PASS uiScrollY is 4600 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit.html b/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit.html new file mode 100644 index 000000000000..38fd65b94bbe --- /dev/null +++ b/LayoutTests/fast/scrolling/scroll-anchoring/scroll-anchoring-on-first-async-commit.html @@ -0,0 +1,86 @@ + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/LayoutTests/fast/selectors/has-complexity-traversal-count-expected.txt b/LayoutTests/fast/selectors/has-complexity-traversal-count-expected.txt new file mode 100644 index 000000000000..2898a157d4ab --- /dev/null +++ b/LayoutTests/fast/selectors/has-complexity-traversal-count-expected.txt @@ -0,0 +1,4 @@ + +PASS :has() child-change invalidation produces correct styles +PASS :has() child-change invalidation is not O(n^2) + diff --git a/LayoutTests/fast/selectors/has-complexity-traversal-count.html b/LayoutTests/fast/selectors/has-complexity-traversal-count.html new file mode 100644 index 000000000000..dddc3ec4d699 --- /dev/null +++ b/LayoutTests/fast/selectors/has-complexity-traversal-count.html @@ -0,0 +1,104 @@ + + +:has() style invalidation should not be O(n^2) + + + + + + + + diff --git a/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash-expected.txt b/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash-expected.txt new file mode 100644 index 000000000000..c38a98bd3d09 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash-expected.txt @@ -0,0 +1,4 @@ +This tests inserting a bunch of nodes with slot attributes under shadow host. +WebKit should not crash or hit assertions under ASAN, and you should see PASS below: + +PASS diff --git a/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash.html b/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash.html new file mode 100644 index 000000000000..01744279d596 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/named-slot-assignment-resolve-after-mutation-crash.html @@ -0,0 +1,42 @@ + + +

This tests inserting a bunch of nodes with slot attributes under shadow host.
+WebKit should not crash or hit assertions under ASAN, and you should see PASS below:

+ diff --git a/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation-expected.txt b/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation-expected.txt new file mode 100644 index 000000000000..8b71268ae868 --- /dev/null +++ b/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation-expected.txt @@ -0,0 +1,13 @@ +Tests that speech synthesis is cancelled when the page enters the back-forward cache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS speechSynthesis.speaking is true +PASS Page was restored from the page cache +PASS speechSynthesis.speaking is false +PASS speechSynthesis.pending is false +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation.html b/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation.html new file mode 100644 index 000000000000..5dda854bc60d --- /dev/null +++ b/LayoutTests/fast/speechsynthesis/speech-synthesis-cancel-on-navigation.html @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/LayoutTests/fast/text-extraction/debug-text-extraction-basic-expected.txt b/LayoutTests/fast/text-extraction/debug-text-extraction-basic-expected.txt index 6032f1104d1e..cdf76bf003be 100644 --- a/LayoutTests/fast/text-extraction/debug-text-extraction-basic-expected.txt +++ b/LayoutTests/fast/text-extraction/debug-text-extraction-basic-expected.txt @@ -11,6 +11,7 @@ root 'This button does nothing' […] input uid=… […] placeholder='Enter text here' uid=… role=button 'Clickable Div' […] + uid=… 'Clickable Div 2' […] section label='ARIA Labeling Examples' 'Name Field' […] 'Description' […] diff --git a/LayoutTests/fast/text-extraction/debug-text-extraction-basic.html b/LayoutTests/fast/text-extraction/debug-text-extraction-basic.html index 7334ad67b307..04752183352f 100644 --- a/LayoutTests/fast/text-extraction/debug-text-extraction-basic.html +++ b/LayoutTests/fast/text-extraction/debug-text-extraction-basic.html @@ -40,6 +40,18 @@ #error-text { display: none; } + +.clickable { + cursor: pointer; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + border-radius: 6px; + max-width: 120px; + text-align: center; +} + +.clickable:hover { + opacity: 0.8; +} @@ -59,6 +71,7 @@

Welcome to Test Page

Clickable Div
+
Clickable Div 2
Name Field
diff --git a/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element-expected.txt b/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element-expected.txt index bb967a7d957e..220887b29db5 100644 --- a/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element-expected.txt +++ b/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element-expected.txt @@ -1,13 +1,15 @@ PASS scrollTopBeforeClick is 0 PASS clickButtonError is "" PASS buttonClicked is true -PASS scrollTopAfterButtonClick is 0 +PASS scrollTopAfterButtonClick > 0 is true +PASS buttonInViewportAfterClick is true PASS clickInputError is "" -PASS scrollTopAfterInputClick is 0 +PASS scrollTopAfterInputClick > 0 is true +PASS inputInViewportAfterClick is true PASS activeElementAfterInputClick is offscreenInput PASS successfullyParsed is true TEST COMPLETE -This test verifies that clicking an offscreen element via text extraction focuses it without requiring scrolling. +This test verifies that clicking an offscreen element via text extraction scrolls it into view and dispatches the click. Click Me diff --git a/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element.html b/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element.html index d66908dad30d..e04ca3279deb 100644 --- a/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element.html +++ b/LayoutTests/fast/text-extraction/debug-text-extraction-click-offscreen-element.html @@ -17,13 +17,18 @@ -

This test verifies that clicking an offscreen element via text extraction focuses it without requiring scrolling.

+

This test verifies that clicking an offscreen element via text extraction scrolls it into view and dispatches the click.

+ + +

This tests that FontFaceSet.load does not crash when resolving the loaded +promise triggers a thenable check whose getter removes a font-face rule.
+WebKit should not crash or hit any assertions under ASAN.

+ + + diff --git a/LayoutTests/fast/text/unicode-range-download-expected.txt b/LayoutTests/fast/text/unicode-range-download-expected.txt index cff857b0db08..80dd5b1236ea 100644 --- a/LayoutTests/fast/text/unicode-range-download-expected.txt +++ b/LayoutTests/fast/text/unicode-range-download-expected.txt @@ -1,6 +1,8 @@ +This test makes sure that fonts with unicode-ranges which are never applicable are not downloaded. Note that, currently, we always download the first font, regardless of unicode-range. We use this font's metrics for things like baseline location. This test passes iff 2 or fewer fonts are downloaded. +A +unicode-range-download.html - willSendRequest redirectResponse (null) +unicode-range-download.html - didReceiveResponse unicode-range-download.html - didFinishLoading Ahem.otf - willSendRequest redirectResponse (null) Ahem.otf - didReceiveResponse Ahem.otf - didFinishLoading -This test makes sure that fonts with unicode-ranges which are never applicable are not downloaded. Note that, currently, we always download the first font, regardless of unicode-range. We use this font's metrics for things like baseline location. This test passes iff 2 or fewer fonts are downloaded. -A diff --git a/LayoutTests/fast/text/unicode-range-download.html b/LayoutTests/fast/text/unicode-range-download.html index baa1131da88b..f53031df1954 100644 --- a/LayoutTests/fast/text/unicode-range-download.html +++ b/LayoutTests/fast/text/unicode-range-download.html @@ -1,9 +1,9 @@ + - \ No newline at end of file + diff --git a/LayoutTests/fast/webgpu/primitive-index-expected.txt b/LayoutTests/fast/webgpu/primitive-index-expected.txt new file mode 100644 index 000000000000..934f63e74548 --- /dev/null +++ b/LayoutTests/fast/webgpu/primitive-index-expected.txt @@ -0,0 +1,15 @@ +Tests the primitive_index builtin from the WGSL primitive_index extension. Renders 4 non-overlapping triangles in a single draw call and uses @builtin(primitive_index) in the fragment shader to write each primitive's index into a storage buffer indexed by pixel position. Verifies the index seen by the fragment shader matches the draw order. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Adapter advertises 'primitive-index' feature +Per-pixel primitive_index+1: 1,2,3,4 +PASS primitiveIndexBuf[0] is 1 +PASS primitiveIndexBuf[1] is 2 +PASS primitiveIndexBuf[2] is 3 +PASS primitiveIndexBuf[3] is 4 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/webgpu/primitive-index.html b/LayoutTests/fast/webgpu/primitive-index.html new file mode 100644 index 000000000000..83a113094294 --- /dev/null +++ b/LayoutTests/fast/webgpu/primitive-index.html @@ -0,0 +1,175 @@ + + + diff --git a/LayoutTests/fast/webgpu/regression/repro_303203-expected.txt b/LayoutTests/fast/webgpu/regression/repro_303203-expected.txt new file mode 100644 index 000000000000..2d1ac9faea75 --- /dev/null +++ b/LayoutTests/fast/webgpu/regression/repro_303203-expected.txt @@ -0,0 +1,6 @@ +CONSOLE MESSAGE: PASS +layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +layer at (0,0) size 800x600 + RenderBlock {HTML} at (0,0) size 800x600 + RenderBody {BODY} at (8,8) size 784x584 diff --git a/LayoutTests/fast/webgpu/regression/repro_303203.html b/LayoutTests/fast/webgpu/regression/repro_303203.html new file mode 100644 index 000000000000..a791af4b31e6 --- /dev/null +++ b/LayoutTests/fast/webgpu/regression/repro_303203.html @@ -0,0 +1,55 @@ + diff --git a/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents-expected.txt b/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents-expected.txt new file mode 100644 index 000000000000..7ef22e9a431a --- /dev/null +++ b/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents-expected.txt @@ -0,0 +1 @@ +PASS diff --git a/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents.html b/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents.html new file mode 100644 index 000000000000..7b7caa29939f --- /dev/null +++ b/LayoutTests/fast/webgpu/regression/stencil-read-only-attachment-loads-contents.html @@ -0,0 +1,165 @@ + + + + diff --git a/LayoutTests/fetch/request-clone-without-target-address-space-crash-expected.txt b/LayoutTests/fetch/request-clone-without-target-address-space-crash-expected.txt new file mode 100644 index 000000000000..95c858655198 --- /dev/null +++ b/LayoutTests/fetch/request-clone-without-target-address-space-crash-expected.txt @@ -0,0 +1,3 @@ + +PASS Cloning a Request without targetAddressSpace in init must not crash + diff --git a/LayoutTests/fetch/request-clone-without-target-address-space-crash.html b/LayoutTests/fetch/request-clone-without-target-address-space-crash.html new file mode 100644 index 000000000000..1ff1b2389ffa --- /dev/null +++ b/LayoutTests/fetch/request-clone-without-target-address-space-crash.html @@ -0,0 +1,28 @@ + + + +Cloning a Request without targetAddressSpace in init must not crash + + + + + + + diff --git a/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay-expected.txt b/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay-expected.txt deleted file mode 100644 index 03ee231b4aa0..000000000000 --- a/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay-expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Tests that entering fullscreen dispatches boundary events so that JS-driven hover state on a full-coverage overlay is properly cleared. - -Fullscreen content - -Enter Fullscreen -EXPECTED (fsBtn.style.backgroundColor == 'rgba(0, 0, 255, 0.2)') OK -EVENT(webkitfullscreenchange) -EXPECTED (document.fullscreenElement == '[object HTMLDivElement]') OK -EXPECTED (overlayReceivedLeave == 'true') OK -EXPECTED (fsBtn.style.backgroundColor == '') OK -END OF TEST - diff --git a/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay.html b/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay.html deleted file mode 100644 index 2e62598df7fb..000000000000 --- a/LayoutTests/fullscreen/fullscreen-clears-hover-on-overlay.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - -

Tests that entering fullscreen dispatches boundary events so that -JS-driven hover state on a full-coverage overlay is properly cleared.

-
-
-

Fullscreen content

- -
-
- - - diff --git a/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs-expected.txt b/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs-expected.txt index 27c670ddd4ee..7843b4246047 100644 --- a/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs-expected.txt +++ b/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs-expected.txt @@ -1,7 +1,7 @@ + +http://127.0.0.1:8000/cache/cancel-multiple-post-xhrs.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/cache/cancel-multiple-post-xhrs.html - didReceiveResponse +http://127.0.0.1:8000/cache/cancel-multiple-post-xhrs.html - didFinishLoading http://127.0.0.1:8000/cache/resources/empty.txt - willSendRequest redirectResponse (null) http://127.0.0.1:8000/cache/resources/empty.txt - willSendRequest redirectResponse (null) http://127.0.0.1:8000/cache/resources/empty.txt - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/cache/resources/empty.txt - didFailLoadingWithError: -http://127.0.0.1:8000/cache/resources/empty.txt - didFailLoadingWithError: -http://127.0.0.1:8000/cache/resources/empty.txt - didFailLoadingWithError: - diff --git a/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs.html b/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs.html index f14b2d4d297b..875ce316215a 100644 --- a/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs.html +++ b/LayoutTests/http/tests/cache/cancel-multiple-post-xhrs.html @@ -1,8 +1,8 @@ + + + + + diff --git a/LayoutTests/http/tests/contentextensions/block-embed-element.json b/LayoutTests/http/tests/contentextensions/block-embed-element.json new file mode 100644 index 000000000000..2ef38329097d --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/block-embed-element.json @@ -0,0 +1,10 @@ +[ + { + "action": { + "type": "block" + }, + "trigger": { + "url-filter": ".*should-be-blocked" + } + } +] diff --git a/LayoutTests/http/tests/contentextensions/block-object-element-expected.txt b/LayoutTests/http/tests/contentextensions/block-object-element-expected.txt new file mode 100644 index 000000000000..0fd6a10f956a --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/block-object-element-expected.txt @@ -0,0 +1,3 @@ +CONSOLE MESSAGE: Content blocker prevented frame displaying http://127.0.0.1:8000/contentextensions/block-object-element.html from loading a resource from http://127.0.0.1:8000/contentextensions/resources/should-load.html?should-be-blocked +CONSOLE MESSAGE: Content blocker prevented frame displaying http://127.0.0.1:8000/contentextensions/block-object-element.html from loading a resource from http://127.0.0.1:8000/media/resources/test.pdf?should-be-blocked + diff --git a/LayoutTests/http/tests/contentextensions/block-object-element.html b/LayoutTests/http/tests/contentextensions/block-object-element.html new file mode 100644 index 000000000000..bb2ce1de8504 --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/block-object-element.html @@ -0,0 +1,5 @@ + + + + + diff --git a/LayoutTests/http/tests/contentextensions/block-object-element.json b/LayoutTests/http/tests/contentextensions/block-object-element.json new file mode 100644 index 000000000000..2ef38329097d --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/block-object-element.json @@ -0,0 +1,10 @@ +[ + { + "action": { + "type": "block" + }, + "trigger": { + "url-filter": ".*should-be-blocked" + } + } +] diff --git a/LayoutTests/http/tests/contentextensions/main-resource-expected.txt b/LayoutTests/http/tests/contentextensions/main-resource-expected.txt index 6fb9a847c10a..892831eeba47 100644 --- a/LayoutTests/http/tests/contentextensions/main-resource-expected.txt +++ b/LayoutTests/http/tests/contentextensions/main-resource-expected.txt @@ -1,9 +1,11 @@ main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/contentextensions/main-resource.html - didFinishLoading main frame - didStartProvisionalLoadForFrame CONSOLE MESSAGE: Content blocker prevented frame displaying http://127.0.0.1:8000/contentextensions/resources/should-not-load.html from loading a resource from http://127.0.0.1:8000/contentextensions/resources/should-not-load.html main frame - didFailProvisionalLoadWithError main frame - (kWKErrorCodeFrameLoadBlockedByContentBlocker) +http://127.0.0.1:8000/contentextensions/main-resource.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/contentextensions/main-resource.html - didReceiveResponse +http://127.0.0.1:8000/contentextensions/main-resource.html - didFinishLoading diff --git a/LayoutTests/http/tests/contentextensions/main-resource-redirect-error-expected.txt b/LayoutTests/http/tests/contentextensions/main-resource-redirect-error-expected.txt index 5895408d273d..718374a6df1c 100644 --- a/LayoutTests/http/tests/contentextensions/main-resource-redirect-error-expected.txt +++ b/LayoutTests/http/tests/contentextensions/main-resource-redirect-error-expected.txt @@ -1,10 +1,12 @@ main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/contentextensions/main-resource-redirect-error.html - didFinishLoading main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/resources/redirect.py?url=should-not-load.html - willSendRequest redirectResponse (null) CONSOLE MESSAGE: Content blocker prevented frame displaying http://127.0.0.1:8000/resources/should-not-load.html from loading a resource from http://127.0.0.1:8000/resources/should-not-load.html main frame - didFailProvisionalLoadWithError main frame - (kWKErrorCodeFrameLoadBlockedByContentBlocker) +http://127.0.0.1:8000/contentextensions/main-resource-redirect-error.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/contentextensions/main-resource-redirect-error.html - didReceiveResponse +http://127.0.0.1:8000/contentextensions/main-resource-redirect-error.html - didFinishLoading +http://127.0.0.1:8000/resources/redirect.py?url=should-not-load.html - willSendRequest redirectResponse (null) diff --git a/LayoutTests/http/tests/contentextensions/main-resource-redirect-error.html b/LayoutTests/http/tests/contentextensions/main-resource-redirect-error.html index a049d19b911e..6edb6caf7911 100644 --- a/LayoutTests/http/tests/contentextensions/main-resource-redirect-error.html +++ b/LayoutTests/http/tests/contentextensions/main-resource-redirect-error.html @@ -1,7 +1,7 @@ + diff --git a/LayoutTests/http/tests/iframe-monitor/cached-resource.html b/LayoutTests/http/tests/iframe-monitor/cached-resource.html index 736867bec103..5a6ec7466eca 100644 --- a/LayoutTests/http/tests/iframe-monitor/cached-resource.html +++ b/LayoutTests/http/tests/iframe-monitor/cached-resource.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/compressed-resource.html b/LayoutTests/http/tests/iframe-monitor/compressed-resource.html index 878a5d18f6ae..94b8ae0f6a73 100644 --- a/LayoutTests/http/tests/iframe-monitor/compressed-resource.html +++ b/LayoutTests/http/tests/iframe-monitor/compressed-resource.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/dark-mode.html b/LayoutTests/http/tests/iframe-monitor/dark-mode.html index cac98d3e36df..7421f6f8f6b1 100644 --- a/LayoutTests/http/tests/iframe-monitor/dark-mode.html +++ b/LayoutTests/http/tests/iframe-monitor/dark-mode.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/data-url-resource.html b/LayoutTests/http/tests/iframe-monitor/data-url-resource.html index a083afb4e220..cb963dd3e1d4 100644 --- a/LayoutTests/http/tests/iframe-monitor/data-url-resource.html +++ b/LayoutTests/http/tests/iframe-monitor/data-url-resource.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/eligibility.html b/LayoutTests/http/tests/iframe-monitor/eligibility.html index 5303768a188f..90e7faf5056d 100644 --- a/LayoutTests/http/tests/iframe-monitor/eligibility.html +++ b/LayoutTests/http/tests/iframe-monitor/eligibility.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/iframe-unload.html b/LayoutTests/http/tests/iframe-monitor/iframe-unload.html index b023398aa2c5..fc3b378addff 100644 --- a/LayoutTests/http/tests/iframe-monitor/iframe-unload.html +++ b/LayoutTests/http/tests/iframe-monitor/iframe-unload.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/just-use-eligible-subresource.html b/LayoutTests/http/tests/iframe-monitor/just-use-eligible-subresource.html index 0fc79430f861..556f92126edf 100644 --- a/LayoutTests/http/tests/iframe-monitor/just-use-eligible-subresource.html +++ b/LayoutTests/http/tests/iframe-monitor/just-use-eligible-subresource.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/resources/monitor-setup.js b/LayoutTests/http/tests/iframe-monitor/resources/monitor-setup.js index 6db7daa7e9df..b7f026a1518f 100644 --- a/LayoutTests/http/tests/iframe-monitor/resources/monitor-setup.js +++ b/LayoutTests/http/tests/iframe-monitor/resources/monitor-setup.js @@ -6,12 +6,6 @@ async function setup() { await testRunner.setResourceMonitorList(JSON.stringify(rules)); - // Lower the threshold to 10k - internals.setResourceMonitorNetworkUsageThreshold(10 * 1024, 0.001); - - // Skip throttling of unloading or not. - internals.shouldSkipResourceMonitorThrottling = false; - return true; } else { console.error('ResourceMonitor is not available or cannot modify rules.'); diff --git a/LayoutTests/http/tests/iframe-monitor/throttler.html b/LayoutTests/http/tests/iframe-monitor/throttler.html index 9c0af0ba1110..3db24d781480 100644 --- a/LayoutTests/http/tests/iframe-monitor/throttler.html +++ b/LayoutTests/http/tests/iframe-monitor/throttler.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/workers/service-worker-not-count-twice.html b/LayoutTests/http/tests/iframe-monitor/workers/service-worker-not-count-twice.html index 65cda143f08a..b094ad3d27dc 100644 --- a/LayoutTests/http/tests/iframe-monitor/workers/service-worker-not-count-twice.html +++ b/LayoutTests/http/tests/iframe-monitor/workers/service-worker-not-count-twice.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/workers/service-worker.html b/LayoutTests/http/tests/iframe-monitor/workers/service-worker.html index 297671a1ea04..5e2441e74b47 100644 --- a/LayoutTests/http/tests/iframe-monitor/workers/service-worker.html +++ b/LayoutTests/http/tests/iframe-monitor/workers/service-worker.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/iframe-monitor/workers/shared-worker.html b/LayoutTests/http/tests/iframe-monitor/workers/shared-worker.html index 9b01cdf3499e..4c255701caef 100644 --- a/LayoutTests/http/tests/iframe-monitor/workers/shared-worker.html +++ b/LayoutTests/http/tests/iframe-monitor/workers/shared-worker.html @@ -1,4 +1,4 @@ - + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation-expected.txt new file mode 100644 index 000000000000..1b07ac8f281a --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation-expected.txt @@ -0,0 +1,13 @@ +Tests getResponseBody behavior for a cross-origin iframe resource after the iframe navigates to a new URL. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe.AfterNavigation +-- Running test case: Network.getResponseBody.CrossOriginIframe.AfterNavigation +First load: http://localhost:8000/inspector/network/resources/echo.py?mimetype=text/plain&content=before-navigation +PASS: First load: Should retrieve content successfully. +PASS: First load: Content should match. +Navigating iframe... +Iframe navigated. Requesting content of first resource again... +After navigation requestContent returned. +Content available: true + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation.html new file mode 100644 index 000000000000..e645b9f7f9f4 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-after-navigation.html @@ -0,0 +1,76 @@ + + + + + + + + +

Tests getResponseBody behavior for a cross-origin iframe resource after the iframe navigates to a new URL.

+ + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary-expected.txt new file mode 100644 index 000000000000..b5b21d2779c9 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary-expected.txt @@ -0,0 +1,13 @@ +Tests that Network.getResponseBody returns base64-encoded content for a binary resource in a cross-origin iframe. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe.Binary +-- Running test case: Network.getResponseBody.CrossOriginIframe.Binary.PNG +Child frame added: http://localhost:8000/inspector/network/resources/echo.py?mimetype=text/html&content=%3Cimg%20src%3D%22%2Finspector%2Fnetwork%2Fresources%2Fwhite.png%22%3E +Resource added: http://localhost:8000/inspector/network/resources/white.png +PASS: Resource should be the PNG image. +PASS: MIME type should be image/png. +PASS: Should not have an error retrieving content. +PASS: Content should be base64 encoded. +PASS: Image content should be a Blob. + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary.html new file mode 100644 index 000000000000..2ccff0b538d7 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-binary.html @@ -0,0 +1,62 @@ + + + + + + + + +

Tests that Network.getResponseBody returns base64-encoded content for a binary resource in a cross-origin iframe.

+ + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document-expected.txt new file mode 100644 index 000000000000..282dfdb8f759 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document-expected.txt @@ -0,0 +1,13 @@ +Tests that Network.getResponseBody returns HTML document content from a cross-origin iframe's main resource. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe.Document +-- Running test case: Network.getResponseBody.CrossOriginIframe.Document.HTML +Child frame added: http://localhost:8000/inspector/network/resources/data.html +PASS: Child frame should be cross-origin. +PASS: Child frame should have a main resource. +PASS: Main resource should be Document type. +PASS: Should not have an error retrieving content. +PASS: Content should not be base64 encoded. +PASS: Content should contain the expected HTML. + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document.html new file mode 100644 index 000000000000..7ec418719a72 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-document.html @@ -0,0 +1,56 @@ + + + + + + + + +

Tests that Network.getResponseBody returns HTML document content from a cross-origin iframe's main resource.

+ + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases-expected.txt new file mode 100644 index 000000000000..77fb7f8a4228 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases-expected.txt @@ -0,0 +1,14 @@ +Tests error handling for Network.getResponseBody with invalid or nonexistent requestIds. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe.ErrorCases +-- Running test case: Network.getResponseBody.CrossOriginIframe.ErrorCases.InvalidRequestId +PASS: Should throw for invalid requestId. + +-- Running test case: Network.getResponseBody.CrossOriginIframe.ErrorCases.NonexistentResource +PASS: Should throw for nonexistent resource. + +-- Running test case: Network.getResponseBody.CrossOriginIframe.ErrorCases.ValidResourceSucceeds +PASS: Valid resource should not have an error. +PASS: Content should match expected value. + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases.html new file mode 100644 index 000000000000..5e69c93b74f7 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-error-cases.html @@ -0,0 +1,77 @@ + + + + + + + + +

Tests error handling for Network.getResponseBody with invalid or nonexistent requestIds.

+ + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-expected.txt new file mode 100644 index 000000000000..c594aed5cb3d --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-expected.txt @@ -0,0 +1,12 @@ +Tests that Network.getResponseBody works for resources loaded in a cross-origin iframe. Under Site Isolation, this exercises the BackendResourceDataStore and reverse IPC path through ProxyingNetworkAgent. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe +-- Running test case: Network.getResponseBody.CrossOriginIframe.TextContent +Child frame added: http://localhost:8000/inspector/network/resources/echo.py?mimetype=text/plain&content=cross-origin-response-body-test +PASS: Child frame should be cross-origin (localhost). +PASS: Child frame should have a main resource. +PASS: Should not have an error retrieving content. +PASS: Content should not be base64 encoded. +PASS: Content should match expected response body. + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources-expected.txt b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources-expected.txt new file mode 100644 index 000000000000..90743a911c9a --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources-expected.txt @@ -0,0 +1,17 @@ +Tests that Network.getResponseBody works for CSS and JS subresources loaded within a cross-origin iframe. + + +== Running test suite: Network.getResponseBody.CrossOriginIframe.Subresources +-- Running test case: Network.getResponseBody.CrossOriginIframe.Subresources +Child frame added: http://localhost:8000/inspector/network/resources/cross-origin-iframe-with-subresources.html +Subresource added: http://localhost:8000/inspector/network/resources/stylesheet.css +Subresource added: http://localhost:8000/inspector/network/resources/script.js +Checking css subresource... +PASS: css: Should not have an error retrieving content. +PASS: css: Content should not be base64 encoded. +PASS: css: Content should not be empty. +Checking js subresource... +PASS: js: Should not have an error retrieving content. +PASS: js: Content should not be base64 encoded. +PASS: js: Content should not be empty. + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources.html new file mode 100644 index 000000000000..42715ee311b9 --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body-subresources.html @@ -0,0 +1,79 @@ + + + + + + + + +

Tests that Network.getResponseBody works for CSS and JS subresources loaded within a cross-origin iframe.

+ + diff --git a/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body.html b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body.html new file mode 100644 index 000000000000..c3e3411498da --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/cross-origin-iframe-get-response-body.html @@ -0,0 +1,58 @@ + + + + + + + + +

Tests that Network.getResponseBody works for resources loaded in a cross-origin iframe. Under Site Isolation, this exercises the BackendResourceDataStore and reverse IPC path through ProxyingNetworkAgent.

+ + diff --git a/LayoutTests/http/tests/inspector/network/resources/cross-origin-iframe-with-subresources.html b/LayoutTests/http/tests/inspector/network/resources/cross-origin-iframe-with-subresources.html new file mode 100644 index 000000000000..f0e66d80debc --- /dev/null +++ b/LayoutTests/http/tests/inspector/network/resources/cross-origin-iframe-with-subresources.html @@ -0,0 +1,10 @@ + + + + + + + +

Cross-origin iframe that loads subresources.

+ + diff --git a/LayoutTests/http/tests/intersection-observer/resources/root-margin-with-zoom-subframe.html b/LayoutTests/http/tests/intersection-observer/resources/root-margin-with-zoom-subframe.html new file mode 100644 index 000000000000..0a109a99120d --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/resources/root-margin-with-zoom-subframe.html @@ -0,0 +1,33 @@ + + + + +
+ + diff --git a/LayoutTests/http/tests/intersection-observer/resources/zoomed-page-subframe.html b/LayoutTests/http/tests/intersection-observer/resources/zoomed-page-subframe.html new file mode 100644 index 000000000000..a8aa6e9bb190 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/resources/zoomed-page-subframe.html @@ -0,0 +1,37 @@ + + + + +
+ + diff --git a/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin-expected.txt b/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin-expected.txt new file mode 100644 index 000000000000..bd3d52c68116 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin-expected.txt @@ -0,0 +1,4 @@ + + +PASS Intersection Observer: root margin is applied when observer is in a same-origin iframe, and page is zoomed + diff --git a/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin.html b/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin.html new file mode 100644 index 000000000000..2bd3c2a383f0 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/root-margin-with-zoom-iframe-same-origin.html @@ -0,0 +1,47 @@ + + +Intersection Observer: root margin is applied when observer is in a same-origin iframe, and page is zoomed + + + + + + + + + + diff --git a/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin-expected.txt b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin-expected.txt new file mode 100644 index 000000000000..c9ddba0964ed --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin-expected.txt @@ -0,0 +1,4 @@ + + +PASS Intersection Observer in a cross-origin iframe works when the page is zoomed + diff --git a/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin.html b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin.html new file mode 100644 index 000000000000..7b9fdfe97ad7 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-cross-origin.html @@ -0,0 +1,68 @@ + + +Tests that intersection observer works in a cross-origin iframe when the page is zoomed + + + + + + + + +
+ + diff --git a/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin-expected.txt b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin-expected.txt new file mode 100644 index 000000000000..8a648efa7657 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin-expected.txt @@ -0,0 +1,4 @@ + + +PASS Intersection Observer in a same-origin iframe works when the page is zoomed + diff --git a/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin.html b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin.html new file mode 100644 index 000000000000..31dfe93873f3 --- /dev/null +++ b/LayoutTests/http/tests/intersection-observer/zoomed-page-iframe-same-origin.html @@ -0,0 +1,68 @@ + + +Tests that intersection observer works in a same-origin iframe when the page is zoomed + + + + + + + + +
+ + diff --git a/LayoutTests/http/tests/loading/307-after-303-after-post-expected.txt b/LayoutTests/http/tests/loading/307-after-303-after-post-expected.txt index 763abd9aeaab..261e6e51bb55 100644 --- a/LayoutTests/http/tests/loading/307-after-303-after-post-expected.txt +++ b/LayoutTests/http/tests/loading/307-after-303-after-post-expected.txt @@ -2,18 +2,20 @@ main frame - didFinishDocumentLoadForFrame main frame - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/post-to-303-target.py main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/loading/307-after-303-after-post.html - didFinishLoading main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/post-to-303-target.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/post-to-303-target.py - willSendRequest redirectResponse main frame - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/post-to-303-target.py - willSendRequest redirectResponse main frame - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/post-to-303-target.py - didReceiveResponse main frame - didCancelClientRedirectForFrame main frame - didCommitLoadForFrame main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/post-to-303-target.py - didFinishLoading There were no POSTed form values. +http://127.0.0.1:8000/loading/307-after-303-after-post.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/307-after-303-after-post.html - didReceiveResponse +http://127.0.0.1:8000/loading/307-after-303-after-post.html - didFinishLoading +http://127.0.0.1:8000/loading/resources/post-to-303-target.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/303-to-307-target.py - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/307-post-output-target.py - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/post-to-303-target.py - didReceiveResponse +http://127.0.0.1:8000/loading/resources/post-to-303-target.py - didFinishLoading diff --git a/LayoutTests/http/tests/loading/307-after-303-after-post.html b/LayoutTests/http/tests/loading/307-after-303-after-post.html index 439b2f81bb9e..d8a88088dee0 100644 --- a/LayoutTests/http/tests/loading/307-after-303-after-post.html +++ b/LayoutTests/http/tests/loading/307-after-303-after-post.html @@ -1,3 +1,4 @@ + diff --git a/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials-expected.txt b/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials-expected.txt index 2b948c4d8b9f..4b3d83658911 100644 --- a/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials-expected.txt +++ b/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials-expected.txt @@ -1,20 +1,4 @@ -frame "" - didStartProvisionalLoadForFrame -main frame - didFinishDocumentLoadForFrame -frame "" - didReceiveServerRedirectForProvisionalLoadForFrame -http://localhost:8000/loading/authentication-after-redirect-stores-wrong-credentials/resources/wrong-credential-1-redirect-to-auth.py - didReceiveAuthenticationChallenge - Responding with httpUsername:httpPassword -frame "" - didCommitLoadForFrame -frame "" - didFinishDocumentLoadForFrame -frame "" - didHandleOnloadEventsForFrame -main frame - didHandleOnloadEventsForFrame -frame "" - didFinishLoadForFrame -main frame - didFinishLoadForFrame -frame "" - willPerformClientRedirectToURL: http://localhost:8000/loading/authentication-after-redirect-stores-wrong-credentials/resources/wrong-credential-3-output-credentials-then-finish.py -frame "" - didStartProvisionalLoadForFrame -frame "" - didCancelClientRedirectForFrame -frame "" - didCommitLoadForFrame -frame "" - didFinishDocumentLoadForFrame -frame "" - didHandleOnloadEventsForFrame -frame "" - didFinishLoadForFrame +127.0.0.1:8000 - didReceiveAuthenticationChallenge - ProtectionSpaceAuthenticationSchemeHTTPBasic - Responding with httpUsername:httpPassword This test causes an HTTP authentication challenge in the middle of a redirect chain. It then loads a new page after that challenge, and the new page should *not* get any credentials passed to it. See bug 78003 for more details. diff --git a/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials.html b/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials.html index 7b708f076e7b..19931cc2b03a 100644 --- a/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials.html +++ b/LayoutTests/http/tests/loading/authentication-after-redirect-stores-wrong-credentials/authentication-after-redirect-stores-wrong-credentials.html @@ -3,7 +3,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpFrameLoadCallbacks(); testRunner.waitUntilDone(); testRunner.setHandlesAuthenticationChallenges(true); testRunner.setAuthenticationUsername("httpUsername"); diff --git a/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation-expected.txt b/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation-expected.txt index abc23a4e7d32..ba2235c1da69 100644 --- a/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation-expected.txt +++ b/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation-expected.txt @@ -1,37 +1,30 @@ main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didFinishLoading main frame - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/page-go-back-onload.html main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didReceiveResponse main frame - didCancelClientRedirectForFrame main frame - didCommitLoadForFrame main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didFinishLoading main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didReceiveResponse main frame - didCommitLoadForFrame -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didFinishLoading main frame - didFinishLoadForFrame main frame - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/page-go-back-onload.html main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didReceiveResponse main frame - didCancelClientRedirectForFrame main frame - didCommitLoadForFrame -http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didFinishLoading main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame main frame - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didReceiveResponse main frame - didCommitLoadForFrame -http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didFinishLoading main frame - didFinishLoadForFrame Test that main resource load delegates are the same when page cache is enabled and disabled +http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didReceiveResponse +http://127.0.0.1:8000/loading/main-resource-delegates-on-back-navigation.html - didFinishLoading +http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didReceiveResponse +http://127.0.0.1:8000/loading/resources/page-go-back-onload.html - didFinishLoading diff --git a/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation.html b/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation.html index 3a8c20eff8da..30c89aeb091a 100644 --- a/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation.html +++ b/LayoutTests/http/tests/loading/main-resource-delegates-on-back-navigation.html @@ -1,4 +1,4 @@ - + @@ -7,7 +7,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpFrameLoadCallbacks(); - testRunner.dumpResourceLoadCallbacks(); testRunner.waitUntilDone(); } diff --git a/LayoutTests/http/tests/loading/redirect-methods-expected.txt b/LayoutTests/http/tests/loading/redirect-methods-expected.txt index d8f476c8fb8a..a61624688326 100644 --- a/LayoutTests/http/tests/loading/redirect-methods-expected.txt +++ b/LayoutTests/http/tests/loading/redirect-methods-expected.txt @@ -1,7 +1,6 @@ main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame main frame - didFinishLoadForFrame -http://127.0.0.1:8000/loading/redirect-methods.html - didFinishLoading frame "0" - didStartProvisionalLoadForFrame frame "0" - didCommitLoadForFrame frame "0" - didFinishDocumentLoadForFrame @@ -9,20 +8,14 @@ frame "0" - didHandleOnloadEventsForFrame frame "0" - didFinishLoadForFrame frame "0" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-form.html frame "0" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse frame "0" - didCancelClientRedirectForFrame frame "0" - didCommitLoadForFrame frame "0" - didFinishDocumentLoadForFrame frame "0" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-result.py frame "0" - didHandleOnloadEventsForFrame frame "0" - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading frame "0" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse frame "0" - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse frame "0" - didCancelClientRedirectForFrame frame "0" - didCommitLoadForFrame frame "0" - didFinishDocumentLoadForFrame @@ -34,22 +27,15 @@ frame "1" - didFinishLoadForFrame frame "1" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-form.html frame "0" - didHandleOnloadEventsForFrame frame "0" - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading frame "1" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse frame "1" - didCancelClientRedirectForFrame frame "1" - didCommitLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading frame "1" - didFinishDocumentLoadForFrame frame "1" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-result.py frame "1" - didHandleOnloadEventsForFrame frame "1" - didFinishLoadForFrame frame "1" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse frame "1" - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse frame "1" - didCancelClientRedirectForFrame frame "1" - didCommitLoadForFrame frame "1" - didFinishDocumentLoadForFrame @@ -61,22 +47,15 @@ frame "2" - didFinishLoadForFrame frame "2" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-form.html frame "1" - didHandleOnloadEventsForFrame frame "1" - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading frame "2" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse frame "2" - didCancelClientRedirectForFrame frame "2" - didCommitLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading frame "2" - didFinishDocumentLoadForFrame frame "2" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-result.py frame "2" - didHandleOnloadEventsForFrame frame "2" - didFinishLoadForFrame frame "2" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse frame "2" - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse frame "2" - didCancelClientRedirectForFrame frame "2" - didCommitLoadForFrame frame "2" - didFinishDocumentLoadForFrame @@ -88,22 +67,15 @@ frame "3" - didFinishLoadForFrame frame "3" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-form.html frame "2" - didHandleOnloadEventsForFrame frame "2" - didFinishLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading frame "3" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse frame "3" - didCancelClientRedirectForFrame frame "3" - didCommitLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading frame "3" - didFinishDocumentLoadForFrame frame "3" - willPerformClientRedirectToURL: http://127.0.0.1:8000/loading/resources/redirect-methods-result.py frame "3" - didHandleOnloadEventsForFrame frame "3" - didFinishLoadForFrame frame "3" - didStartProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse frame "3" - didReceiveServerRedirectForProvisionalLoadForFrame -http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse frame "3" - didCancelClientRedirectForFrame frame "3" - didCommitLoadForFrame frame "3" - didFinishDocumentLoadForFrame @@ -123,3 +95,25 @@ This test checks to see what HTTP method is used to fetch the final resource in 307 redirect +http://127.0.0.1:8000/loading/redirect-methods.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/redirect-methods.html - didReceiveResponse +http://127.0.0.1:8000/loading/redirect-methods.html - didFinishLoading +http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py?redirected=true - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py?redirected=true - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py?redirected=true - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py?redirected=true - willSendRequest redirectResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didReceiveResponse +http://127.0.0.1:8000/loading/resources/redirect-methods-result.py - didFinishLoading diff --git a/LayoutTests/http/tests/loading/redirect-methods.html b/LayoutTests/http/tests/loading/redirect-methods.html index afaf81db9f3d..b42b506fb84b 100644 --- a/LayoutTests/http/tests/loading/redirect-methods.html +++ b/LayoutTests/http/tests/loading/redirect-methods.html @@ -1,9 +1,9 @@ + diff --git a/LayoutTests/http/tests/media/media-stream/get-user-media-loopback-ip.html b/LayoutTests/http/tests/media/media-stream/get-user-media-loopback-ip.html index d86f7828e16c..a8f50c002adc 100644 --- a/LayoutTests/http/tests/media/media-stream/get-user-media-loopback-ip.html +++ b/LayoutTests/http/tests/media/media-stream/get-user-media-loopback-ip.html @@ -23,7 +23,8 @@ } try { - await window.navigator.mediaDevices.getUserMedia({audio:true}); + const stream = await window.navigator.mediaDevices.getUserMedia({audio:true}); + stream.getTracks().forEach(t => t.stop()); testPassed("getUserMedia succeeded"); } catch(err) { testFailed(`getUserMedia should have succeeded but failed with error "${err}"`); diff --git a/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled-expected.txt b/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled-expected.txt index b739af3c926f..30e18e93e3d5 100644 --- a/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled-expected.txt +++ b/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled-expected.txt @@ -1,6 +1,7 @@ -http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - didFinishLoading -http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - didReceiveResponse +CONSOLE MESSAGE: TypeError: testRunner.setIconDatabaseEnabled is not a function. (In 'testRunner.setIconDatabaseEnabled(true)', 'testRunner.setIconDatabaseEnabled' is undefined) Radar 6973106 and https://bugs.webkit.org/show_bug.cgi?id=27896 - Favicons still load when automatic image loading is disabled. This test uses DRT's resource load delegate callback mode to see if the favicon is loaded even when image loading is off. +http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - didReceiveResponse +http://127.0.0.1:8000/misc/favicon-loads-with-images-disabled.html - didFinishLoading diff --git a/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled.html b/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled.html index fe2fac2fad77..92ddbefae7e7 100644 --- a/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled.html +++ b/LayoutTests/http/tests/misc/favicon-loads-with-images-disabled.html @@ -1,11 +1,10 @@ - + + + + + + + diff --git a/LayoutTests/http/tests/misc/link-rel-icon-beforeload-expected.txt b/LayoutTests/http/tests/misc/link-rel-icon-beforeload-expected.txt index ad8ba1636514..b176ae0097b9 100644 --- a/LayoutTests/http/tests/misc/link-rel-icon-beforeload-expected.txt +++ b/LayoutTests/http/tests/misc/link-rel-icon-beforeload-expected.txt @@ -1,5 +1,5 @@ -http://127.0.0.1:8000/misc/link-rel-icon-beforeload.html - didFinishLoading +CONSOLE MESSAGE: TypeError: testRunner.setIconDatabaseEnabled is not a function. (In 'testRunner.setIconDatabaseEnabled(true)', 'testRunner.setIconDatabaseEnabled' is undefined) +This test should not show a request for the favicon dont-load-this.ico, since the beforeload handler on the favicon link returns false. Therefore, if the resource request list below shows a request for dont-load-this.ico, then this test has failed. http://127.0.0.1:8000/misc/link-rel-icon-beforeload.html - willSendRequest redirectResponse (null) http://127.0.0.1:8000/misc/link-rel-icon-beforeload.html - didReceiveResponse -http://127.0.0.1:8000/favicon.ico - willSendRequest redirectResponse (null) -This test should not show a request for the favicon dont-load-this.ico, since the beforeload handler on the favicon link returns false. Therefore, if the resource request list below shows a request for dont-load-this.ico, then this test has failed. +http://127.0.0.1:8000/misc/link-rel-icon-beforeload.html - didFinishLoading diff --git a/LayoutTests/http/tests/misc/link-rel-icon-beforeload.html b/LayoutTests/http/tests/misc/link-rel-icon-beforeload.html index bcdf8abe9e9e..b2593bb37b27 100644 --- a/LayoutTests/http/tests/misc/link-rel-icon-beforeload.html +++ b/LayoutTests/http/tests/misc/link-rel-icon-beforeload.html @@ -1,3 +1,4 @@ + diff --git a/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html b/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html index a32936525d9e..82557f5a918a 100644 --- a/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html +++ b/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { internals.clearMemoryCache(); testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.waitUntilDone(); } diff --git a/LayoutTests/http/tests/navigation/redirect-to-fragment.html b/LayoutTests/http/tests/navigation/redirect-to-fragment.html index 08155a243eda..f2429ebeef3c 100644 --- a/LayoutTests/http/tests/navigation/redirect-to-fragment.html +++ b/LayoutTests/http/tests/navigation/redirect-to-fragment.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { internals.clearMemoryCache(); testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.waitUntilDone(); } diff --git a/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt b/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt index a5a55bd6f447..7202be3d6b25 100644 --- a/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt +++ b/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt @@ -1,9 +1,11 @@ -http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - didFinishLoading -http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - willSendRequest redirectResponse -http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - willSendRequest redirectResponse -http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - didReceiveResponse -http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - didFinishLoading Test passes if WebKit keeps fragment identifier from first redirected URL. +http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - didReceiveResponse +http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - didFinishLoading +http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.py#bar - willSendRequest redirectResponse +http://127.0.0.1:8000/navigation/resources/success.html#bar - willSendRequest redirectResponse +http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - didReceiveResponse +http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.py - didFinishLoading diff --git a/LayoutTests/http/tests/navigation/redirect-to-fragment2.html b/LayoutTests/http/tests/navigation/redirect-to-fragment2.html index 4b2318ce336b..2d9a633f9e68 100644 --- a/LayoutTests/http/tests/navigation/redirect-to-fragment2.html +++ b/LayoutTests/http/tests/navigation/redirect-to-fragment2.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { internals.clearMemoryCache(); testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.waitUntilDone(); } diff --git a/LayoutTests/http/tests/navigation/redirect-to-invalid-url.html b/LayoutTests/http/tests/navigation/redirect-to-invalid-url.html index 5fc1047f6fa1..aa4fe5783006 100644 --- a/LayoutTests/http/tests/navigation/redirect-to-invalid-url.html +++ b/LayoutTests/http/tests/navigation/redirect-to-invalid-url.html @@ -1,10 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/http/tests/resources/nph-load-then-wait.cgi b/LayoutTests/http/tests/resources/nph-load-then-wait.cgi new file mode 100755 index 000000000000..179c773feb85 --- /dev/null +++ b/LayoutTests/http/tests/resources/nph-load-then-wait.cgi @@ -0,0 +1,29 @@ +#!/usr/bin/perl -w + +use CGI; +use File::stat; +use Time::HiRes; + +$| = 1; + +my $query = CGI->new; +my $name = $query->param('name'); +my $waitFor = $query->param('waitFor'); +my $mimeType = $query->param('mimeType'); + +my $filesize = stat($name)->size; +print "HTTP/1.1 200 OK\r\n"; +print "Content-Type: $mimeType\r\n"; +print "Content-Length: $filesize\r\n"; +print "Connection: close\r\n"; +print "\r\n"; + +open(my $fh, '<', $name) or die; +binmode $fh; +my $data; +while (read($fh, $data, 1024)) { + print $data; +} +close($fh); + +Time::HiRes::sleep($waitFor) if defined $waitFor; diff --git a/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start-expected.html b/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start-expected.html new file mode 100644 index 000000000000..fed7de3bbef8 --- /dev/null +++ b/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start-expected.html @@ -0,0 +1,14 @@ + + + +Scroll to text fragment - prefix near document start must be word-bounded + + +

Pass condition: only the word in the final sentence below is highlighted; the heading is not.

+

II

+

The Pool of Tears

+

Let me think: was I the same when I got up this morning?

diff --git a/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start.html b/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start.html new file mode 100644 index 000000000000..2d9bafbd607e --- /dev/null +++ b/LayoutTests/http/tests/scroll-to-text-fragment/prefix-word-bounded-at-doc-start.html @@ -0,0 +1,19 @@ + + +Scroll to text fragment - prefix near document start must be word-bounded + + + + + +

Pass condition: only the word in the final sentence below is highlighted; the heading is not.

+

II

+

The Pool of Tears

+

Let me think: was I the same when I got up this morning?

+ + + diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-allowall.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-allowall.html index 7b4fd240b419..e80d309d2b6a 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-allowall.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-allowall.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpResourceLoadCallbacks(); } diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny.html index a9b2cf8276d0..557a6270f1ea 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny.html @@ -1,8 +1,8 @@ + diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-ignore-deny-meta-tag.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-ignore-deny-meta-tag.html index 5e36be38f61f..50130f14f4cd 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-ignore-deny-meta-tag.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-ignore-deny-meta-tag.html @@ -1,9 +1,9 @@ + diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict.html index 93387c0dd33a..c737a3978cd4 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpResourceLoadCallbacks(); } diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-allow.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-allow.html index e592bb99e922..da5a4cfdf756 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-allow.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-allow.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpResourceLoadCallbacks(); } diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-deny.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-deny.html index 1f326c34d028..fd433c8cee63 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-deny.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-deny.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.waitUntilDone(); } diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html index 2f55cee73093..178330715693 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html @@ -1,8 +1,8 @@ + diff --git a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html index 0184532f2536..353cc7907a24 100644 --- a/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html +++ b/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html @@ -1,8 +1,8 @@ + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-expected.txt index 0cf57823821c..12c1f12eae17 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-expected.txt @@ -1,3 +1,5 @@ CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'". - (evaluating 'new WebAssembly.Instance(new WebAssembly.Module(empty))') + (evaluating 'new WebAssembly.Module(empty)') +CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'". + (evaluating 'new WebAssembly.Module(empty)') diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-about-blank-iframe-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-about-blank-iframe-expected.txt index 2ae0ebd1e025..2daa60b34937 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-about-blank-iframe-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-about-blank-iframe-expected.txt @@ -1,4 +1,4 @@ ALERT: /PASS/ CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'". - (evaluating 'new WebAssembly.Instance(new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x1, 0x00, 0x00, 0x00)))') + (evaluating 'new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x1, 0x00, 0x00, 0x00))') WebAssembly should be blocked in the iframe, but inline script should be allowed. diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-external-script-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-external-script-expected.txt index f357b6cbf456..3285979f917d 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-external-script-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-external-script-expected.txt @@ -1,3 +1,3 @@ CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'". - (evaluating 'new WebAssembly.Instance(new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x1, 0x00, 0x00, 0x00)))') + (evaluating 'new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x1, 0x00, 0x00, 0x00))') diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-subframe-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-subframe-expected.txt index 8507253838e8..3d1fbc25d7c1 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-subframe-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked-in-subframe-expected.txt @@ -1,5 +1,7 @@ CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'". - (evaluating 'new WebAssembly.Instance(new WebAssembly.Module(empty))') + (evaluating 'new WebAssembly.Module(empty)') +CONSOLE MESSAGE: CompileError: Refused to create a WebAssembly object because 'unsafe-eval' or 'wasm-unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'". + (evaluating 'new WebAssembly.Module(empty)') Tests that WebAssembly is blocked in a subframe that disallows WebAssembly when the parent frame allows WebAssembly. diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked.html b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked.html index d99d115f4e26..5fe48b86069b 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked.html +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/WebAssembly-blocked.html @@ -13,16 +13,14 @@ - + - - diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon-expected.txt index cf597310fe5a..ede9cb0f67dd 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon-expected.txt @@ -1,5 +1,5 @@ -http://127.0.0.1:8000/security/contentSecurityPolicy/allow-favicon.html - didFinishLoading +CONSOLE MESSAGE: TypeError: testRunner.setIconDatabaseEnabled is not a function. (In 'testRunner.setIconDatabaseEnabled(true)', 'testRunner.setIconDatabaseEnabled' is undefined) + http://127.0.0.1:8000/security/contentSecurityPolicy/allow-favicon.html - willSendRequest redirectResponse (null) http://127.0.0.1:8000/security/contentSecurityPolicy/allow-favicon.html - didReceiveResponse -http://127.0.0.1:8000/misc/resources/favicon.ico - willSendRequest redirectResponse (null) - +http://127.0.0.1:8000/security/contentSecurityPolicy/allow-favicon.html - didFinishLoading diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon.html b/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon.html index bbffcadad563..04ec8f842f82 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon.html +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/allow-favicon.html @@ -1,3 +1,4 @@ + @@ -6,7 +7,6 @@ function runTest() { if (window.testRunner) { testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.setIconDatabaseEnabled(true); testRunner.queueReload(); } diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon-expected.txt index d9f5053c6dd3..65bb4fbc6640 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon-expected.txt @@ -1,5 +1,5 @@ -http://127.0.0.1:8000/security/contentSecurityPolicy/block-favicon.html - didFinishLoading +CONSOLE MESSAGE: TypeError: testRunner.setIconDatabaseEnabled is not a function. (In 'testRunner.setIconDatabaseEnabled(true)', 'testRunner.setIconDatabaseEnabled' is undefined) + http://127.0.0.1:8000/security/contentSecurityPolicy/block-favicon.html - willSendRequest redirectResponse (null) http://127.0.0.1:8000/security/contentSecurityPolicy/block-favicon.html - didReceiveResponse -CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/misc/resources/favicon.ico because it does not appear in the img-src directive of the Content Security Policy. - +http://127.0.0.1:8000/security/contentSecurityPolicy/block-favicon.html - didFinishLoading diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon.html b/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon.html index 5c18648e1068..616dd61702c4 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon.html +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/block-favicon.html @@ -1,3 +1,4 @@ + @@ -6,7 +7,6 @@ function runTest() { if (window.testRunner) { testRunner.dumpAsText(); - testRunner.dumpResourceLoadCallbacks(); testRunner.setIconDatabaseEnabled(true); testRunner.queueReload(); } diff --git a/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked-expected.txt b/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked-expected.txt index a7dc33ad3eb5..ea7ab0df5fa5 100644 --- a/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked-expected.txt +++ b/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked-expected.txt @@ -1,13 +1,11 @@ -http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/security/http-0.9/image-on-HTTP-0.9-page-blocked.html - didFinishLoading -http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl - didReceiveResponse -CONSOLE MESSAGE: Sandboxing 'http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl' because it is using HTTP/0.9. -http://127.0.0.1:8080/security/http-0.9/resources/nph-image.pl - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl - didFinishLoading -http://127.0.0.1:8080/security/http-0.9/resources/nph-image.pl - didFailLoadingWithError: -------- Frame: '' -------- +http://127.0.0.1:8000/security/http-0.9/image-on-HTTP-0.9-page-blocked.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/security/http-0.9/image-on-HTTP-0.9-page-blocked.html - didReceiveResponse +http://127.0.0.1:8000/security/http-0.9/image-on-HTTP-0.9-page-blocked.html - didFinishLoading +http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/security/http-0.9/resources/nph-image-on-HTTP-0.9-page-blocked.pl - didFailLoadingWithError: diff --git a/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked.html b/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked.html index 4b9cc063ef82..759232483aaa 100644 --- a/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked.html +++ b/LayoutTests/http/tests/security/http-0.9/image-on-HTTP-0.9-page-blocked.html @@ -1,3 +1,4 @@ + @@ -5,7 +6,6 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); - testRunner.dumpResourceLoadCallbacks(); if (window.internals) internals.registerDefaultPortForProtocol(8000, "http"); } diff --git a/LayoutTests/http/tests/security/resources/credentials-main-resource.py b/LayoutTests/http/tests/security/resources/credentials-main-resource.py index 17b0282e7407..270fdc70de75 100755 --- a/LayoutTests/http/tests/security/resources/credentials-main-resource.py +++ b/LayoutTests/http/tests/security/resources/credentials-main-resource.py @@ -21,9 +21,6 @@ '\r\nMain Resource Credentials: {}, {}
' ' - - - - diff --git a/LayoutTests/http/tests/security/resources/iframe-for-storage-blocking-changed-websql.html b/LayoutTests/http/tests/security/resources/iframe-for-storage-blocking-changed-websql.html deleted file mode 100644 index 94538bbbe808..000000000000 --- a/LayoutTests/http/tests/security/resources/iframe-for-storage-blocking-changed-websql.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage-expected.txt b/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage-expected.txt deleted file mode 100644 index c7426cb01b76..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage-expected.txt +++ /dev/null @@ -1,10 +0,0 @@ -This iframe should return only one security error: - - - --------- -Frame: '' --------- -SecurityError - -No exception diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage.html b/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage.html deleted file mode 100644 index f59db0e90917..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-local-storage.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -

This iframe should return only one security error:

- - - diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-plugin-expected.txt b/LayoutTests/http/tests/security/storage-blocking-loosened-plugin-expected.txt deleted file mode 100644 index 97e231bce375..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-plugin-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -This iframe should not have private browsing enabled: - - - --------- -Frame: '' --------- -false diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-private-browsing-plugin-expected.txt b/LayoutTests/http/tests/security/storage-blocking-loosened-private-browsing-plugin-expected.txt deleted file mode 100644 index e36763987c87..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-private-browsing-plugin-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -This iframe should have private browsing enabled: - - - --------- -Frame: '' --------- -true diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-websql-expected.txt b/LayoutTests/http/tests/security/storage-blocking-loosened-websql-expected.txt deleted file mode 100644 index c4bbc8a23c8a..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-websql-expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -CONSOLE MESSAGE: Web SQL is deprecated. Please use IndexedDB instead. -CONSOLE MESSAGE: Web SQL is deprecated. Please use IndexedDB instead. -This iframe should return only one security error: - - - --------- -Frame: '' --------- -SecurityError - -No exception diff --git a/LayoutTests/http/tests/security/storage-blocking-loosened-websql.html b/LayoutTests/http/tests/security/storage-blocking-loosened-websql.html deleted file mode 100644 index e02c3b3cadc0..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-loosened-websql.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -

This iframe should return only one security error:

- - - diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage-expected.txt b/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage-expected.txt deleted file mode 100644 index f4d346613c0e..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage-expected.txt +++ /dev/null @@ -1,10 +0,0 @@ -This iframe should return only one security error: - - - --------- -Frame: '' --------- -No exception - -SecurityError diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage.html b/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage.html deleted file mode 100644 index d49f41e95ad6..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-local-storage.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -

This iframe should return only one security error:

- - - diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-plugin-expected.txt b/LayoutTests/http/tests/security/storage-blocking-strengthened-plugin-expected.txt deleted file mode 100644 index 3da548d65a39..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-plugin-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -This iframe should have private browsing enabled: - - - --------- -Frame: '' --------- -false diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-private-browsing-plugin-expected.txt b/LayoutTests/http/tests/security/storage-blocking-strengthened-private-browsing-plugin-expected.txt deleted file mode 100644 index 3da548d65a39..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-private-browsing-plugin-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -This iframe should have private browsing enabled: - - - --------- -Frame: '' --------- -false diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-websql-expected.txt b/LayoutTests/http/tests/security/storage-blocking-strengthened-websql-expected.txt deleted file mode 100644 index 8d5eba5f92e7..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-websql-expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -CONSOLE MESSAGE: Web SQL is deprecated. Please use IndexedDB instead. -CONSOLE MESSAGE: Web SQL is deprecated. Please use IndexedDB instead. -This iframe should return only one security error: - - - --------- -Frame: '' --------- -No exception - -SecurityError diff --git a/LayoutTests/http/tests/security/storage-blocking-strengthened-websql.html b/LayoutTests/http/tests/security/storage-blocking-strengthened-websql.html deleted file mode 100644 index 88eef149e4a1..000000000000 --- a/LayoutTests/http/tests/security/storage-blocking-strengthened-websql.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -

This iframe should return only one security error:

- - - diff --git a/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content-expected.txt b/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content-expected.txt new file mode 100644 index 000000000000..837251182a75 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content-expected.txt @@ -0,0 +1,22 @@ +Tests that walking accessibilityParent from a cross-process iframe descendant reaches the main page's WebArea. +PASS: iframeHeading != null === true + +Found Iframe descendant: AXRole: AXHeading "Iframe Heading 1" + +Accessibility-parent chain: + 1: AXRole: AXHeading + 2: AXRole: AXWebArea + 3: AXRole: AXScrollArea + 4: AXRole: AXGroup + 5: AXRole: AXGroup + 6: AXRole: AXWebArea + 7: AXRole: AXScrollArea + +PASS: walk.webAreaCount >= 2 === true + +PASS successfullyParsed is true + +TEST COMPLETE +Heading Before Iframe + + Button After Iframe diff --git a/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content.html b/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content.html new file mode 100644 index 000000000000..175a78df9154 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/accessibility/client/walk-up-from-iframe-content.html @@ -0,0 +1,95 @@ + + + + + + + +

Heading Before Iframe

+ + + + + + + + diff --git a/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame-expected.txt b/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame-expected.txt new file mode 100644 index 000000000000..adff5188ae22 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame-expected.txt @@ -0,0 +1,11 @@ +This test ensures the accessibility search used by the VoiceOver rotor returns a remote frame placeholder for an out-of-process iframe on iOS. + +PASS: headingSearchReturnsRemoteFrame() === true + +PASS successfullyParsed is true + +TEST COMPLETE +start +Local heading + + diff --git a/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame.html b/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame.html new file mode 100644 index 000000000000..b0a06e712f01 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/accessibility/heading-search-returns-remote-frame.html @@ -0,0 +1,47 @@ + + + + + + + + +

Local heading

+ + + + + diff --git a/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash-expected.txt b/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash-expected.txt new file mode 100644 index 000000000000..ddad5eaf7f1e --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash-expected.txt @@ -0,0 +1 @@ +PASS if no crash diff --git a/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash.html b/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash.html new file mode 100644 index 000000000000..9ad5d2e4465c --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/remove-iframe-while-process-launching-crash.html @@ -0,0 +1,36 @@ + + + + + diff --git a/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https-expected.txt b/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https-expected.txt new file mode 100644 index 000000000000..ce2f13476c21 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https-expected.txt @@ -0,0 +1,17 @@ +Tests that a no-gesture requestStorageAccess() rejection in a popup's cross-site iframe does not fabricate user interaction that silently grants storage access under the opener. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS requestStorageAccess() was rejected without a user gesture in the popup iframe. +PASS successfullyParsed is true + +TEST COMPLETE + + +-------- +Frame: '' +-------- +Should not receive first-party cookie. +Did not receive cookie named 'firstPartyCookie'. +Client-side document.cookie: diff --git a/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https.html b/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https.html new file mode 100644 index 000000000000..71c8059f9106 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/no-gesture-rejection-should-not-grant-storage-access-under-opener.https.html @@ -0,0 +1,66 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-and-access-from-right-frame.https.html b/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-and-access-from-right-frame.https.html index 2e03709ea71c..d92b0528eeba 100644 --- a/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-and-access-from-right-frame.https.html +++ b/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-and-access-from-right-frame.https.html @@ -64,7 +64,7 @@ ); } - function runTest() { + async function runTest() { switch (document.location.hash) { case "#step1": if (testRunner.isStatisticsPrevalentResource(statisticsUrl)) @@ -106,7 +106,7 @@ case "#step6": document.location.hash = "step7"; // Set per-frame access since clearing access on cross-site navigation of the iframe requires per-frame access. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(false); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(false); // Create iframe that will request storage access. let iframeElement = document.createElement("iframe"); iframeElement.setAttribute("sandbox", "allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-modals"); @@ -157,7 +157,7 @@ break; case "#step11": // Reset access scope. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(true); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(true); setEnableFeature(false, finishJSTest); break; } diff --git a/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-but-access-from-wrong-frame.https.html b/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-but-access-from-wrong-frame.https.html index 47072e757486..c0dfb37bbf84 100644 --- a/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-but-access-from-wrong-frame.https.html +++ b/LayoutTests/http/tests/storageAccess/request-and-grant-access-cross-origin-sandboxed-iframe-from-prevalent-domain-with-user-interaction-but-access-from-wrong-frame.https.html @@ -64,7 +64,7 @@ ); } - function runTest() { + async function runTest() { switch (document.location.hash) { case "#step1": if (testRunner.isStatisticsPrevalentResource(statisticsUrl)) @@ -106,7 +106,7 @@ case "#step6": document.location.hash = "step7"; // Set per-frame access since otherwise the sibling iframe will get access. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(false); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(false); let iframeElement = document.createElement("iframe"); iframeElement.setAttribute("sandbox", "allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-modals"); iframeElement.onload = function() { @@ -125,7 +125,7 @@ break; case "#step8": // Reset access scope. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(true); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(true); setEnableFeature(false, finishJSTest); break; } diff --git a/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html b/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html index 3c1cdf4af456..62dfc7d33005 100644 --- a/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html +++ b/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html @@ -10,9 +10,9 @@ window.addEventListener("message", receiveMessage, false); - function finishTest() { + async function finishTest() { // Reset access scope. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(true); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(true); setEnableFeature(false, finishJSTest); } @@ -88,15 +88,9 @@ } } - const hostUnderTest = "localhost:8443"; - const statisticsUrl = "https://" + hostUnderTest; - if (document.location.hash !== "#firstPartyCookieSet" && document.location.hash !== "#elementActivated") { - setEnableFeature(true, function() { - document.location.href = statisticsUrl + "/storageAccess/resources/set-cookie.py?name=firstPartyCookie&value=value#https://127.0.0.1:8443/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html#firstPartyCookieSet"; - }); - } else { + async function startTest() { // Set per-frame access since clearing access on detaching the iframe requires per-frame access. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(false); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(false); testRunner.setStatisticsPrevalentResource(statisticsUrl, true, function() { if (!testRunner.isStatisticsPrevalentResource(statisticsUrl)) @@ -115,6 +109,16 @@ }); }); } + + const hostUnderTest = "localhost:8443"; + const statisticsUrl = "https://" + hostUnderTest; + if (document.location.hash !== "#firstPartyCookieSet" && document.location.hash !== "#elementActivated") { + setEnableFeature(true, function() { + document.location.href = statisticsUrl + "/storageAccess/resources/set-cookie.py?name=firstPartyCookie&value=value#https://127.0.0.1:8443/storageAccess/request-and-grant-access-then-detach-should-not-have-access.https.html#firstPartyCookieSet"; + }); + } else { + startTest(); + } diff --git a/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html b/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html index 93bb61fbffa1..65ee8e209e54 100644 --- a/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html +++ b/LayoutTests/http/tests/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html @@ -12,9 +12,9 @@ window.addEventListener("message", receiveMessage, false); - function finishTest() { + async function finishTest() { // Reset access scope. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(true); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(true); setEnableFeature(false, finishJSTest); } @@ -63,15 +63,9 @@ activateElement("TheIframeThatRequestsStorageAccess"); } - const hostUnderTest = "localhost:8443"; - const statisticsUrl = "https://" + hostUnderTest; - if (document.location.hash !== "#firstPartyCookieSet") { - setEnableFeature(true, function() { - document.location.href = statisticsUrl + "/storageAccess/resources/set-cookie.py?name=firstPartyCookie&value=value#https://127.0.0.1:8443/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html#firstPartyCookieSet"; - }); - } else { + async function startTest() { // Set per-frame access since clearing access on cross-site navigation of the iframe requires per-frame access. - internals.settings.setStorageAccessAPIPerPageScopeEnabled(false); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(false); testRunner.setStatisticsPrevalentResource(statisticsUrl, true, function() { if (!testRunner.isStatisticsPrevalentResource(statisticsUrl)) testFailed("Host did not get set as prevalent resource."); @@ -89,6 +83,16 @@ }); }); } + + const hostUnderTest = "localhost:8443"; + const statisticsUrl = "https://" + hostUnderTest; + if (document.location.hash !== "#firstPartyCookieSet") { + setEnableFeature(true, function() { + document.location.href = statisticsUrl + "/storageAccess/resources/set-cookie.py?name=firstPartyCookie&value=value#https://127.0.0.1:8443/storageAccess/request-and-grant-access-then-navigate-cross-site-should-not-have-access.https.html#firstPartyCookieSet"; + }); + } else { + startTest(); + } diff --git a/LayoutTests/http/tests/storageAccess/request-and-grant-access-with-per-page-scope-access-from-another-frame.https.html b/LayoutTests/http/tests/storageAccess/request-and-grant-access-with-per-page-scope-access-from-another-frame.https.html index 664d85b5f90c..3776a5970ec5 100644 --- a/LayoutTests/http/tests/storageAccess/request-and-grant-access-with-per-page-scope-access-from-another-frame.https.html +++ b/LayoutTests/http/tests/storageAccess/request-and-grant-access-with-per-page-scope-access-from-another-frame.https.html @@ -62,7 +62,7 @@ ); } - function runTest() { + async function runTest() { switch (document.location.hash) { case "#step1": // Set first-party cookie for localhost. @@ -82,7 +82,7 @@ }); break; case "#step4": - internals.settings.setStorageAccessAPIPerPageScopeEnabled(true); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(true); document.location.hash = "step5"; let iframeElement = document.createElement("iframe"); iframeElement.onload = function() { @@ -98,7 +98,7 @@ openIframe(thirdPartyBaseUrl + subPathToGetCookies + "&message=Should receive cookies even though it's not the requesting frame.", runTest); break; case "#step6": - internals.settings.setStorageAccessAPIPerPageScopeEnabled(false); + await testRunner.setStorageAccessAPIPerPageScopeEnabled(false); testRunner.setStatisticsShouldBlockThirdPartyCookies(false, function() { setEnableFeature(false, finishJSTest); }); diff --git a/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-and-report-back.html b/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-and-report-back.html new file mode 100644 index 000000000000..98ae9cb383a5 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-and-report-back.html @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-in-iframe.html b/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-in-iframe.html new file mode 100644 index 000000000000..6e8095f0404d --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/resources/request-storage-access-without-gesture-in-iframe.html @@ -0,0 +1,26 @@ + + + + + + + diff --git a/LayoutTests/http/tests/svg/svg-use-external-expected.txt b/LayoutTests/http/tests/svg/svg-use-external-expected.txt index f2fc89ce6bd2..dd80e77cb1b6 100644 --- a/LayoutTests/http/tests/svg/svg-use-external-expected.txt +++ b/LayoutTests/http/tests/svg/svg-use-external-expected.txt @@ -1,5 +1,7 @@ -http://127.0.0.1:8000/svg/resources/symbol-defs.svg#icon-rocket - willSendRequest redirectResponse (null) + +http://127.0.0.1:8000/svg/svg-use-external.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/svg/svg-use-external.html - didReceiveResponse http://127.0.0.1:8000/svg/svg-use-external.html - didFinishLoading +http://127.0.0.1:8000/svg/resources/symbol-defs.svg#icon-rocket - willSendRequest redirectResponse (null) http://127.0.0.1:8000/svg/resources/symbol-defs.svg#icon-rocket - didReceiveResponse http://127.0.0.1:8000/svg/resources/symbol-defs.svg#icon-rocket - didFinishLoading - diff --git a/LayoutTests/http/tests/svg/svg-use-external.html b/LayoutTests/http/tests/svg/svg-use-external.html index b72c15e453b8..10a96e50eab3 100755 --- a/LayoutTests/http/tests/svg/svg-use-external.html +++ b/LayoutTests/http/tests/svg/svg-use-external.html @@ -1,3 +1,4 @@ + @@ -8,7 +9,6 @@ + + diff --git a/LayoutTests/http/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil-expected.txt b/LayoutTests/http/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil-expected.txt index c43974032a33..167a62dfce37 100644 --- a/LayoutTests/http/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil-expected.txt +++ b/LayoutTests/http/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil-expected.txt @@ -8,59 +8,11 @@ PASS :sampling_while_testing:format="depth32float";depthReadOnly=false;stencilRe PASS :sampling_while_testing:format="depth24plus";depthReadOnly=true;stencilReadOnly="_undef_" PASS :sampling_while_testing:format="depth24plus";depthReadOnly=false;stencilReadOnly="_undef_" PASS :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=true;stencilReadOnly=true -FAIL :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=true;stencilReadOnly=false assert_unreached: - - EXPECTATION FAILED: Array had unexpected contents at indices 4 through 8. - Starting at index 3: - actual == 0x: 00 00 00 00 00 00 00 - failed -> xx xx - expected == 00 01 00 00 00 01 00 - eventualAsyncExpectation@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:258:33 - expectGPUBufferValuesPassCheck@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:715:34 - expectGPUBufferValuesEqual@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:731:40 - expectGPUBufferRepeatsSingleValue@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:775:38 - expectSingleColor@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:944:43 - @http://127.0.0.1:8000/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js:328:22 - Reached unreachable code -FAIL :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=false;stencilReadOnly=true assert_unreached: - - EXPECTATION FAILED: Array had unexpected contents at indices 260 through 516. - Starting at index 259: - actual == 0x: 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... - failed -> xx ... - expected == 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... - eventualAsyncExpectation@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:258:33 - expectGPUBufferValuesPassCheck@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:715:34 - expectGPUBufferValuesEqual@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:731:40 - expectGPUBufferRepeatsSingleValue@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:775:38 - expectSingleColor@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:944:43 - @http://127.0.0.1:8000/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js:328:22 - Reached unreachable code +PASS :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=true;stencilReadOnly=false +PASS :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=false;stencilReadOnly=true PASS :sampling_while_testing:format="depth24plus-stencil8";depthReadOnly=false;stencilReadOnly=false PASS :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=true;stencilReadOnly=true -FAIL :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=true;stencilReadOnly=false assert_unreached: - - EXPECTATION FAILED: Array had unexpected contents at indices 4 through 8. - Starting at index 3: - actual == 0x: 00 00 00 00 00 00 00 - failed -> xx xx - expected == 00 01 00 00 00 01 00 - eventualAsyncExpectation@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:258:33 - expectGPUBufferValuesPassCheck@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:715:34 - expectGPUBufferValuesEqual@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:731:40 - expectGPUBufferRepeatsSingleValue@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:775:38 - expectSingleColor@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:944:43 - @http://127.0.0.1:8000/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js:328:22 - Reached unreachable code -FAIL :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=false;stencilReadOnly=true assert_unreached: - - EXPECTATION FAILED: Array had unexpected contents at indices 260 through 516. - Starting at index 259: - actual == 0x: 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... - failed -> xx ... - expected == 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... - eventualAsyncExpectation@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:258:33 - expectGPUBufferValuesPassCheck@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:715:34 - expectGPUBufferValuesEqual@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:731:40 - expectGPUBufferRepeatsSingleValue@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:775:38 - expectSingleColor@http://127.0.0.1:8000/webgpu/webgpu/gpu_test.js:944:43 - @http://127.0.0.1:8000/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js:328:22 - Reached unreachable code +PASS :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=true;stencilReadOnly=false +PASS :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=false;stencilReadOnly=true PASS :sampling_while_testing:format="depth32float-stencil8";depthReadOnly=false;stencilReadOnly=false diff --git a/LayoutTests/http/tests/websocket/tests/hybi/handshake-fail-with-200-ok_wsh.py b/LayoutTests/http/tests/websocket/tests/hybi/handshake-fail-with-200-ok_wsh.py new file mode 100644 index 000000000000..d076149976fe --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/handshake-fail-with-200-ok_wsh.py @@ -0,0 +1,21 @@ +from pywebsocket3 import handshake +from pywebsocket3.handshake.hybi import compute_accept_from_unicode + + +def web_socket_do_extra_handshake(request): + # Reply with 200 OK instead of 101 Switching Protocols. The handshake + # validation in the network stack fails on the wrong status code, so the + # client surfaces an error and tears down the connection. + msg = b"HTTP/1.1 200 OK\r\n" + msg += b"Upgrade: websocket\r\n" + msg += b"Connection: Upgrade\r\n" + msg += b"Sec-WebSocket-Accept: " + msg += compute_accept_from_unicode(request.headers_in["Sec-WebSocket-Key"]) + msg += b"\r\n" + msg += b"\r\n" + request.connection.write(msg) + raise handshake.AbortedByUserException("Abort the connection") + + +def web_socket_transfer_data(request): + pass diff --git a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-insecure-connection.pl b/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-insecure-connection.pl deleted file mode 100755 index 32786fbad4ea..000000000000 --- a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-insecure-connection.pl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl -wT -use strict; -binmode STDOUT; - -if ($ENV{"QUERY_STRING"} eq "clear=1") { - print "Content-Type: text/plain\r\n"; - print "Set-Cookie: WK-websocket-test=0; Max-Age=-1\r\n"; - print "Set-Cookie: WK-websocket-test-secure=0; Secure; Max-Age=-1\r\n"; - print "\r\n"; - print "Cookies are cleared."; - exit; -} - -print "Content-Type: text/html\r\n"; -print "Set-Cookie: WK-websocket-test=1\r\n"; -print "Set-Cookie: WK-websocket-test-secure=1; Secure\r\n"; -print "\r\n"; -print < - - - - -

Test WebSocket does not send Secure cookies over an insecure connection.

-

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".

-
- - - - -HTML diff --git a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection-expected.txt deleted file mode 100644 index 94b0d05feab3..000000000000 --- a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection-expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Test WebSocket sends Secure cookies over secure connections. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -Note: mod_pywebsocket does not send secure cookies ('see FIXMEs in mod_pywebsocket code'), so this test is expected to FAIL to return WK-websocket-test-secure=1 until that bug is fixed. - -See pywebsocket Bug 150 for details. - -WebSocket open -WebSocket closed -PASS cookie is "WK-websocket-test-secure=1; WK-websocket-test=1" -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection.pl b/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection.pl deleted file mode 100755 index 865adf2f81af..000000000000 --- a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-secure-connection.pl +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl -wT -use strict; -binmode STDOUT; - -if ($ENV{"QUERY_STRING"} eq "clear=1") { - print "Content-Type: text/plain\r\n"; - print "Set-Cookie: WK-websocket-test=0; Max-Age=-1\r\n"; - print "Set-Cookie: WK-websocket-test-secure=0; Secure; HttpOnly; Max-Age=-1\r\n"; - print "\r\n"; - print "Cookies are cleared."; - exit; -} - -print "Content-Type: text/html\r\n"; -print "Set-Cookie: WK-websocket-test=1\r\n"; -print "Set-Cookie: WK-websocket-test-secure=1; Secure; HttpOnly\r\n"; -print "\r\n"; -print < - - - - -

Test WebSocket sends Secure cookies over secure connections.

-

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".

-

Note: mod_pywebsocket does not send secure cookies ('see FIXMEs in mod_pywebsocket code'), so this test is expected to FAIL to return WK-websocket-test-secure=1 until that bug is fixed.

-

See pywebsocket Bug 150 for details.

-
- - - - -HTML diff --git a/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup-expected.txt new file mode 100644 index 000000000000..8867caa8ccac --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup-expected.txt @@ -0,0 +1,9 @@ +Verifies that NetworkSocketChannel is cleaned up in the network process when a worker WebSocket fails the handshake and the worker self-terminates. https://bugs.webkit.org/show_bug.cgi?id=315342 + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS NetworkSocketChannel count returned to 0 after worker WebSockets terminated. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup.html b/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup.html new file mode 100644 index 000000000000..5b35555ad8bd --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/worker-handshake-failure-cleanup.html @@ -0,0 +1,58 @@ + + + + + + +
+
+ + + diff --git a/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load-expected.txt b/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load-expected.txt index fc56f57e32b5..605fc6d31d6a 100644 --- a/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load-expected.txt +++ b/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load-expected.txt @@ -1,5 +1,6 @@ -http://127.0.0.1:8000/xmlhttprequest/resources/endlessxml.py - willSendRequest redirectResponse (null) -http://127.0.0.1:8000/xmlhttprequest/resources/endlessxml.py - didFailLoadingWithError: -http://127.0.0.1:8000/xmlhttprequest/abort-should-cancel-load.html - didFinishLoading This tests that calling abort() on an XHR object stops the load, causing the relevant resource load delegates to be sent. +http://127.0.0.1:8000/xmlhttprequest/abort-should-cancel-load.html - willSendRequest redirectResponse (null) +http://127.0.0.1:8000/xmlhttprequest/abort-should-cancel-load.html - didReceiveResponse +http://127.0.0.1:8000/xmlhttprequest/abort-should-cancel-load.html - didFinishLoading +http://127.0.0.1:8000/xmlhttprequest/resources/endlessxml.py - willSendRequest redirectResponse (null) diff --git a/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load.html b/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load.html index 6ea2406ece0a..e6d8b7d46f14 100644 --- a/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load.html +++ b/LayoutTests/http/tests/xmlhttprequest/abort-should-cancel-load.html @@ -1,3 +1,4 @@ + - - diff --git a/LayoutTests/http/tests/xmlhttprequest/onabort-response-getters.html b/LayoutTests/http/tests/xmlhttprequest/onabort-response-getters.html index ae227d2ae068..793ef81343b1 100644 --- a/LayoutTests/http/tests/xmlhttprequest/onabort-response-getters.html +++ b/LayoutTests/http/tests/xmlhttprequest/onabort-response-getters.html @@ -19,7 +19,7 @@ var test = async_test(name) test.step(function() { var client = new XMLHttpRequest() - var url = "/resources/load-then-wait.cgi?name=../xmlhttprequest/" + fileName + "&waitFor=1&mimeType=" + mimeType + var url = "/resources/nph-load-then-wait.cgi?name=../xmlhttprequest/" + fileName + "&waitFor=1&mimeType=" + mimeType client.open("GET", url, true) setupClient(test, client) client.isAborting = false @@ -56,7 +56,7 @@ var test2 = async_test(name + " (aborting in loadend)") test2.step(function() { var client = new XMLHttpRequest() - var url = "/resources/load-then-wait.cgi?name=../xmlhttprequest/" + fileName + "&waitFor=1&mimeType=" + mimeType + var url = "/resources/nph-load-then-wait.cgi?name=../xmlhttprequest/" + fileName + "&waitFor=1&mimeType=" + mimeType client.open("GET", url, true) setupClient(test2, client) diff --git a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-expected.txt b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-expected.txt index 9e272b81ac10..1cb8a74c1c23 100644 --- a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-expected.txt +++ b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-expected.txt @@ -1,3 +1 @@ -http://localhost:8800/WebKit/content-security-policy/sandbox-manifest-blocked.html - didFinishLoading -http://localhost:8800/WebKit/content-security-policy/manifest.json - didFailLoadingWithError: Fetched manifest: http://localhost:8800/WebKit/content-security-policy/manifest.json, success: false diff --git a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html index 9a2d36bcd91c..4a008e095f49 100644 --- a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html +++ b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html @@ -3,7 +3,6 @@ - + diff --git a/LayoutTests/http/wpt/mediarecorder/pause-recording-2.html b/LayoutTests/http/wpt/mediarecorder/pause-recording-2.html index 8c69149014fe..17862734a19f 100644 --- a/LayoutTests/http/wpt/mediarecorder/pause-recording-2.html +++ b/LayoutTests/http/wpt/mediarecorder/pause-recording-2.html @@ -22,6 +22,7 @@ promise_test(async (test) => { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }); + test.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); const recorder = new MediaRecorder(stream, { mimeType: "video/webm" }); const dataPromise = new Promise(resolve => recorder.ondataavailable = (e) => resolve(e.data)); diff --git a/LayoutTests/http/wpt/mediastream/serialize-mediastreamtrack-to-worker.html b/LayoutTests/http/wpt/mediastream/serialize-mediastreamtrack-to-worker.html index a250f0a6d7cb..6b179ed451e9 100644 --- a/LayoutTests/http/wpt/mediastream/serialize-mediastreamtrack-to-worker.html +++ b/LayoutTests/http/wpt/mediastream/serialize-mediastreamtrack-to-worker.html @@ -39,6 +39,7 @@ window.internals.setTopDocumentURLForQuirks("https://zoom.us"); const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 480 } }); + test.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); const worker = await createWorker(` self.onmessage = async (event) => { diff --git a/LayoutTests/http/wpt/webcodecs/h264_bad_avc-expected.txt b/LayoutTests/http/wpt/webcodecs/h264_bad_avc-expected.txt new file mode 100644 index 000000000000..3c8d8d272a47 --- /dev/null +++ b/LayoutTests/http/wpt/webcodecs/h264_bad_avc-expected.txt @@ -0,0 +1,3 @@ + +PASS Decoding bad AVC should gracefully fail + diff --git a/LayoutTests/http/wpt/webcodecs/h264_bad_avc.html b/LayoutTests/http/wpt/webcodecs/h264_bad_avc.html new file mode 100644 index 000000000000..0cb31cf4fc0c --- /dev/null +++ b/LayoutTests/http/wpt/webcodecs/h264_bad_avc.html @@ -0,0 +1,36 @@ + + +
+ + +
+ + + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-insecure-connection-expected.txt b/LayoutTests/http/wpt/websockets/secure-cookie-insecure-connection.https-expected.txt similarity index 100% rename from LayoutTests/http/tests/websocket/tests/hybi/secure-cookie-insecure-connection-expected.txt rename to LayoutTests/http/wpt/websockets/secure-cookie-insecure-connection.https-expected.txt diff --git a/LayoutTests/http/wpt/websockets/secure-cookie-insecure-connection.https.py b/LayoutTests/http/wpt/websockets/secure-cookie-insecure-connection.https.py new file mode 100644 index 000000000000..7a7acf3f560c --- /dev/null +++ b/LayoutTests/http/wpt/websockets/secure-cookie-insecure-connection.https.py @@ -0,0 +1,90 @@ +def main(request, response): + query = request.url_parts.query or "" + + if query == "clear=1": + return ( + [ + (b"Content-Type", b"text/plain"), + (b"Access-Control-Allow-Origin", b"http://web-platform.test:8800"), + (b"Access-Control-Allow-Credentials", b"true"), + (b"Set-Cookie", b"WK-websocket-test=0; Path=/; Max-Age=-1"), + (b"Set-Cookie", b"WK-websocket-test-secure=0; Path=/; Secure; Max-Age=-1"), + ], + b"Cookies are cleared.", + ) + + # Phase 1: bounce away from localhost to https://web-platform.test. CFNetwork + # treats loopback hosts (127.0.0.0/8, ::1, localhost, *.localhost) as + # "potentially trustworthy", which means a Secure cookie can be set over + # plain http and is also sent over plain ws to a loopback host. Using a + # non-loopback hostname ensures the connection is treated as truly insecure + # for cookie purposes. + if query != "phase=cookies" and query != "phase=verify": + return ( + [(b"Content-Type", b"text/html")], + b"""""", + ) + + # Phase 2: served over https://web-platform.test, set both cookies (Secure + # attribute is honored because the response is over https) then bounce to + # http://web-platform.test for the actual ws test. + if query == "phase=cookies": + return ( + [ + (b"Content-Type", b"text/html"), + (b"Set-Cookie", b"WK-websocket-test=1; Path=/"), + (b"Set-Cookie", b"WK-websocket-test-secure=1; Path=/; Secure"), + ], + b"""""", + ) + + # Phase 3: served over http://web-platform.test, open ws (truly insecure -- + # non loopback hostname, insecure scheme) and verify only the non-Secure + # cookie is sent. + return ( + [(b"Content-Type", b"text/html")], + b""" + + + + +

Test WebSocket does not send Secure cookies over an insecure connection.

+

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".

+
+ + + +""", + ) diff --git a/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https-expected.txt b/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https-expected.txt new file mode 100644 index 000000000000..02a12b422d0b --- /dev/null +++ b/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https-expected.txt @@ -0,0 +1,11 @@ +Test WebSocket sends Secure cookies over secure connections. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +WebSocket open +WebSocket closed +PASS cookie is "WK-websocket-test-secure=1; WK-websocket-test=1" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https.py b/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https.py new file mode 100644 index 000000000000..7f21ecf7c360 --- /dev/null +++ b/LayoutTests/http/wpt/websockets/secure-cookie-secure-connection.https.py @@ -0,0 +1,74 @@ +def main(request, response): + query = request.url_parts.query or "" + + if query == "clear=1": + return ( + [ + (b"Content-Type", b"text/plain"), + (b"Set-Cookie", b"WK-websocket-test=0; Path=/; Max-Age=-1"), + (b"Set-Cookie", b"WK-websocket-test-secure=0; Path=/; Secure; HttpOnly; Max-Age=-1"), + ], + b"Cookies are cleared.", + ) + + # Phase 1: bounce away from localhost to https://web-platform.test. Loading + # the response over https (with a non-loopback hostname) is what lets the + # Secure cookie be set in a way that does not depend on CFNetwork's loopback + # "potentially trustworthy" treatment. + if query != "phase=test": + return ( + [(b"Content-Type", b"text/html")], + b"""""", + ) + + # Phase 2: served over https://web-platform.test, set both cookies and + # verify both are sent over wss. + return ( + [ + (b"Content-Type", b"text/html"), + (b"Set-Cookie", b"WK-websocket-test=1; Path=/"), + (b"Set-Cookie", b"WK-websocket-test-secure=1; Path=/; Secure; HttpOnly"), + ], + b""" + + + + +

Test WebSocket sends Secure cookies over secure connections.

+

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".

+
+ + + +""", + ) diff --git a/LayoutTests/http/tests/xmlhttprequest/cookies-expected.txt b/LayoutTests/http/wpt/xhr/cookies.https-expected.txt similarity index 100% rename from LayoutTests/http/tests/xmlhttprequest/cookies-expected.txt rename to LayoutTests/http/wpt/xhr/cookies.https-expected.txt diff --git a/LayoutTests/http/wpt/xhr/cookies.https.html b/LayoutTests/http/wpt/xhr/cookies.https.html new file mode 100644 index 000000000000..1ed1d8eed1be --- /dev/null +++ b/LayoutTests/http/wpt/xhr/cookies.https.html @@ -0,0 +1,80 @@ + + +

Tests for bug 3420: +XMLHttpRequest does not handle set-cookie headers.

+
FAIL: test script didn't run.
+ + + + diff --git a/LayoutTests/http/wpt/xhr/resources/get-set-cookie.py b/LayoutTests/http/wpt/xhr/resources/get-set-cookie.py new file mode 100644 index 000000000000..20497ff0a5fb --- /dev/null +++ b/LayoutTests/http/wpt/xhr/resources/get-set-cookie.py @@ -0,0 +1,19 @@ +def main(request, response): + headers = [(b"Content-Type", b"text/plain")] + + if request.url_parts.query: + # Assume any query string means "?clear=1": expire both cookies. + age = b"; expires=Thu, 19 Mar 1982 11:22:11 GMT" + # Permit the cross-origin clean-up XHR from http://web-platform.test + # used by the multi-phase cookies.https.html test that bounces between + # http and https. + headers.append((b"Access-Control-Allow-Origin", b"http://web-platform.test:8800")) + headers.append((b"Access-Control-Allow-Credentials", b"true")) + else: + age = b"" + + headers.append((b"Set-Cookie", b"WK-test=1" + age)) + headers.append((b"Set-Cookie", b"WK-test-secure=1; secure" + age)) + + body = request.headers.get(b"Cookie", b"") + return headers, body diff --git a/LayoutTests/imported/w3c/resources/config.json b/LayoutTests/imported/w3c/resources/config.json index 6ab634064a72..4c42cfdd5d30 100644 --- a/LayoutTests/imported/w3c/resources/config.json +++ b/LayoutTests/imported/w3c/resources/config.json @@ -3,7 +3,8 @@ "ports":{"http":[8800, 8801], "https":[9443, 9444], "h2":[9000], - "ws":[49001]}, + "ws":[49001], + "wss":[49002]}, "aliases": [ {"url-path": "/resources/testharnessreport.js", "local-dir":"../../../resources/"}, {"url-path": "/resources/testdriver-vendor.js", "local-dir":"../../../resources/"}, diff --git a/LayoutTests/imported/w3c/resources/resource-files.json b/LayoutTests/imported/w3c/resources/resource-files.json index d05b30ee4482..c846218d254e 100644 --- a/LayoutTests/imported/w3c/resources/resource-files.json +++ b/LayoutTests/imported/w3c/resources/resource-files.json @@ -51,6 +51,7 @@ "css/css-pseudo/first-letter-and-whitespace-ref.html", "css/css-pseudo/first-letter-background-image-ref.html", "css/css-pseudo/first-letter-block-to-inline-ref.html", + "css/css-pseudo/first-letter-c0.tentative-ref.html", "css/css-pseudo/first-letter-exclude-block-child-marker-ref.html", "css/css-pseudo/first-letter-exclude-inline-child-marker-ref.html", "css/css-pseudo/first-letter-exclude-inline-marker-ref.html", @@ -65,6 +66,7 @@ "css/css-pseudo/first-letter-skip-empty-span-nested-ref.html", "css/css-pseudo/first-letter-skip-empty-span-ref.html", "css/css-pseudo/first-letter-skip-marker-ref.html", + "css/css-pseudo/first-letter-trailing-punctuation-ref.html", "css/css-pseudo/first-letter-width-ref.html", "css/css-pseudo/first-letter-with-quote-ref.html", "css/css-pseudo/first-letter-with-span-ref.html", @@ -3092,6 +3094,7 @@ "web-platform-tests/css/css-color/border-color-currentcolor-ref.html", "web-platform-tests/css/css-color/border-color-ref.xht", "web-platform-tests/css/css-color/clip-opacity-out-of-flow-ref.html", + "web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html", "web-platform-tests/css/css-color/color-mix-basic-001-ref.html", "web-platform-tests/css/css-color/color-mix-currentcolor-001-ref.html", "web-platform-tests/css/css-color/color-mix-currentcolor-002-ref.html", @@ -3101,8 +3104,10 @@ "web-platform-tests/css/css-color/color-mix-non-srgb-001-ref.html", "web-platform-tests/css/css-color/color-mix-percents-01-ref.html", "web-platform-tests/css/css-color/composited-filters-under-opacity-ref.html", + "web-platform-tests/css/css-color/contrast-color-001-ref.html", "web-platform-tests/css/css-color/currentcolor-003-ref.html", "web-platform-tests/css/css-color/currentcolor-004-ref.html", + "web-platform-tests/css/css-color/currentcolor-005-ref.html", "web-platform-tests/css/css-color/currentcolor-visited-fallback-ref.html", "web-platform-tests/css/css-color/deprecated-sameas-ButtonBorder-ref.html", "web-platform-tests/css/css-color/deprecated-sameas-ButtonFace-ref.html", @@ -3110,6 +3115,7 @@ "web-platform-tests/css/css-color/deprecated-sameas-CanvasText-ref.html", "web-platform-tests/css/css-color/deprecated-sameas-GrayText-ref.html", "web-platform-tests/css/css-color/display-p3-004-ref.html", + "web-platform-tests/css/css-color/display-p3-linear-004-ref.html", "web-platform-tests/css/css-color/greensquare-090-ref.html", "web-platform-tests/css/css-color/greensquare-display-p3-ref.html", "web-platform-tests/css/css-color/greensquare-ref.html", @@ -3130,6 +3136,7 @@ "web-platform-tests/css/css-color/lch-006-ref.html", "web-platform-tests/css/css-color/lch-007-ref.html", "web-platform-tests/css/css-color/lch-l-over-100-ref.html", + "web-platform-tests/css/css-color/light-dark-image-none-ref.html", "web-platform-tests/css/css-color/mossgreensquare-ref.html", "web-platform-tests/css/css-color/oklab-004-ref.html", "web-platform-tests/css/css-color/oklab-005-ref.html", @@ -3161,7 +3168,6 @@ "web-platform-tests/css/css-color/t31-color-currentColor-b-ref.html", "web-platform-tests/css/css-color/t31-color-text-a-ref.xht", "web-platform-tests/css/css-color/t32-opacity-basic-0.0-a-ref.html", - "web-platform-tests/css/css-color/t32-opacity-basic-0.6-a-ref.html", "web-platform-tests/css/css-color/t32-opacity-basic-0.6-a-ref.xht", "web-platform-tests/css/css-color/t32-opacity-basic-1.0-a-ref.html", "web-platform-tests/css/css-color/t32-opacity-clamping-1.0-b-ref.html", @@ -3173,7 +3179,6 @@ "web-platform-tests/css/css-color/t41-html4-keywords-a-ref.html", "web-platform-tests/css/css-color/t421-rgb-clip-outside-gamut-b-ref.html", "web-platform-tests/css/css-color/t421-rgb-hex3-expand-b-ref.html", - "web-platform-tests/css/css-color/t421-rgb-hex3-expand-b.xht", "web-platform-tests/css/css-color/t421-rgb-values-meaning-b-ref.html", "web-platform-tests/css/css-color/t422-rgba-a0.6-a-ref.xht", "web-platform-tests/css/css-color/t422-rgba-a1.0-a-ref.html", @@ -3183,12 +3188,9 @@ "web-platform-tests/css/css-color/t422-rgba-func-int-a-ref.html", "web-platform-tests/css/css-color/t422-rgba-func-no-mixed-f-ref.html", "web-platform-tests/css/css-color/t422-rgba-func-whitespace-b-ref.html", - "web-platform-tests/css/css-color/t422-rgba-onscreen-b-ref.html", - "web-platform-tests/css/css-color/t422-rgba-onscreen-multiple-boxes-c-ref.html", "web-platform-tests/css/css-color/t422-rgba-values-meaning-b-ref.html", "web-platform-tests/css/css-color/t423-transparent-2-a-ref.html", "web-platform-tests/css/css-color/t424-hsl-basic-a-ref.html", - "web-platform-tests/css/css-color/t424-hsl-clip-outside-gamut-b-ref.html", "web-platform-tests/css/css-color/t424-hsl-h-rotating-b-ref.html", "web-platform-tests/css/css-color/t424-hsl-parsing-f-ref.html", "web-platform-tests/css/css-color/t424-hsl-values-b-1-ref.html", @@ -3206,9 +3208,7 @@ "web-platform-tests/css/css-color/t424-hsl-values-b-7-ref.html", "web-platform-tests/css/css-color/t424-hsl-values-b-8-ref.html", "web-platform-tests/css/css-color/t424-hsl-values-b-9-ref.html", - "web-platform-tests/css/css-color/t425-hsla-basic-a-ref.html", "web-platform-tests/css/css-color/t425-hsla-basic-a-ref.xht", - "web-platform-tests/css/css-color/t425-hsla-clip-outside-device-gamut-b-ref.html", "web-platform-tests/css/css-color/t425-hsla-h-rotating-b-ref.html", "web-platform-tests/css/css-color/t425-hsla-values-b-ref.html", "web-platform-tests/css/css-color/t43-svg-keywords-a-ref.html", @@ -4463,6 +4463,8 @@ "web-platform-tests/css/css-fonts/font-feature-resolution-001-ref.html", "web-platform-tests/css/css-fonts/font-feature-resolution-002-ref.html", "web-platform-tests/css/css-fonts/font-feature-settings-descriptor-01-ref.html", + "web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-ref.html", + "web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-ref.html", "web-platform-tests/css/css-fonts/font-feature-settings-tibetan-ref.html", "web-platform-tests/css/css-fonts/font-features-across-space-1-ref.html", "web-platform-tests/css/css-fonts/font-kerning-01-ref.html", @@ -4517,6 +4519,7 @@ "web-platform-tests/css/css-fonts/font-palette-ref.html", "web-platform-tests/css/css-fonts/font-palette-remove-2-ref.html", "web-platform-tests/css/css-fonts/font-palette-remove-notref.html", + "web-platform-tests/css/css-fonts/font-palette-values-relative-colors-ref.html", "web-platform-tests/css/css-fonts/font-size-adjust-001-ref.html", "web-platform-tests/css/css-fonts/font-size-adjust-002-ref.html", "web-platform-tests/css/css-fonts/font-size-adjust-003.xht", @@ -4557,6 +4560,7 @@ "web-platform-tests/css/css-fonts/font-synthesis-weight-first-letter-ref.html", "web-platform-tests/css/css-fonts/font-synthesis-weight-first-line-ref.html", "web-platform-tests/css/css-fonts/font-synthesis-weight-ref.html", + "web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-ref.html", "web-platform-tests/css/css-fonts/font-variant-01-ref.html", "web-platform-tests/css/css-fonts/font-variant-02-ref.html", "web-platform-tests/css/css-fonts/font-variant-03-ref.html", @@ -4635,6 +4639,10 @@ "web-platform-tests/css/css-fonts/font-variant-position-04-notref.html", "web-platform-tests/css/css-fonts/font-variant-position-05-notref.html", "web-platform-tests/css/css-fonts/font-variant-position-ref.html", + "web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-ref.html", + "web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-ref.html", + "web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-ref.html", + "web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-ref.html", "web-platform-tests/css/css-fonts/font-weight-bolder-001-ref.xht", "web-platform-tests/css/css-fonts/font-weight-lighter-001-ref.xht", "web-platform-tests/css/css-fonts/font-weight-normal-001-ref.xht", @@ -4648,6 +4656,7 @@ "web-platform-tests/css/css-fonts/matching/font-unicode-PUA-primary-font-notref.html", "web-platform-tests/css/css-fonts/matching/font-unicode-PUA-ref.html", "web-platform-tests/css/css-fonts/matching/font-unicode-presented-as-emoji-outline-ref.html", + "web-platform-tests/css/css-fonts/matching/font-weight-search-direction-ref.html", "web-platform-tests/css/css-fonts/matching/range-descriptor-reversed-ref.html", "web-platform-tests/css/css-fonts/matching/stretch-distance-over-weight-distance-ref.html", "web-platform-tests/css/css-fonts/matching/style-ranges-over-weight-direction-ref.html", @@ -4661,6 +4670,7 @@ "web-platform-tests/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html", "web-platform-tests/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html", "web-platform-tests/css/css-fonts/metrics-override-normal-keyword-ref.html", + "web-platform-tests/css/css-fonts/oblique-last-resort-weight-selection-ref.html", "web-platform-tests/css/css-fonts/palette-values-rule-add-2-ref.html", "web-platform-tests/css/css-fonts/palette-values-rule-add-notref.html", "web-platform-tests/css/css-fonts/palette-values-rule-delete-2-ref.html", @@ -4702,7 +4712,9 @@ "web-platform-tests/css/css-fonts/support/iframe-missing-font-face-rule.html", "web-platform-tests/css/css-fonts/support/iframe-using-ahem-as-web-font.html", "web-platform-tests/css/css-fonts/support/iframe-without-web-font.html", + "web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-ref.html", "web-platform-tests/css/css-fonts/synthetic-bold-space-width-ref.html", + "web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-ref.html", "web-platform-tests/css/css-fonts/system-ui-ar-notref.html", "web-platform-tests/css/css-fonts/system-ui-ja-notref.html", "web-platform-tests/css/css-fonts/system-ui-mixed-ref.html", @@ -4723,7 +4735,12 @@ "web-platform-tests/css/css-fonts/variations/font-weight-metrics-ref.html", "web-platform-tests/css/css-fonts/variations/slnt-backslant-variable-ref.html", "web-platform-tests/css/css-fonts/variations/slnt-variable-ref.html", + "web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-mismatch.html", + "web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-ref.html", + "web-platform-tests/css/css-fonts/variations/variable-avar2-warp-mismatch.html", + "web-platform-tests/css/css-fonts/variations/variable-avar2-warp-ref.html", "web-platform-tests/css/css-fonts/variations/variable-box-font-ref.html", + "web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-ref.html", "web-platform-tests/css/css-fonts/variations/variable-gpos-m2b-ref.html", "web-platform-tests/css/css-fonts/variations/variable-gsub-ref.html", "web-platform-tests/css/css-fonts/variations/variable-opsz-ref.html", @@ -4854,6 +4871,7 @@ "web-platform-tests/css/css-grid/abspos/positioned-grid-items-022-ref.html", "web-platform-tests/css/css-grid/abspos/positioned-grid-items-023-ref.html", "web-platform-tests/css/css-grid/abspos/positioned-grid-items-025-ref.html", + "web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-ref.html", "web-platform-tests/css/css-grid/abspos/positioned-grid-items-negative-indices-001-ref.html", "web-platform-tests/css/css-grid/abspos/positioned-grid-items-negative-indices-002-ref.html", "web-platform-tests/css/css-grid/abspos/positioned-grid-items-negative-indices-003-ref.html", @@ -4961,6 +4979,7 @@ "web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-001-ref.html", "web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-002-ref.html", "web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-003-ref.html", + "web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-ref.html", "web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-positioned-item-dynamic-change-ref.html", "web-platform-tests/css/css-grid/grid-lanes/abspos/row-grid-lanes-alignment-ref.html", "web-platform-tests/css/css-grid/grid-lanes/abspos/row-grid-lanes-intrinsic-sizing-oof-ref.html", @@ -5603,8 +5622,11 @@ "web-platform-tests/css/css-highlight-api/painting/custom-highlight-painting-vertical-writing-mode-001-ref.html", "web-platform-tests/css/css-highlight-api/painting/invalidation/css-highlight-invalidation-001-ref.html", "web-platform-tests/css/css-images/color-stop-currentcolor-ref.html", + "web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage-ref.html", "web-platform-tests/css/css-images/conic-gradient-center-ref.html", + "web-platform-tests/css/css-images/conic-gradient-color-with-sibling-index-ref.html", "web-platform-tests/css/css-images/cross-fade-basic-ref.html", + "web-platform-tests/css/css-images/cross-fade-cross-origin-orientation-ref.html", "web-platform-tests/css/css-images/cross-fade-natural-size-ref.html", "web-platform-tests/css/css-images/cross-fade-premultiplied-alpha-ref.html", "web-platform-tests/css/css-images/cross-fade-target-alpha-ref.html", @@ -5615,6 +5637,7 @@ "web-platform-tests/css/css-images/gradient-move-stops-ref.html", "web-platform-tests/css/css-images/gradient/color-scheme-dependent-color-stops-ref.html", "web-platform-tests/css/css-images/gradient/conic-gradient-001-ref.html", + "web-platform-tests/css/css-images/gradient/display-p3-linear-gradient-ref.html", "web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html", "web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html", "web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html", @@ -5681,8 +5704,12 @@ "web-platform-tests/css/css-images/gradient/xyz-gradient-ref.html", "web-platform-tests/css/css-images/gradients-with-border-ref.html", "web-platform-tests/css/css-images/gradients-with-transparent-ref.html", + "web-platform-tests/css/css-images/image-color-basic-ref.html", + "web-platform-tests/css/css-images/image-color-cross-fade-ref.html", + "web-platform-tests/css/css-images/image-color-layered-ref.html", "web-platform-tests/css/css-images/image-fit-001.xht", "web-platform-tests/css/css-images/image-fit-006.xht", + "web-platform-tests/css/css-images/image-light-dark-ref.html", "web-platform-tests/css/css-images/image-orientation/image-orientation-cursor.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-position-ref.html", @@ -5699,6 +5726,7 @@ "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html", + "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-border-image-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-canvas-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html", "web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-svg-ref.html", @@ -5709,6 +5737,7 @@ "web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-ref.html", "web-platform-tests/css/css-images/image-orientation/support/svg-with-image-rotated.svg", "web-platform-tests/css/css-images/image-rendering-border-image-notref.html", + "web-platform-tests/css/css-images/image-rendering-mixed-scaled-notref.html", "web-platform-tests/css/css-images/image-set/image-set-resolution-001-ref.html", "web-platform-tests/css/css-images/image-set/reference/image-set-conic-gradient-rendering-ref.html", "web-platform-tests/css/css-images/image-set/reference/image-set-linear-gradient-rendering-ref.html", @@ -5718,7 +5747,10 @@ "web-platform-tests/css/css-images/image-set/reference/image-set-repeating-linear-gradient-rendering-ref.html", "web-platform-tests/css/css-images/image-set/reference/image-set-repeating-radial-gradient-rendering-ref.html", "web-platform-tests/css/css-images/infinite-radial-gradient-crash-ref.html", + "web-platform-tests/css/css-images/linear-gradient-body-sibling-index-ref.html", + "web-platform-tests/css/css-images/linear-gradient-calc-em-units-ref.html", "web-platform-tests/css/css-images/linear-gradient-ref.html", + "web-platform-tests/css/css-images/linear-gradient-sibling-index-ref.html", "web-platform-tests/css/css-images/multiple-position-color-stop-conic-2-ref.html", "web-platform-tests/css/css-images/multiple-position-color-stop-linear-2-ref.html", "web-platform-tests/css/css-images/multiple-position-color-stop-radial-2-ref.html", @@ -5802,9 +5834,12 @@ "web-platform-tests/css/css-images/object-view-box-writing-mode-video-ref.html", "web-platform-tests/css/css-images/object-view-box-xywh-percentage-ref.html", "web-platform-tests/css/css-images/object-view-box-xywh-ref.html", + "web-platform-tests/css/css-images/radial-gradient-container-relative-units-ref.html", + "web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-ref.html", "web-platform-tests/css/css-images/reference/100x100-blue-green.html", "web-platform-tests/css/css-images/reference/100x100-blue.html", "web-platform-tests/css/css-images/reference/200x200-blue-black-green-red.html", + "web-platform-tests/css/css-images/reference/linear-gradient-non-square-ref.html", "web-platform-tests/css/css-images/repeating-conic-gradient-ref.html", "web-platform-tests/css/css-images/support/1x1-green.svg", "web-platform-tests/css/css-images/support/blue-green-red-yellow-50x100.svg", @@ -5815,6 +5850,10 @@ "web-platform-tests/css/css-images/support/colors-8x16-noSize.svg", "web-platform-tests/css/css-images/support/colors-8x16-parDefault.svg", "web-platform-tests/css/css-images/support/colors-8x16.svg", + "web-platform-tests/css/css-images/support/external-images.svg", + "web-platform-tests/css/css-images/support/scripted.svg", + "web-platform-tests/css/css-images/svg-images-are-ignored-ref.html", + "web-platform-tests/css/css-images/svg-script-is-ignored-ref.svg", "web-platform-tests/css/css-images/tiled-conic-gradients-ref.html", "web-platform-tests/css/css-images/tiled-gradients-ref.html", "web-platform-tests/css/css-images/tiled-radial-gradients-ref.html", @@ -5935,6 +5974,16 @@ "web-platform-tests/css/css-lists/counter-list-item-slot-order-ref.html", "web-platform-tests/css/css-lists/counter-order-display-contents-ref.html", "web-platform-tests/css/css-lists/counter-reset-increment-overflow-underflow-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-display-none-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-multiple-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-nested-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-001-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-002-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-003-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-siblings-002-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-siblings-003-ref.html", + "web-platform-tests/css/css-lists/counter-reset-reversed-with-regular-ref.html", "web-platform-tests/css/css-lists/counter-set-001-ref.html", "web-platform-tests/css/css-lists/counter-set-002-ref.html", "web-platform-tests/css/css-lists/counter-slot-order-ref.html", @@ -5949,6 +5998,7 @@ "web-platform-tests/css/css-lists/counters-scope-002-ref.html", "web-platform-tests/css/css-lists/counters-scope-003-ref.html", "web-platform-tests/css/css-lists/counters-scope-004-ref.html", + "web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-ref.html", "web-platform-tests/css/css-lists/details-open-ref.html", "web-platform-tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html", "web-platform-tests/css/css-lists/inline-block-list-marker-ref.html", @@ -5957,6 +6007,11 @@ "web-platform-tests/css/css-lists/inline-list-ref.html", "web-platform-tests/css/css-lists/inline-list-with-table-child-ref.html", "web-platform-tests/css/css-lists/li-insert-child-ref.html", + "web-platform-tests/css/css-lists/li-list-item-counter-001-ref.html", + "web-platform-tests/css/css-lists/li-list-item-counter-002-ref.html", + "web-platform-tests/css/css-lists/li-list-item-counter-003-ref.html", + "web-platform-tests/css/css-lists/li-list-item-counter-004-ref.html", + "web-platform-tests/css/css-lists/li-list-item-counter-005-ref.html", "web-platform-tests/css/css-lists/li-list-item-counter-ref.html", "web-platform-tests/css/css-lists/li-value-counter-reset-001-ref.html", "web-platform-tests/css/css-lists/li-value-counter-reset-002-ref.html", @@ -5968,18 +6023,34 @@ "web-platform-tests/css/css-lists/li-value-reversed-007-ref.html", "web-platform-tests/css/css-lists/li-value-reversed-008-ref.html", "web-platform-tests/css/css-lists/li-value-reversed-009-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-010-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-011-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-013-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-014-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-015-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-016-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-017-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-018-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-019-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-020-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-022-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-024-ref.html", + "web-platform-tests/css/css-lists/li-value-reversed-025-ref.html", "web-platform-tests/css/css-lists/li-with-height-001-ref.html", "web-platform-tests/css/css-lists/li-with-overflow-hidden-change-list-style-position-001-ref.html", "web-platform-tests/css/css-lists/list-and-block-in-inline-ref.html", "web-platform-tests/css/css-lists/list-and-flex-001-ref.html", "web-platform-tests/css/css-lists/list-and-grid-001-ref.html", "web-platform-tests/css/css-lists/list-item-definition-ref.html", + "web-platform-tests/css/css-lists/list-item-dynamic-padding-ref.html", "web-platform-tests/css/css-lists/list-marker-alignment-ref.html", "web-platform-tests/css/css-lists/list-marker-symbol-bidi-ref.html", "web-platform-tests/css/css-lists/list-marker-with-lineheight-and-overflow-hidden-001-ref.html", "web-platform-tests/css/css-lists/list-style-image-gradients-dynamic-ref.html", "web-platform-tests/css/css-lists/list-style-image-gradients-ref.html", "web-platform-tests/css/css-lists/list-style-image-zoom-dynamic-ref.html", + "web-platform-tests/css/css-lists/list-style-position-001-notref.html", + "web-platform-tests/css/css-lists/list-style-position-001-ref.html", "web-platform-tests/css/css-lists/list-style-type-armenian-002.xht", "web-platform-tests/css/css-lists/list-style-type-armenian-003.xht", "web-platform-tests/css/css-lists/list-style-type-decimal-line-height-ref.html", @@ -5994,11 +6065,14 @@ "web-platform-tests/css/css-lists/list-style-type-string-007-ref.html", "web-platform-tests/css/css-lists/list-type-none-style-image-ref.html", "web-platform-tests/css/css-lists/list-with-image-display-changed-001-ref.html", + "web-platform-tests/css/css-lists/marker-counter-ref.html", "web-platform-tests/css/css-lists/marker-dynamic-content-change-ref.html", + "web-platform-tests/css/css-lists/marker-quotes-ref.html", "web-platform-tests/css/css-lists/marker-webkit-text-fill-color-ref.html", "web-platform-tests/css/css-lists/nested-marker-ref.html", "web-platform-tests/css/css-lists/nested-marker-styling-ref.html", "web-platform-tests/css/css-lists/ol-change-display-type-ref.html", + "web-platform-tests/css/css-lists/outside-marker-covered-by-relpos-block-link-ref.html", "web-platform-tests/css/css-lists/pseudo-element-remove-update-ref.html", "web-platform-tests/css/css-logical/cascading-001-ref.html", "web-platform-tests/css/css-logical/reference/logical-values-float-clear-1-ref.html", @@ -6863,6 +6937,7 @@ "web-platform-tests/css/css-pseudo/first-letter-and-whitespace-ref.html", "web-platform-tests/css/css-pseudo/first-letter-background-image-ref.html", "web-platform-tests/css/css-pseudo/first-letter-block-to-inline-ref.html", + "web-platform-tests/css/css-pseudo/first-letter-c0.tentative-ref.html", "web-platform-tests/css/css-pseudo/first-letter-exclude-block-child-marker-ref.html", "web-platform-tests/css/css-pseudo/first-letter-exclude-inline-child-marker-ref.html", "web-platform-tests/css/css-pseudo/first-letter-exclude-inline-marker-ref.html", @@ -6878,6 +6953,7 @@ "web-platform-tests/css/css-pseudo/first-letter-skip-empty-span-nested-ref.html", "web-platform-tests/css/css-pseudo/first-letter-skip-empty-span-ref.html", "web-platform-tests/css/css-pseudo/first-letter-skip-marker-ref.html", + "web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-ref.html", "web-platform-tests/css/css-pseudo/first-letter-width-2-ref.html", "web-platform-tests/css/css-pseudo/first-letter-width-ref.html", "web-platform-tests/css/css-pseudo/first-letter-with-before-after-ref.html", @@ -7232,6 +7308,7 @@ "web-platform-tests/css/css-scrollbars/viewport-scrollbar-body-ref.html", "web-platform-tests/css/css-scrollbars/viewport-scrollbar-mis-ref.html", "web-platform-tests/css/css-scrollbars/viewport-scrollbar-ref.html", + "web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-ref.html", "web-platform-tests/css/css-shapes/shape-outside/assorted/reference/float-retry-push-ref.html", "web-platform-tests/css/css-shapes/shape-outside/assorted/reference/float-should-push-ref.html", "web-platform-tests/css/css-shapes/shape-outside/formatting-context/reference/shape-outside-formatting-context-ref.html", @@ -7291,7 +7368,6 @@ "web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-024-ref.html", "web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-025-ref.html", "web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-20.svg", - "web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.svg", "web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-70.svg", "web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle.svg", "web-platform-tests/css/css-shapes/shape-outside/shape-image/support/right-half-rectangle-70.svg", @@ -7349,6 +7425,9 @@ "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/inset/reference/shape-outside-inset-025-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/inset/reference/shape-outside-inset-026-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/inset/reference/shape-outside-inset-027-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-000-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-002-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-003-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-007-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-010-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-017-ref.html", @@ -7361,6 +7440,9 @@ "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-024-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-025-ref.html", "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/polygon/reference/shape-outside-polygon-032-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-000-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-002-ref.html", + "web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-003-ref.html", "web-platform-tests/css/css-shapes/spec-examples/reference/shape-outside-001-ref.html", "web-platform-tests/css/css-shapes/spec-examples/reference/shape-outside-004-ref.html", "web-platform-tests/css/css-shapes/spec-examples/reference/shape-outside-006-ref.html", @@ -7368,6 +7450,9 @@ "web-platform-tests/css/css-shapes/spec-examples/reference/shape-outside-008-ref.html", "web-platform-tests/css/css-shapes/spec-examples/support/rounded-triangle.svg", "web-platform-tests/css/css-shapes/test-plan/index.html", + "web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-ref.html", + "web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-ref.html", + "web-platform-tests/css/css-sizing/aspect-ratio-percentage-height-ref.html", "web-platform-tests/css/css-sizing/aspect-ratio/fieldset-element-001-ref.html", "web-platform-tests/css/css-sizing/aspect-ratio/fieldset-element-002-ref.html", "web-platform-tests/css/css-sizing/aspect-ratio/floats-aspect-ratio-001-ref.html", @@ -7441,10 +7526,14 @@ "web-platform-tests/css/css-sizing/image-min-max-content-intrinsic-size-change-001-ref.html", "web-platform-tests/css/css-sizing/image-min-max-content-intrinsic-size-change-003-ref.html", "web-platform-tests/css/css-sizing/inline-intrinsic-size-calc-ref.html", + "web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-ref.html", + "web-platform-tests/css/css-sizing/intrinsic-height-abspos-stretch-percentage-child-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-001-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-002-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-004-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-005-ref.html", + "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-007-ref.html", + "web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-008-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-replaced-009-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-replaced-010-ref.html", "web-platform-tests/css/css-sizing/intrinsic-percent-replaced-011-ref.html", @@ -7456,14 +7545,24 @@ "web-platform-tests/css/css-sizing/range-percent-intrinsic-size-1-ref.html", "web-platform-tests/css/css-sizing/range-percent-intrinsic-size-2-ref.html", "web-platform-tests/css/css-sizing/range-percent-intrinsic-size-2a-ref.html", + "web-platform-tests/css/css-sizing/replaced-element-intrinsic-sizing-keywords-ref.html", + "web-platform-tests/css/css-sizing/replaced-max-width-with-height-fit-content-ref.html", + "web-platform-tests/css/css-sizing/replaced-max-width-with-height-max-content-ref.html", + "web-platform-tests/css/css-sizing/replaced-max-width-with-height-min-content-ref.html", "web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-ref.html", "web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-unsized-ref.html", "web-platform-tests/css/css-sizing/slice-intrinsic-size-ref.html", "web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size-bidi-ref.html", "web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size-ref.html", "web-platform-tests/css/css-sizing/stretch/block-height-003-ref.html", + "web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-ref.html", + "web-platform-tests/css/css-sizing/stretch/stretch-float-ref.html", + "web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-ref.html", "web-platform-tests/css/css-sizing/stretch/stretch-quirk-001-ref.html", + "web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-ref.html", "web-platform-tests/css/css-sizing/support/dynamic-available-size-iframe.html", + "web-platform-tests/css/css-sizing/support/ratio-2-1.svg", + "web-platform-tests/css/css-sizing/support/ratio-3-1.svg", "web-platform-tests/css/css-sizing/svg-intrinsic-size-005-ref.html", "web-platform-tests/css/css-sizing/svg-intrinsic-size-006-ref.html", "web-platform-tests/css/css-sizing/table-child-percentage-height-with-border-box-ref.html", @@ -7562,6 +7661,32 @@ "web-platform-tests/css/css-text-decor/reference/text-decoration-decorating-box-001-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-dotted-001-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-dotted-002-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-001-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-002-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-003-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-004-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-005-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-006-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-007-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-008-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-009-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-010-notref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-011-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-012-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-013-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-014-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-015-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-016-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-017-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-018-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-019-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-020-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-021-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-022-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-023-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-024-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-025-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-inset-orthogonal-block-001-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-line-010-ref.xht", "web-platform-tests/css/css-text-decor/reference/text-decoration-line-011-ref.xht", "web-platform-tests/css/css-text-decor/reference/text-decoration-line-012-ref.xht", @@ -7594,6 +7719,12 @@ "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-ink-vertical-002-notref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-001-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-002-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-003-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-004-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-005-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-007-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-008-ref.html", + "web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-009-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-style-multiple-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-style-recalc-ref.html", "web-platform-tests/css/css-text-decor/reference/text-decoration-subelements-001-notref.html", @@ -8322,6 +8453,27 @@ "web-platform-tests/css/css-text/text-encoding/reference/shaping-no-join-001-ref.html", "web-platform-tests/css/css-text/text-encoding/reference/shaping-tatweel-001-ref.html", "web-platform-tests/css/css-text/text-encoding/reference/shaping-tatweel-002-ref.html", + "web-platform-tests/css/css-text/text-fit/background-image-ref.html", + "web-platform-tests/css/css-text/text-fit/columns-consistent-ref.html", + "web-platform-tests/css/css-text/text-fit/consistent-blank-line-ref.html", + "web-platform-tests/css/css-text/text-fit/grow-consistent-ref.html", + "web-platform-tests/css/css-text/text-fit/grow-dynamic-ref.html", + "web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-ref.html", + "web-platform-tests/css/css-text/text-fit/grow-per-line-all-ref.html", + "web-platform-tests/css/css-text/text-fit/grow-per-line-ref.html", + "web-platform-tests/css/css-text/text-fit/selection-highlight-painting-ref.html", + "web-platform-tests/css/css-text/text-fit/shrink-consistent-ref.html", + "web-platform-tests/css/css-text/text-fit/shrink-dynamic-ref.html", + "web-platform-tests/css/css-text/text-fit/shrink-per-line-all-ref.html", + "web-platform-tests/css/css-text/text-fit/spacing-ref.html", + "web-platform-tests/css/css-text/text-fit/text-align-ref.html", + "web-platform-tests/css/css-text/text-fit/text-box-ref.html", + "web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-ref.html", + "web-platform-tests/css/css-text/text-fit/text-decoration-thickness-ref.html", + "web-platform-tests/css/css-text/text-fit/text-emphasis-ref.html", + "web-platform-tests/css/css-text/text-fit/text-underline-offset-ref.html", + "web-platform-tests/css/css-text/text-fit/vertical-align-ref.html", + "web-platform-tests/css/css-text/text-fit/writing-mode-ref.html", "web-platform-tests/css/css-text/text-group-align/text-group-align-center-ref.html", "web-platform-tests/css/css-text/text-group-align/text-group-align-center-vlr-ref.html", "web-platform-tests/css/css-text/text-group-align/text-group-align-end-ref.html", @@ -8581,6 +8733,8 @@ "web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-003-ref.html", "web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-004-ref.html", "web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-022-ref.html", + "web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-024-ref.html", + "web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-025-ref.html", "web-platform-tests/css/css-text/white-space/reference/white-space-letter-spacing-001-ref.html", "web-platform-tests/css/css-text/white-space/reference/white-space-normal-011-ref.html", "web-platform-tests/css/css-text/white-space/reference/white-space-nowrap-011-ref.html", @@ -8738,9 +8892,13 @@ "web-platform-tests/css/css-transforms/animation/canvas-webgl-translate-in-animation-ref.html", "web-platform-tests/css/css-transforms/animation/rotate-animation-on-svg-ref.html", "web-platform-tests/css/css-transforms/animation/rotate-animation-with-will-change-transform-001-ref.html", + "web-platform-tests/css/css-transforms/animation/rotate-explicit-and-implicit-keyframes-ref.html", "web-platform-tests/css/css-transforms/animation/rotate-transform-equivalent-ref.html", "web-platform-tests/css/css-transforms/animation/scale-and-rotate-both-specified-on-animation-keyframes-ref.html", "web-platform-tests/css/css-transforms/animation/scale-animation-on-svg-ref.html", + "web-platform-tests/css/css-transforms/animation/scale-explicit-and-implicit-keyframes-ref.html", + "web-platform-tests/css/css-transforms/animation/singular-scale-nested-ref.html", + "web-platform-tests/css/css-transforms/animation/transform-additive-animation-ref.html", "web-platform-tests/css/css-transforms/animation/transform-box-ref.html", "web-platform-tests/css/css-transforms/animation/transform-interpolation-animated-ref.html", "web-platform-tests/css/css-transforms/animation/transform-interpolation-ref.html", @@ -8748,6 +8906,7 @@ "web-platform-tests/css/css-transforms/animation/transform-percent-with-width-and-height-ref.html", "web-platform-tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate-ref.html", "web-platform-tests/css/css-transforms/animation/translate-animation-on-svg-ref.html", + "web-platform-tests/css/css-transforms/animation/translate-explicit-and-implicit-keyframes-ref.html", "web-platform-tests/css/css-transforms/animation/translate-percent-with-width-and-height-ref.html", "web-platform-tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate-ref.html", "web-platform-tests/css/css-transforms/backface-visibility-001.ref.html", @@ -9492,6 +9651,7 @@ "web-platform-tests/css/css-values/support/mixed-units-12.html", "web-platform-tests/css/css-values/support/vh-support-transform-origin-iframe.html", "web-platform-tests/css/css-values/support/vh-support-transform-translate-iframe.html", + "web-platform-tests/css/css-values/svg-attr-case-sensitivity-ref.html", "web-platform-tests/css/css-values/vh-update-and-transition-in-subframe-iframe.html", "web-platform-tests/css/css-values/viewport-page-print.html", "web-platform-tests/css/css-values/viewport-units-001-print-ref.html", @@ -9531,6 +9691,7 @@ "web-platform-tests/css/css-view-transitions/auto-name-ref.html", "web-platform-tests/css/css-view-transitions/backdrop-filter-animated-ref.html", "web-platform-tests/css/css-view-transitions/backdrop-filter-captured-ref.html", + "web-platform-tests/css/css-view-transitions/backdrop-filter-while-promise-pending-ref.html", "web-platform-tests/css/css-view-transitions/block-with-overflowing-text-ref.html", "web-platform-tests/css/css-view-transitions/break-inside-avoid-child-ref.html", "web-platform-tests/css/css-view-transitions/capture-with-offscreen-child-ref.html", @@ -9563,6 +9724,7 @@ "web-platform-tests/css/css-view-transitions/element-stops-grouping-after-animation-ref.html", "web-platform-tests/css/css-view-transitions/element-with-overflow-ref.html", "web-platform-tests/css/css-view-transitions/empty-render-target-capture-ref.html", + "web-platform-tests/css/css-view-transitions/escaped-name-ref.html", "web-platform-tests/css/css-view-transitions/exit-transition-with-anonymous-layout-object-ref.html", "web-platform-tests/css/css-view-transitions/far-away-capture-ref.html", "web-platform-tests/css/css-view-transitions/fractional-box-ref.html", @@ -9574,6 +9736,7 @@ "web-platform-tests/css/css-view-transitions/fragmented-during-transition-skips-ref.html", "web-platform-tests/css/css-view-transitions/hit-test-unpainted-element-ref.html", "web-platform-tests/css/css-view-transitions/hit-test-unrelated-element-ref.html", + "web-platform-tests/css/css-view-transitions/html-becomes-fixed-ref.html", "web-platform-tests/css/css-view-transitions/iframe-and-main-frame-transition-new-main-new-iframe-ref.html", "web-platform-tests/css/css-view-transitions/iframe-and-main-frame-transition-new-main-old-iframe-ref.html", "web-platform-tests/css/css-view-transitions/iframe-and-main-frame-transition-old-main-new-iframe-ref.html", @@ -9605,26 +9768,10 @@ "web-platform-tests/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations-ref.html", "web-platform-tests/css/css-view-transitions/named-element-with-fix-pos-child-ref.html", "web-platform-tests/css/css-view-transitions/names-are-tree-scoped-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/at-rule-opt-in-auto-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/at-rule-opt-in-none-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/auto-name-from-id-ref.html", "web-platform-tests/css/css-view-transitions/navigation/chromium-paint-holding-timeout-ref.html", "web-platform-tests/css/css-view-transitions/navigation/custom-scrollbar-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/navigation-auto-excludes-reload-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/no-view-transition-with-cross-origin-redirect-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/opt-in-removed-during-transition-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/pagereveal-finished-promise-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/pagereveal-ready-promise-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/pagereveal-setup-transition-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/pageswap-fired-before-old-state-capture-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/prerender-removed-during-navigation-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/root-and-nested-element-transition-ref.html", "web-platform-tests/css/css-view-transitions/navigation/root-element-transition-iframe-ref.html", "web-platform-tests/css/css-view-transitions/navigation/root-element-transition-iframe-with-startVT-on-main-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/root-element-transition-no-opt-in-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/root-element-transition-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/transition-to-prerender-ref.html", - "web-platform-tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html", "web-platform-tests/css/css-view-transitions/nested-elements-in-overflow-ref.html", "web-platform-tests/css/css-view-transitions/nested/green-rect-ref.html", "web-platform-tests/css/css-view-transitions/nested/group-children-sizing-ref.html", @@ -9701,11 +9848,32 @@ "web-platform-tests/css/css-view-transitions/root-to-shared-animation-start-ref.html", "web-platform-tests/css/css-view-transitions/rotated-cat-off-top-edge-ref.html", "web-platform-tests/css/css-view-transitions/rtl-with-scrollbar-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/ancestor-display-change-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/auto-nesting-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html", "web-platform-tests/css/css-view-transitions/scoped/content-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html", "web-platform-tests/css/css-view-transitions/scoped/empty-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-ref.html", "web-platform-tests/css/css-view-transitions/scoped/from-scale-zero-ref.html", "web-platform-tests/css/css-view-transitions/scoped/implicit-contain-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-ref.html", "web-platform-tests/css/css-view-transitions/scoped/nested-scope-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/paint-order-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/pause-rendering-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/shadow-dom-ref.html", + "web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-ref.html", "web-platform-tests/css/css-view-transitions/scoped/transform-clip-ref.html", "web-platform-tests/css/css-view-transitions/scroller-child-abspos-ref.html", "web-platform-tests/css/css-view-transitions/scroller-child-ref.html", @@ -9725,6 +9893,8 @@ "web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html", "web-platform-tests/css/css-view-transitions/span-with-overflowing-text-hidden-ref.html", "web-platform-tests/css/css-view-transitions/span-with-overflowing-text-ref.html", + "web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe-ref.html", + "web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe.html", "web-platform-tests/css/css-view-transitions/support/dialog-in-rtl-iframe-child.html", "web-platform-tests/css/css-view-transitions/support/frame-helper.html", "web-platform-tests/css/css-view-transitions/support/iframe-scrollbar-child.html", @@ -9741,6 +9911,7 @@ "web-platform-tests/css/css-view-transitions/view-transition-types-matches-ref.html", "web-platform-tests/css/css-view-transitions/view-transition-types-one-green-square-ref.html", "web-platform-tests/css/css-view-transitions/view-transition-types-reserved-ref.html", + "web-platform-tests/css/css-view-transitions/view-transition-waituntil-animation-manipulation-ref.html", "web-platform-tests/css/css-view-transitions/web-animations-api-ref.html", "web-platform-tests/css/css-view-transitions/writing-mode-container-resize-ref.html", "web-platform-tests/css/css-viewport/width-ref.html", @@ -10359,6 +10530,7 @@ "web-platform-tests/css/cssom/insertRule-from-script-ref.html", "web-platform-tests/css/cssom/medialist-dynamic-001-ref.html", "web-platform-tests/css/cssom/selectorText-modification-restyle-001-ref.html", + "web-platform-tests/css/cssom/style-attr-clone-ref.html", "web-platform-tests/css/cssom/stylesheet-replacedata-dynamic-ref.html", "web-platform-tests/css/cssom/support/xmlss-pi.xhtml", "web-platform-tests/css/filter-effects/backdrop-filter-backdrop-root-animation-in-effect-ref.html", @@ -12544,6 +12716,7 @@ "web-platform-tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html", "web-platform-tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html", "web-platform-tests/html/infrastructure/common-microsyntaxes/colours/parsing-legacy-colour-value-ascii-case-insensitive-ref.html", + "web-platform-tests/html/interaction/focus/anchor-element-focus-ring-ref.html", "web-platform-tests/html/interaction/focus/document-level-focus-apis/support/popup.html", "web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html", "web-platform-tests/html/interaction/focus/processing-model/support/preventScroll-helper.html", @@ -12606,12 +12779,20 @@ "web-platform-tests/html/rendering/non-replaced-elements/tables/table-width-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/tables/tr-transform-and-will-change-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/tables/transformed-tbody-tr-collapsed-border-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-br-element/br-clear-presentational-hints-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/absolute-fixed-in-legend-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/empty-scrollable-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-baseline-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-radius-with-alpha-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-containing-block-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-column-rule-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-gap-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-rule-break-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-rule-inset-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-rule-overlap-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-rule-ref.html", + "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-box-rule-visibility-items-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-rtl-ref.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-div-display-contents.html", "web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-dynamic-baseline-ref.html", @@ -12664,7 +12845,10 @@ "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-dim-ref.html", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img_border-ref.xhtml", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-align-right-ref.html", + "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-border-radius-notref.html", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-image-inline-alt-ref.html", + "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-min-bsize-centered-ref.html", + "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-text-indent-ref.html", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-type-change-from-image-1-ref.html", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/number-placeholder-right-aligned-ref.html", "web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/object_border-ref.xhtml", @@ -12696,6 +12880,7 @@ "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-block-size-001-ref-2.html", "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-block-size-ref.html", "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-line-height-ref.html", + "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-ref.html", "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-button-min-height-001-ref.html", "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-display-inline-ref.html", "web-platform-tests/html/rendering/replaced-elements/the-select-element/select-empty-ref.html", @@ -12772,6 +12957,7 @@ "web-platform-tests/html/rendering/widgets/the-select-element/option-checked-styling-ref.html", "web-platform-tests/html/rendering/widgets/the-select-element/option-label-ref.html", "web-platform-tests/html/rendering/widgets/the-select-element/select-invalidation-ref.html", + "web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-ref.html", "web-platform-tests/html/rendering/widgets/the-select-element/select-size-ref.html", "web-platform-tests/html/select/select-capitalize-sizing-ref.html", "web-platform-tests/html/semantics/document-metadata/the-base-element/example.html", @@ -13720,10 +13906,18 @@ "web-platform-tests/svg/linking/reftests/href-textPath-element-ref.html", "web-platform-tests/svg/linking/reftests/href-use-element-ref.html", "web-platform-tests/svg/linking/reftests/reference/green-100x100.svg", + "web-platform-tests/svg/linking/reftests/reference/green-red-200x200.html", + "web-platform-tests/svg/linking/reftests/support/green-100x100.svg", "web-platform-tests/svg/linking/reftests/support/green-random-rects.svg", + "web-platform-tests/svg/linking/reftests/support/green-red-200x200.svg", + "web-platform-tests/svg/linking/reftests/support/red-green-200x100.svg", + "web-platform-tests/svg/linking/reftests/support/red-green-200x200.svg", + "web-platform-tests/svg/linking/reftests/support/red-green-viewbox-only.svg", + "web-platform-tests/svg/linking/reftests/support/red-green-viewbox-width.svg", "web-platform-tests/svg/linking/reftests/use-descendant-combinator-ref.html", "web-platform-tests/svg/linking/reftests/use-keyframes-ref.html", "web-platform-tests/svg/linking/reftests/use-template-ref.html", + "web-platform-tests/svg/painting/animated-dashoffset-odd-dasharray-ref.html", "web-platform-tests/svg/painting/currentColor-override-pserver-fallback-ref.svg", "web-platform-tests/svg/painting/currentColor-override-pserver-fill-ref.svg", "web-platform-tests/svg/painting/currentColor-override-pserver-stroke-ref.svg", @@ -13739,6 +13933,7 @@ "web-platform-tests/svg/painting/marker-008-ref.svg", "web-platform-tests/svg/painting/marker-009-ref.svg", "web-platform-tests/svg/painting/marker-orient-001-ref.svg", + "web-platform-tests/svg/painting/negative-dashoffset-odd-dasharray-ref.html", "web-platform-tests/svg/painting/reftests/display-none-mask-ref.html", "web-platform-tests/svg/painting/reftests/green-100x100.svg", "web-platform-tests/svg/painting/reftests/large-transform-ref.html", @@ -13866,6 +14061,7 @@ "web-platform-tests/svg/struct/reftests/support/sprites-target.svg", "web-platform-tests/svg/struct/reftests/support/sprites-without-id.svg", "web-platform-tests/svg/struct/reftests/support/sprites.svg", + "web-platform-tests/svg/struct/reftests/support/symbol-with-external-reference.svg", "web-platform-tests/svg/struct/reftests/sync-svg-attributes-ref.svg", "web-platform-tests/svg/struct/reftests/use-event-handler-no-loss-of-events-ref.html", "web-platform-tests/svg/struct/scripted/support/blank.svg", @@ -13894,6 +14090,20 @@ "web-platform-tests/svg/styling/stroke-color-inherit-link-visited-ref.svg", "web-platform-tests/svg/styling/support/circle-padding-right.svg", "web-platform-tests/svg/styling/support/circle.svg", + "web-platform-tests/svg/styling/support/svg-filter-render-cross-origin-iframe.sub.html", + "web-platform-tests/svg/styling/support/svg-filter-render-iframe.html", + "web-platform-tests/svg/styling/support/svg-filter-render-same-origin-iframe.sub.html", + "web-platform-tests/svg/styling/svg-filter-render-cross-origin-frame-in-cross-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-cross-origin-frame-in-same-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-cross-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-cross-origin-navigation-in-srcdoc-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-same-origin-frame-in-cross-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-same-origin-frame-in-same-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-same-origin-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-same-origin-frame-reload-as-sandbox-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-sandbox-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-srcdoc-frame-ref.tentative.html", + "web-platform-tests/svg/styling/svg-filter-render-web-plugin-ref.tentative.html", "web-platform-tests/svg/styling/use-element-selector-ref.html", "web-platform-tests/svg/styling/use-element-transitions-ref.html", "web-platform-tests/svg/text/reftests/dominant-baseline-central-large-font-size-ref.svg", @@ -13935,7 +14145,6 @@ "web-platform-tests/svg/text/reftests/text-transform-002-ref.html", "web-platform-tests/svg/text/reftests/text-xml-space-001-ref.svg", "web-platform-tests/svg/text/reftests/textpath-letter-spacing-01-ref.svg", - "web-platform-tests/svg/text/reftests/textpath-path-attr-empty-ref.tentative.svg", "web-platform-tests/svg/text/reftests/textpath-path-attr-ref.svg", "web-platform-tests/svg/text/reftests/textpath-pathlength-css-display-none-ref.tentative.svg", "web-platform-tests/svg/text/reftests/textpath-shape-001-ref.svg", diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/esc-key/synthetic-keyboard-event.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/esc-key/synthetic-keyboard-event.html index 37b5507ac4af..86962deb9f0a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/esc-key/synthetic-keyboard-event.html +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/esc-key/synthetic-keyboard-event.html @@ -13,15 +13,15 @@ let watcher = createRecordingCloseWatcher(t, events); let keydown = new KeyboardEvent("keydown", {key: "Escape", keyCode: 27}); - window.dispatchEvent(keydown); + document.body.dispatchEvent(keydown); let keyup = new KeyboardEvent("keyup", {key: "Escape", keyCode: 27}); - window.dispatchEvent(keyup); + document.body.dispatchEvent(keyup); assert_array_equals(events, []); let keyup2 = document.createEvent("Event"); keyup2.initEvent("keyup", true); - window.dispatchEvent(keyup2); + document.body.dispatchEvent(keyup2); assert_array_equals(events, []); }, "close via synthesized Esc key must not work"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners-expected.txt index a52199c44971..e37cfb46e900 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners-expected.txt @@ -1,8 +1,14 @@ PASS destroy() inside oncancel +PASS destroy() inside oncancel with preventDefault() PASS destroy() inside onclose +PASS destroy() inside onclose with preventDefault() PASS close() inside oncancel +PASS close() inside oncancel with preventDefault() PASS close() inside onclose +PASS close() inside onclose with preventDefault() PASS requestClose() inside oncancel +PASS requestClose() inside oncancel with preventDefault() PASS requestClose() inside onclose +PASS requestClose() inside onclose with preventDefault() diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners.html index 93996fb5fee3..e6282d97332c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners.html +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/inside-event-listeners.html @@ -1,28 +1,36 @@ - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate-preventDefault_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate-preventDefault_dialog-expected.txt index 7b4f699121c0..fb4e0ff15a47 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate-preventDefault_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate-preventDefault_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation that preventDefault()s cancel; send user activation assert_array_equals: lengths differ, expected array ["cancel[cancelable=true]", "cancel[cancelable=false]", "close"] length 3, got ["cancel[cancelable=true]", "cancel[cancelable=true]"] length 2 +PASS Create a close watcher without user activation that preventDefault()s cancel; send user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate_dialog-expected.txt index 2e5a93116b7c..9099a12db2ad 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-activate_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; send user activation assert_array_equals: lengths differ, expected array ["cancel[cancelable=true]", "close"] length 2, got ["cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation; send user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-closerequest-n_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-closerequest-n_dialog-expected.txt index 47c939f45dd7..701766d4470e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-closerequest-n_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-closerequest-n_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; send a close request; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher1 cancel[cancelable=false]", "watcher1 close"] length 2, got ["watcher1 cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation; send a close request; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-destroy-n_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-destroy-n_dialog-expected.txt index ce68fd130472..e45c315dab70 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-destroy-n_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n-destroy-n_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; destroy the close watcher; create a close watcher without user activation assert_array_equals: expected property 0 to be "watcher2 cancel[cancelable=false]" but got "watcher2 cancel[cancelable=true]" (expected array ["watcher2 cancel[cancelable=false]", "watcher2 close"] got ["watcher2 cancel[cancelable=true]", "watcher2 close"]) +PASS Create a close watcher without user activation; destroy the close watcher; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n_dialog-expected.txt index c4543920255b..5ed581ec3c8b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/n_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation assert_array_equals: lengths differ, expected array ["cancel[cancelable=false]", "close"] length 2, got ["cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-activate-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-activate-dialog-expected.txt index c333361efd38..587d23318880 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-activate-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-activate-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create two dialogs without user activation; send user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=true]", "watcher1 cancel[cancelable=true]", "watcher2 close", "watcher1 close"] length 4, got ["watcher2 cancel[cancelable=true]"] length 1 +PASS Create two dialogs without user activation; send user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-dialog-expected.txt index c4716a803e6f..aea2ec0ce8ad 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nn-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create two close watchers without user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=false]", "watcher1 cancel[cancelable=false]", "watcher2 close", "watcher1 close"] length 4, got ["watcher2 cancel[cancelable=true]", "watcher2 close"] length 2 +PASS Create two close watchers without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover-expected.txt index c629ed06143d..22bd12889a77 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover-expected.txt @@ -1,4 +1,4 @@ button -FAIL Create a CloseWatcher without user activation; create a dialog without user activation; create a popover without user activation assert_array_equals: lengths differ, expected array ["dialog cancel[cancelable=false]", "CloseWatcher cancel[cancelable=false]", "CloseWatcher close", "dialog close"] length 4, got ["CloseWatcher cancel[cancelable=false]", "CloseWatcher close", "dialog cancel[cancelable=true]"] length 3 +PASS Create a CloseWatcher without user activation; create a dialog without user activation; create a popover without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-dialog-expected.txt index 02a2afe5dd5d..a46dd984ccf9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create three close watchers without user activation assert_array_equals: lengths differ, expected array ["watcher3 cancel[cancelable=false]", "watcher2 cancel[cancelable=false]", "watcher1 cancel[cancelable=false]", "watcher3 close", "watcher2 close", "watcher1 close"] length 6, got ["watcher3 cancel[cancelable=true]"] length 1 +PASS Create three close watchers without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-popovers-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-popovers-expected.txt index aab01bbabb2e..f2c55724bef8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-popovers-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nnn-popovers-expected.txt @@ -1,4 +1,4 @@ -b0 b1 b2 +b0 -FAIL Create three popovers without user activation assert_false: p1 should be closed. expected false got true +PASS Create three popovers without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny-activate-preventDefault_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny-activate-preventDefault_dialog-expected.txt index 42b4cacfcef4..1cc573d58fff 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny-activate-preventDefault_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny-activate-preventDefault_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create a close watcher with user activation that preventDefault()s cancel; send user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=true]", "watcher2 cancel[cancelable=false]", "watcher2 close"] length 3, got ["watcher2 cancel[cancelable=true]", "watcher2 cancel[cancelable=true]"] length 2 +PASS Create a close watcher without user activation; create a close watcher with user activation that preventDefault()s cancel; send user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny_dialog-expected.txt index 6ab43d575fcd..dd7a33e1d54e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ny_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create a close watcher with user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=false]", "watcher2 close"] length 2, got ["watcher2 cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation; create a close watcher with user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn-popovers-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn-popovers-expected.txt index 36d366029519..77b316be8750 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn-popovers-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn-popovers-expected.txt @@ -1,4 +1,4 @@ -b0 b1 b2 +b0 -FAIL Create a popover without user activation; create a popover with user activation; create a popover without user activation assert_false: first escape: p2 should be closed. expected false got true +PASS Create a popover without user activation; create a popover with user activation; create a popover without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn_dialog-expected.txt index d9608d5b2c36..ab862d090be3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyn_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create a close watcher with user activation; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher3 cancel[cancelable=false]", "watcher3 close", "watcher2 cancel[cancelable=false]", "watcher2 close"] length 4, got ["watcher3 cancel[cancelable=false]", "watcher3 close", "watcher2 cancel[cancelable=true]"] length 3 +PASS Create a close watcher without user activation; create a close watcher with user activation; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nynn_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nynn_dialog-expected.txt index 4200f556c511..5342187fbb59 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nynn_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nynn_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create a close watcher with user activation; create two close watchers without user activation assert_array_equals: lengths differ, expected array ["watcher4 cancel[cancelable=false]", "watcher4 close", "watcher3 cancel[cancelable=false]", "watcher3 close", "watcher2 cancel[cancelable=false]", "watcher2 close"] length 6, got ["watcher4 cancel[cancelable=false]", "watcher4 close", "watcher3 cancel[cancelable=false]", "watcher3 close", "watcher2 cancel[cancelable=true]"] length 5 +PASS Create a close watcher without user activation; create a close watcher with user activation; create two close watchers without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyn-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyn-dialog-expected.txt index e0a21d31e1fb..72d554362238 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyn-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyn-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create two close watchers with user activation; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher4 cancel[cancelable=false]", "watcher3 cancel[cancelable=false]", "watcher4 close", "watcher3 close"] length 4, got ["watcher4 cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation; create two close watchers with user activation; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyyn-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyyn-dialog-expected.txt index 652719b6cdda..61dd4128030e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyyn-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/nyyyn-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher without user activation; create three close watchers with user activation; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher5 cancel[cancelable=false]", "watcher4 cancel[cancelable=false]", "watcher5 close", "watcher4 close"] length 4, got ["watcher5 cancel[cancelable=true]"] length 1 +PASS Create a close watcher without user activation; create three close watchers with user activation; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/y_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/y_dialog-expected.txt index ca6ec8900098..a9681c35aa9b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/y_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/y_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher with user activation assert_array_equals: lengths differ, expected array ["cancel[cancelable=true]", "close"] length 2, got ["cancel[cancelable=true]"] length 1 +PASS Create a close watcher with user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn-activate_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn-activate_dialog-expected.txt index 599f033dbf85..fa8b8cd86799 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn-activate_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn-activate_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher with user activation; create a close watcher without user activation; send user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=true]", "watcher2 close"] length 2, got ["watcher2 cancel[cancelable=true]"] length 1 +PASS Create a close watcher with user activation; create a close watcher without user activation; send user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn_dialog-expected.txt index 4a389de1ece7..008b2ec92a2d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yn_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher with user activation; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=false]", "watcher2 close"] length 2, got ["watcher2 cancel[cancelable=true]"] length 1 +PASS Create a close watcher with user activation; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ynn-dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ynn-dialog-expected.txt index 42451e7f9c4c..9427d490c3cf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ynn-dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/ynn-dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create a close watcher with user activation; create two close watchers without user activation assert_array_equals: lengths differ, expected array ["watcher3 cancel[cancelable=false]", "watcher2 cancel[cancelable=false]", "watcher3 close", "watcher2 close"] length 4, got ["watcher3 cancel[cancelable=true]"] length 1 +PASS Create a close watcher with user activation; create two close watchers without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yy_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yy_dialog-expected.txt index f05677e1ee99..2cb26ee47516 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yy_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yy_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create two close watchers with user activation assert_array_equals: lengths differ, expected array ["watcher2 cancel[cancelable=true]", "watcher2 close"] length 2, got ["watcher2 cancel[cancelable=true]"] length 1 +PASS Create two close watchers with user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyn_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyn_dialog-expected.txt index 987dec0b8066..f640594fe976 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyn_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyn_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create two close watchers with user activation; create a close watcher without user activation assert_array_equals: lengths differ, expected array ["watcher3 cancel[cancelable=false]", "watcher3 close"] length 2, got ["watcher3 cancel[cancelable=true]"] length 1 +PASS Create two close watchers with user activation; create a close watcher without user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover-expected.txt index c10eab58c870..a9ab4bee3fe8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover-expected.txt @@ -1,4 +1,4 @@ button -FAIL Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation assert_true: First close request: The dialog should be open. expected true got false +PASS Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover-expected.txt index 67444e183a54..9c0126a9f5e9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover-expected.txt @@ -1,4 +1,4 @@ button -FAIL Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation; sending user activation before each close request assert_true: First close request: The dialog should be open. expected true got false +PASS Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation; sending user activation before each close request diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy_dialog-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy_dialog-expected.txt index 35670d7aa637..51db054447a7 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy_dialog-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/user-activation/yyy_dialog-expected.txt @@ -1,3 +1,3 @@ -FAIL Create three close watchers with user activation assert_array_equals: lengths differ, expected array ["watcher3 cancel[cancelable=true]", "watcher3 close"] length 2, got ["watcher3 cancel[cancelable=true]"] length 1 +PASS Create three close watchers with user activation diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any-expected.txt new file mode 100644 index 000000000000..8744f0125b06 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any-expected.txt @@ -0,0 +1,4 @@ + +PASS WebAssembly.compileStreaming() is blocked +PASS WebAssembly.instantiateStreaming() is blocked + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/origin/api/origin-from-htmlhyperlinkelementutils.window.html b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/html/browsers/origin/api/origin-from-htmlhyperlinkelementutils.window.html rename to LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js new file mode 100644 index 000000000000..216f9929bd82 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js @@ -0,0 +1,17 @@ +// META: global=window,worker + +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.compileStreaming(response)); +}, "WebAssembly.compileStreaming() is blocked"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.instantiateStreaming(response)); +}, "WebAssembly.instantiateStreaming() is blocked"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js.headers b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js.headers new file mode 100644 index 000000000000..cde18a0f0899 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.js.headers @@ -0,0 +1 @@ +Content-Security-Policy: default-src 'self' 'unsafe-inline' diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker-expected.txt new file mode 100644 index 000000000000..8744f0125b06 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker-expected.txt @@ -0,0 +1,4 @@ + +PASS WebAssembly.compileStreaming() is blocked +PASS WebAssembly.instantiateStreaming() is blocked + diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm-streaming.any.worker.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any-expected.txt index 7edaa94fdb3f..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any-expected.txt @@ -1,3 +1,5 @@ -PASS default-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.js index 15e9d87ce9e0..673b5189f120 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.js @@ -1,8 +1,21 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.instantiate(bytes)); +}, "WebAssembly.instantiate() is blocked"); + promise_test(t => { return promise_rejects_js( t, WebAssembly.CompileError, - WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]))); -}); + WebAssembly.compile(bytes)); +}, "WebAssembly.compile() is blocked"); + +test(() => { + assert_throws_js( + WebAssembly.CompileError, + () => new WebAssembly.Module(bytes)); +}, "new WebAssembly.Module() is blocked"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.serviceworker-expected.txt index 7edaa94fdb3f..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.serviceworker-expected.txt @@ -1,3 +1,5 @@ -PASS default-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.sharedworker-expected.txt index 7edaa94fdb3f..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.sharedworker-expected.txt @@ -1,3 +1,5 @@ -PASS default-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.worker-expected.txt index 7edaa94fdb3f..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-blocks-wasm.any.worker-expected.txt @@ -1,3 +1,5 @@ -PASS default-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any-expected.txt index f4e6f84e8dd0..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.js index 68a145caae1d..7167b71b6e2c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.js @@ -1,6 +1,25 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return WebAssembly.instantiate(bytes); +}, "WebAssembly.instantiate() is allowed"); + +promise_test(t => { + return WebAssembly.compile(bytes); +}, "WebAssembly.compile() is allowed"); + +test(() => { + new WebAssembly.Module(bytes); +}, "new WebAssembly.Module() is allowed"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.compileStreaming(response); +}, "WebAssembly.compileStreaming() is allowed"); + promise_test(t => { - return WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0])); -}); + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.instantiateStreaming(response); +}, "WebAssembly.instantiateStreaming() is allowed"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt index f4e6f84e8dd0..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt index f4e6f84e8dd0..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.worker-expected.txt index f4e6f84e8dd0..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-unsafe-eval-allows-wasm.any.worker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any-expected.txt index c96b7029e8b9..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.js index 68a145caae1d..7167b71b6e2c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.js @@ -1,6 +1,25 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return WebAssembly.instantiate(bytes); +}, "WebAssembly.instantiate() is allowed"); + +promise_test(t => { + return WebAssembly.compile(bytes); +}, "WebAssembly.compile() is allowed"); + +test(() => { + new WebAssembly.Module(bytes); +}, "new WebAssembly.Module() is allowed"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.compileStreaming(response); +}, "WebAssembly.compileStreaming() is allowed"); + promise_test(t => { - return WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0])); -}); + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.instantiateStreaming(response); +}, "WebAssembly.instantiateStreaming() is allowed"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt index c96b7029e8b9..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt index c96b7029e8b9..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt index c96b7029e8b9..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/default-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt @@ -1,3 +1,7 @@ -PASS default-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any-expected.txt new file mode 100644 index 000000000000..8744f0125b06 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any-expected.txt @@ -0,0 +1,4 @@ + +PASS WebAssembly.compileStreaming() is blocked +PASS WebAssembly.instantiateStreaming() is blocked + diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.html b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js new file mode 100644 index 000000000000..216f9929bd82 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js @@ -0,0 +1,17 @@ +// META: global=window,worker + +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.compileStreaming(response)); +}, "WebAssembly.compileStreaming() is blocked"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.instantiateStreaming(response)); +}, "WebAssembly.instantiateStreaming() is blocked"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js.headers b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js.headers new file mode 100644 index 000000000000..32b65539e69b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.js.headers @@ -0,0 +1 @@ +Content-Security-Policy: script-src 'self' 'unsafe-inline' diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker-expected.txt new file mode 100644 index 000000000000..8744f0125b06 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker-expected.txt @@ -0,0 +1,4 @@ + +PASS WebAssembly.compileStreaming() is blocked +PASS WebAssembly.instantiateStreaming() is blocked + diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm-streaming.any.worker.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any-expected.txt index d1bc32d29466..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any-expected.txt @@ -1,3 +1,5 @@ -PASS script-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.js index 15e9d87ce9e0..673b5189f120 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.js @@ -1,8 +1,21 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return promise_rejects_js( + t, WebAssembly.CompileError, + WebAssembly.instantiate(bytes)); +}, "WebAssembly.instantiate() is blocked"); + promise_test(t => { return promise_rejects_js( t, WebAssembly.CompileError, - WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]))); -}); + WebAssembly.compile(bytes)); +}, "WebAssembly.compile() is blocked"); + +test(() => { + assert_throws_js( + WebAssembly.CompileError, + () => new WebAssembly.Module(bytes)); +}, "new WebAssembly.Module() is blocked"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.serviceworker-expected.txt index d1bc32d29466..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.serviceworker-expected.txt @@ -1,3 +1,5 @@ -PASS script-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.sharedworker-expected.txt index d1bc32d29466..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.sharedworker-expected.txt @@ -1,3 +1,5 @@ -PASS script-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.worker-expected.txt index d1bc32d29466..944455c44ea4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-blocks-wasm.any.worker-expected.txt @@ -1,3 +1,5 @@ -PASS script-src-blocks-wasm +PASS WebAssembly.instantiate() is blocked +PASS WebAssembly.compile() is blocked +PASS new WebAssembly.Module() is blocked diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any-expected.txt index c91d77e51320..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.js index 68a145caae1d..7167b71b6e2c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.js @@ -1,6 +1,25 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return WebAssembly.instantiate(bytes); +}, "WebAssembly.instantiate() is allowed"); + +promise_test(t => { + return WebAssembly.compile(bytes); +}, "WebAssembly.compile() is allowed"); + +test(() => { + new WebAssembly.Module(bytes); +}, "new WebAssembly.Module() is allowed"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.compileStreaming(response); +}, "WebAssembly.compileStreaming() is allowed"); + promise_test(t => { - return WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0])); -}); + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.instantiateStreaming(response); +}, "WebAssembly.instantiateStreaming() is allowed"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt index c91d77e51320..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.serviceworker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt index c91d77e51320..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.sharedworker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.worker-expected.txt index c91d77e51320..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-unsafe-eval-allows-wasm.any.worker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any-expected.txt index a20917ca7ab7..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.js b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.js index 68a145caae1d..7167b71b6e2c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.js +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.js @@ -1,6 +1,25 @@ // META: global=window,worker +const bytes = new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0]); + +promise_test(t => { + return WebAssembly.instantiate(bytes); +}, "WebAssembly.instantiate() is allowed"); + +promise_test(t => { + return WebAssembly.compile(bytes); +}, "WebAssembly.compile() is allowed"); + +test(() => { + new WebAssembly.Module(bytes); +}, "new WebAssembly.Module() is allowed"); + +promise_test(t => { + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.compileStreaming(response); +}, "WebAssembly.compileStreaming() is allowed"); + promise_test(t => { - return WebAssembly.instantiate( - new Uint8Array([0, 0x61, 0x73, 0x6d, 0x1, 0, 0, 0])); -}); + const response = new Response(bytes, { headers: { "Content-Type": "application/wasm" } }); + return WebAssembly.instantiateStreaming(response); +}, "WebAssembly.instantiateStreaming() is allowed"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt index a20917ca7ab7..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.serviceworker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt index a20917ca7ab7..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.sharedworker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt index a20917ca7ab7..d1dc059d90c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/content-security-policy/wasm-unsafe-eval/script-src-wasm-unsafe-eval-allows-wasm.any.worker-expected.txt @@ -1,3 +1,7 @@ -PASS script-src-wasm-unsafe-eval-allows-wasm +PASS WebAssembly.instantiate() is allowed +PASS WebAssembly.compile() is allowed +PASS new WebAssembly.Module() is allowed +PASS WebAssembly.compileStreaming() is allowed +PASS WebAssembly.instantiateStreaming() is allowed diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-height-applies-to-012.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-height-applies-to-012.xht index 641574da8577..68381e06875d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-height-applies-to-012.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-height-applies-to-012.xht @@ -2,6 +2,7 @@ CSS Test: Max-height applied to elements with 'display' set to 'inline-block' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-width-applies-to-012.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-width-applies-to-012.xht index eb9c7feeed7c..a1349278324c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-width-applies-to-012.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/max-width-applies-to-012.xht @@ -2,6 +2,7 @@ CSS Test: Max-width applied to elements with 'display' set to 'inline-block' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-height-applies-to-012.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-height-applies-to-012.xht index 03358e3458c5..9c61192689c9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-height-applies-to-012.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-height-applies-to-012.xht @@ -2,6 +2,7 @@ CSS Test: Min-height applied to elements with 'display' set to 'inline-block' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-width-applies-to-012.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-width-applies-to-012.xht index 07ba0f93329b..2687be600ac9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-width-applies-to-012.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/min-width-applies-to-012.xht @@ -2,6 +2,7 @@ CSS Test: Min-width applied to elements with 'display' set to 'inline-block' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/width-applies-to-012.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/width-applies-to-012.xht index d94cd05f96cb..439838e61f66 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/width-applies-to-012.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/width-applies-to-012.xht @@ -2,6 +2,7 @@ CSS Test: Width applied to elements with 'display' set to 'inline-block' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/reference/ref-filled-black-96px-square.xht b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/reference/ref-filled-black-96px-square.xht new file mode 100644 index 000000000000..7309746e54f7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/reference/ref-filled-black-96px-square.xht @@ -0,0 +1,20 @@ + + + + + + + CSS Reftest Reference + + + + + + + +

Test passes if there is a filled black square.

+ +
Image download support must be enabled
+ + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black15x15.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black15x15.png new file mode 100644 index 000000000000..b1bbef2cd55c Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black15x15.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black96x96.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black96x96.png new file mode 100644 index 000000000000..4e5a7c7546a2 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/black96x96.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/blue15x15.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/blue15x15.png new file mode 100644 index 000000000000..89de32fdb8a4 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/blue15x15.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/cat.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/cat.png new file mode 100644 index 000000000000..85dd7324815b Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/cat.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-h-200px-400px.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-h-200px-400px.png new file mode 100644 index 000000000000..a6461c3d3f73 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-h-200px-400px.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-v-100px-200px.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-v-100px-200px.png new file mode 100644 index 000000000000..3eef21447a99 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/ruler-v-100px-200px.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-blue.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-blue.png new file mode 100644 index 000000000000..bf2759634d45 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-blue.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-fuchsia.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-fuchsia.png new file mode 100644 index 000000000000..746f7ce56be4 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-fuchsia.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-red.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-green.png similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-red.png rename to LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-green.png diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-lime.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-lime.png new file mode 100644 index 000000000000..55fd7fdaedfc Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-lime.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-olive.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-olive.png new file mode 100644 index 000000000000..8fff8179ef34 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-olive.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-orange.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-orange.png new file mode 100644 index 000000000000..d3cd498b52bd Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-orange.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-white.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-white.png new file mode 100644 index 000000000000..1a7d4323d772 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-white.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-yellow.png b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-yellow.png new file mode 100644 index 000000000000..1591aa0e2e27 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/support/swatch-yellow.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-expected.txt index a0939f86719c..3ee5abe6cb59 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-expected.txt @@ -15,7 +15,7 @@ PASS Property background-blend-mode value 'hue' PASS Property background-blend-mode value 'saturation' PASS Property background-blend-mode value 'color' PASS Property background-blend-mode value 'luminosity' -FAIL Property background-blend-mode value 'normal, luminosity' assert_equals: expected "normal, luminosity" but got "normal" -FAIL Property background-blend-mode value 'screen, overlay' assert_equals: expected "screen, overlay" but got "screen" -FAIL Property background-blend-mode value 'color, saturation' assert_equals: expected "color, saturation" but got "color" +PASS Property background-blend-mode value 'normal, luminosity' +PASS Property background-blend-mode value 'screen, overlay' +PASS Property background-blend-mode value 'color, saturation' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-multiple-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-multiple-expected.txt index 7c234f527d45..2c15d1916296 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-multiple-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/compositing/parsing/background-blend-mode-computed-multiple-expected.txt @@ -1,9 +1,9 @@ -FAIL Property background-blend-mode value 'normal' assert_equals: expected "normal" but got "normal, normal, normal" -FAIL Property background-blend-mode value 'multiply' assert_equals: expected "multiply" but got "multiply, multiply, multiply" -FAIL Property background-blend-mode value 'normal, luminosity' assert_equals: expected "normal, luminosity" but got "normal, luminosity, normal" -FAIL Property background-blend-mode value 'screen, overlay' assert_equals: expected "screen, overlay" but got "screen, overlay, screen" -FAIL Property background-blend-mode value 'color, saturation' assert_equals: expected "color, saturation" but got "color, saturation, color" +PASS Property background-blend-mode value 'normal' +PASS Property background-blend-mode value 'multiply' +PASS Property background-blend-mode value 'normal, luminosity' +PASS Property background-blend-mode value 'screen, overlay' +PASS Property background-blend-mode value 'color, saturation' PASS Property background-blend-mode value 'normal, luminosity, color' PASS Property background-blend-mode value 'screen, overlay, screen' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation-expected.txt index 77412bad46d3..48e569f9eb97 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation-expected.txt @@ -239,30 +239,30 @@ FAIL Web Animations: property from [url(../resources/stripes- PASS Web Animations: property from [url(../resources/stripes-100.png), url(../resources/blue-100.png)] to [url(../resources/blue-100.png), url(../resources/stripes-100.png)] at (0.6) should be [url(../resources/blue-100.png), url(../resources/stripes-100.png)] PASS Web Animations: property from [url(../resources/stripes-100.png), url(../resources/blue-100.png)] to [url(../resources/blue-100.png), url(../resources/stripes-100.png)] at (1) should be [url(../resources/blue-100.png), url(../resources/stripes-100.png)] PASS Web Animations: property from [url(../resources/stripes-100.png), url(../resources/blue-100.png)] to [url(../resources/blue-100.png), url(../resources/stripes-100.png)] at (1.5) should be [url(../resources/blue-100.png), url(../resources/stripes-100.png)] -FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " +FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , - 0.3 ) " +FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " +FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.3 ) " +FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.6 ) " PASS CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] -FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " +FAIL CSS Transitions: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 1.5 ) " +FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , - 0.3 ) " +FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " +FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.3 ) " +FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.6 ) " PASS CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] -FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " -FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) " -PASS CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] -FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) " -FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) " -FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " -FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) " -FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " -PASS Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] -FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " -FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " -FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " -FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) " +FAIL CSS Transitions with transition: all: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 1.5 ) " +FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , - 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , - 0.3 ) " +FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " +FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.3 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.3 ) " +FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 0.6 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 0.6 ) " +PASS CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] +FAIL CSS Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " but got "cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , 1.5 ) , cross - fade ( url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) , 1.5 ) " +FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " +FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " +FAIL Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " +PASS Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.6) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] +PASS Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] +PASS Web Animations: property from [url(../resources/blue-100.png)] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (1.5) should be [url(../resources/stripes-100.png), url(../resources/green-100.png)] FAIL CSS Transitions: property from [url(../resources/blue-100.png), none] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (-0.3) should be [url(../resources/blue-100.png), none] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , none " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " FAIL CSS Transitions: property from [url(../resources/blue-100.png), none] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0) should be [url(../resources/blue-100.png), none] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , none " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " FAIL CSS Transitions: property from [url(../resources/blue-100.png), none] to [url(../resources/stripes-100.png), url(../resources/green-100.png)] at (0.3) should be [url(../resources/blue-100.png), none] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 100.png ) , none " but got "url ( http : / / web - platform.test : 8800 / ... / stripes - 100.png ) , url ( http : / / web - platform.test : 8800 / ... / green - 100.png ) " diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation-expected.txt index a210954ba4ea..24b5c0ddc7b0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation-expected.txt @@ -139,60 +139,60 @@ PASS Web Animations: property from [0px 0px, 0px 0px, 0px PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [80px 80px, 80px 80px, 80px 80px, 80px 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [80px 80px, 80px 80px, 80px 80px, 80px 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [80px 80px, 80px 80px, 80px 80px, 80px 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px, -20px -20px, -20px -20px, -20px -20px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px, -20px -20px, -20px -20px, -20px -20px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px, -20px -20px, -20px -20px, -20px -20px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px, -20px -20px, -20px -20px, -20px -20px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px] +PASS CSS Transitions: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px] +PASS CSS Transitions with transition: all: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px] +PASS CSS Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (-0.25) should be [-20px -20px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0) should be [ 0px 0px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.25) should be [ 20px 20px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.5) should be [ 40px 40px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (0.75) should be [ 60px 60px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1) should be [ 80px 80px] +PASS Web Animations: property from [top 0px left 0px] to [left 80px top 80px] at (1.25) should be [100px 100px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px, -20px -20px, 100px -20px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, -20px 100px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px, -20px -20px, 100px -20px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, -20px 100px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px, -20px -20px, 100px -20px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, -20px 100px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [-10px -10px, 80px -20px, 0px -20px, 90px -10px, -20px -20px, 100px -20px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [ 10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [ 20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [ 30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [ 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [ 50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, -20px 100px] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html index 2e7f2e24a1db..ed1be03286f8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html @@ -111,27 +111,27 @@ from: 'top 0px left 0px', to: 'left 80px top 80px', }, [ - {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'}, - {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, - {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, - {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, - {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, - {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, - {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, + {at: -0.25, expect: '-20px -20px'}, + {at: 0, expect: ' 0px 0px'}, + {at: 0.25, expect: ' 20px 20px'}, + {at: 0.5, expect: ' 40px 40px'}, + {at: 0.75, expect: ' 60px 60px'}, + {at: 1, expect: ' 80px 80px'}, + {at: 1.25, expect: '100px 100px'}, ]); // Test mismatched numbers of position values. test_interpolation({ property: 'background-position', - from: '0px 0px, 80px 0px', - to: '40px 40px, 80px 80px, 0px 80px', + from: '0px 0px, 80px 0px', // intepreted as [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px ] via repetition + to: '40px 40px, 80px 80px, 0px 80px', // intepreted as [ 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px ] via repetition }, [ - {at: -0.25, expect: '-10px -10px, 80px -20px, 0px -20px, 90px -10px'}, - {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, - {at: 0.25, expect: ' 10px 10px, 80px 20px, 0px 20px, 70px 10px'}, - {at: 0.5, expect: ' 20px 20px, 80px 40px, 0px 40px, 60px 20px'}, - {at: 0.75, expect: ' 30px 30px, 80px 60px, 0px 60px, 50px 30px'}, - {at: 1, expect: ' 40px 40px, 80px 80px, 0px 80px, 40px 40px'}, - {at: 1.25, expect: ' 50px 50px, 80px 100px, 0px 100px, 30px 50px'}, + {at: -0.25, expect: '-10px -10px, 80px -20px, 0px -20px, 90px -10px, -20px -20px, 100px -20px'}, + {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, + {at: 0.25, expect: ' 10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px'}, + {at: 0.5, expect: ' 20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px'}, + {at: 1, expect: ' 40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px'}, + {at: 1.25, expect: ' 50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, -20px 100px'}, ]); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation-expected.txt index c0a01dbb0bad..521b7f620014 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation-expected.txt @@ -1,32 +1,32 @@ -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px] -PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px] -PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px] -PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px] -PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px , 12.5px 12.5px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px] +PASS CSS Transitions: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px , 12.5px 12.5px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px] +PASS CSS Transitions with transition: all: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px , 12.5px 12.5px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px] +PASS CSS Animations: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (-0.25) should be [ 7.5px 7.5px , 12.5px 12.5px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0) should be [10.0px 10.0px, 10.0px 10.0px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.25) should be [12.5px 12.5px, 7.5px 7.5px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.5) should be [15.0px 15.0px, 5.0px 5.0px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (0.75) should be [17.5px 17.5px, 2.5px 2.5px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (1) should be [20.0px 20.0px, 0.0px 0.0px] +PASS Web Animations: property from neutral to [20px 20px, 0px 0px] at (1.25) should be [22.5px 22.5px, 0.0px 0.0px] PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [20px 20px, 0px 0px] at (-0.3) should be [initial] PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [20px 20px, 0px 0px] at (0) should be [initial] PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [20px 20px, 0px 0px] at (0.3) should be [initial] @@ -69,34 +69,34 @@ PASS Web Animations: property from [initial] to [20px 20px, 0p PASS Web Animations: property from [initial] to [20px 20px, 0px 0px] at (0.6) should be [20px 20px, 0px 0px] PASS Web Animations: property from [initial] to [20px 20px, 0px 0px] at (1) should be [20px 20px, 0px 0px] PASS Web Animations: property from [initial] to [20px 20px, 0px 0px] at (1.5) should be [20px 20px, 0px 0px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px, 120px 120px, 125px 125px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px, 80px 80px, 75px 75px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px, 60px 60px, 50px 50px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px, 40px 40px, 25px 25px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px, 20px 20px, 0px 0px] -PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px, 120px 120px, 125px 125px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px, 80px 80px, 75px 75px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px, 60px 60px, 50px 50px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px, 40px 40px, 25px 25px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px, 20px 20px, 0px 0px] -PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px, 120px 120px, 125px 125px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px, 80px 80px, 75px 75px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px, 60px 60px, 50px 50px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px, 40px 40px, 25px 25px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px, 20px 20px, 0px 0px] -PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px, 120px 120px, 125px 125px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px, 80px 80px, 75px 75px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px, 60px 60px, 50px 50px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px, 40px 40px, 25px 25px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px, 20px 20px, 0px 0px] -PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px] +PASS CSS Transitions: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px] +PASS CSS Transitions with transition: all: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px] +PASS CSS Animations: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (-0.25) should be [120px 120px, 125px 125px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0) should be [100px 100px, 100px 100px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.25) should be [ 80px 80px, 75px 75px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.5) should be [ 60px 60px, 50px 50px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (0.75) should be [ 40px 40px, 25px 25px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (1) should be [ 20px 20px, 0px 0px] +PASS Web Animations: property from [inherit] to [20px 20px, 0px 0px] at (1.25) should be [ 0px 0px, 0px 0px] PASS CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [20px 20px, 0px 0px] at (-0.3) should be [unset] PASS CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [20px 20px, 0px 0px] at (0) should be [unset] PASS CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [20px 20px, 0px 0px] at (0.3) should be [unset] @@ -279,88 +279,88 @@ PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [20px 20px, 40px 40px, 60px 60px, 100px 100px] at (0.75) should be [15px 15px, 30px 30px, 45px 45px, 75px 75px] PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [20px 20px, 40px 40px, 60px 60px, 100px 100px] at (1) should be [20px 20px, 40px 40px, 60px 60px, 100px 100px] PASS Web Animations: property from [0px 0px, 0px 0px, 0px 0px, 0px 0px] to [20px 20px, 40px 40px, 60px 60px, 100px 100px] at (1.25) should be [25px 25px, 50px 50px, 75px 75px, 125px 125px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS CSS Animations: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px, 0px 0px, 0px 0px, 0px 0px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px, 20px 20px, 20px 20px, 20px 20px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px, 40px 40px, 40px 40px, 40px 40px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px, 60px 60px, 60px 60px, 60px 60px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px, 80px 80px, 80px 80px, 80px 80px] -PASS Web Animations: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px, 100px 100px, 100px 100px, 100px 100px] -PASS CSS Transitions: property from [0px] to [80px] at (-0.25) should be [ 0px, 0px, 0px, 0px] -PASS CSS Transitions: property from [0px] to [80px] at (0) should be [ 0px, 0px, 0px, 0px] -PASS CSS Transitions: property from [0px] to [80px] at (0.25) should be [ 20px, 20px, 20px, 20px] -PASS CSS Transitions: property from [0px] to [80px] at (0.5) should be [ 40px, 40px, 40px, 40px] -PASS CSS Transitions: property from [0px] to [80px] at (0.75) should be [ 60px, 60px, 60px, 60px] -PASS CSS Transitions: property from [0px] to [80px] at (1) should be [ 80px, 80px, 80px, 80px] -PASS CSS Transitions: property from [0px] to [80px] at (1.25) should be [100px, 100px, 100px, 100px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (-0.25) should be [ 0px, 0px, 0px, 0px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0) should be [ 0px, 0px, 0px, 0px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.25) should be [ 20px, 20px, 20px, 20px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.5) should be [ 40px, 40px, 40px, 40px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.75) should be [ 60px, 60px, 60px, 60px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (1) should be [ 80px, 80px, 80px, 80px] -PASS CSS Transitions with transition: all: property from [0px] to [80px] at (1.25) should be [100px, 100px, 100px, 100px] -PASS CSS Animations: property from [0px] to [80px] at (-0.25) should be [ 0px, 0px, 0px, 0px] -PASS CSS Animations: property from [0px] to [80px] at (0) should be [ 0px, 0px, 0px, 0px] -PASS CSS Animations: property from [0px] to [80px] at (0.25) should be [ 20px, 20px, 20px, 20px] -PASS CSS Animations: property from [0px] to [80px] at (0.5) should be [ 40px, 40px, 40px, 40px] -PASS CSS Animations: property from [0px] to [80px] at (0.75) should be [ 60px, 60px, 60px, 60px] -PASS CSS Animations: property from [0px] to [80px] at (1) should be [ 80px, 80px, 80px, 80px] -PASS CSS Animations: property from [0px] to [80px] at (1.25) should be [100px, 100px, 100px, 100px] -PASS Web Animations: property from [0px] to [80px] at (-0.25) should be [ 0px, 0px, 0px, 0px] -PASS Web Animations: property from [0px] to [80px] at (0) should be [ 0px, 0px, 0px, 0px] -PASS Web Animations: property from [0px] to [80px] at (0.25) should be [ 20px, 20px, 20px, 20px] -PASS Web Animations: property from [0px] to [80px] at (0.5) should be [ 40px, 40px, 40px, 40px] -PASS Web Animations: property from [0px] to [80px] at (0.75) should be [ 60px, 60px, 60px, 60px] -PASS Web Animations: property from [0px] to [80px] at (1) should be [ 80px, 80px, 80px, 80px] -PASS Web Animations: property from [0px] to [80px] at (1.25) should be [100px, 100px, 100px, 100px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px] -PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px] +PASS CSS Transitions: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px] +PASS CSS Transitions with transition: all: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px] +PASS CSS Animations: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (-0.25) should be [ 0px 0px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (0) should be [ 0px 0px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.25) should be [ 20px 20px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.5) should be [ 40px 40px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (0.75) should be [ 60px 60px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (1) should be [ 80px 80px] +PASS Web Animations: property from [0px 0px] to [80px 80px] at (1.25) should be [100px 100px] +PASS CSS Transitions: property from [0px] to [80px] at (-0.25) should be [ 0px] +PASS CSS Transitions: property from [0px] to [80px] at (0) should be [ 0px] +PASS CSS Transitions: property from [0px] to [80px] at (0.25) should be [ 20px] +PASS CSS Transitions: property from [0px] to [80px] at (0.5) should be [ 40px] +PASS CSS Transitions: property from [0px] to [80px] at (0.75) should be [ 60px] +PASS CSS Transitions: property from [0px] to [80px] at (1) should be [ 80px] +PASS CSS Transitions: property from [0px] to [80px] at (1.25) should be [100px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (-0.25) should be [ 0px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0) should be [ 0px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.25) should be [ 20px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.5) should be [ 40px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (0.75) should be [ 60px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (1) should be [ 80px] +PASS CSS Transitions with transition: all: property from [0px] to [80px] at (1.25) should be [100px] +PASS CSS Animations: property from [0px] to [80px] at (-0.25) should be [ 0px] +PASS CSS Animations: property from [0px] to [80px] at (0) should be [ 0px] +PASS CSS Animations: property from [0px] to [80px] at (0.25) should be [ 20px] +PASS CSS Animations: property from [0px] to [80px] at (0.5) should be [ 40px] +PASS CSS Animations: property from [0px] to [80px] at (0.75) should be [ 60px] +PASS CSS Animations: property from [0px] to [80px] at (1) should be [ 80px] +PASS CSS Animations: property from [0px] to [80px] at (1.25) should be [100px] +PASS Web Animations: property from [0px] to [80px] at (-0.25) should be [ 0px] +PASS Web Animations: property from [0px] to [80px] at (0) should be [ 0px] +PASS Web Animations: property from [0px] to [80px] at (0.25) should be [ 20px] +PASS Web Animations: property from [0px] to [80px] at (0.5) should be [ 40px] +PASS Web Animations: property from [0px] to [80px] at (0.75) should be [ 60px] +PASS Web Animations: property from [0px] to [80px] at (1) should be [ 80px] +PASS Web Animations: property from [0px] to [80px] at (1.25) should be [100px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px, 0px 0px, 100px 0px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Transitions: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, 0px 100px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px, 0px 0px, 100px 0px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Transitions with transition: all: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, 0px 100px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px, 0px 0px, 100px 0px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS CSS Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, 0px 100px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (-0.25) should be [ 0px 0px, 80px 0px, 0px 0px, 90px 0px, 0px 0px, 100px 0px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0) should be [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.25) should be [10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.5) should be [20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (0.75) should be [30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1) should be [40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] +PASS Web Animations: property from [0px 0px, 80px 0px] to [40px 40px, 80px 80px, 0px 80px] at (1.25) should be [50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, 0px 100px] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html index f6a480c7bd2c..b2c279142bd1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html @@ -36,16 +36,16 @@ // neutral test_interpolation({ property: 'background-size', - from: neutralKeyframe, + from: neutralKeyframe, // intepreted as [ 10px 10px, 10px 10px] via repetition to: '20px 20px, 0px 0px', }, [ - {at: -0.25, expect: ' 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px'}, - {at: 0, expect: '10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px'}, - {at: 0.25, expect: '12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px'}, - {at: 0.5, expect: '15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px'}, - {at: 0.75, expect: '17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px'}, - {at: 1, expect: '20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px'}, - {at: 1.25, expect: '22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px'}, + {at: -0.25, expect: ' 7.5px 7.5px , 12.5px 12.5px'}, + {at: 0, expect: '10.0px 10.0px, 10.0px 10.0px'}, + {at: 0.25, expect: '12.5px 12.5px, 7.5px 7.5px'}, + {at: 0.5, expect: '15.0px 15.0px, 5.0px 5.0px'}, + {at: 0.75, expect: '17.5px 17.5px, 2.5px 2.5px'}, + {at: 1, expect: '20.0px 20.0px, 0.0px 0.0px'}, + {at: 1.25, expect: '22.5px 22.5px, 0.0px 0.0px'}, ]); // initial @@ -58,16 +58,16 @@ // inherit test_interpolation({ property: 'background-size', - from: 'inherit', + from: 'inherit', // intepreted as [ 100px 100px, 100px 100px ] via repetition to: '20px 20px, 0px 0px', }, [ - {at: -0.25, expect: '120px 120px, 125px 125px, 120px 120px, 125px 125px'}, - {at: 0, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, - {at: 0.25, expect: ' 80px 80px, 75px 75px, 80px 80px, 75px 75px'}, - {at: 0.5, expect: ' 60px 60px, 50px 50px, 60px 60px, 50px 50px'}, - {at: 0.75, expect: ' 40px 40px, 25px 25px, 40px 40px, 25px 25px'}, - {at: 1, expect: ' 20px 20px, 0px 0px, 20px 20px, 0px 0px'}, - {at: 1.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: -0.25, expect: '120px 120px, 125px 125px'}, + {at: 0, expect: '100px 100px, 100px 100px'}, + {at: 0.25, expect: ' 80px 80px, 75px 75px'}, + {at: 0.5, expect: ' 60px 60px, 50px 50px'}, + {at: 0.75, expect: ' 40px 40px, 25px 25px'}, + {at: 1, expect: ' 20px 20px, 0px 0px'}, + {at: 1.25, expect: ' 0px 0px, 0px 0px'}, ]); // unset @@ -126,13 +126,13 @@ from: '0px 0px', to: '80px 80px', }, [ - {at: -0.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, - {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, - {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, - {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, - {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, - {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, - {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, + {at: -0.25, expect: ' 0px 0px'}, + {at: 0, expect: ' 0px 0px'}, + {at: 0.25, expect: ' 20px 20px'}, + {at: 0.5, expect: ' 40px 40px'}, + {at: 0.75, expect: ' 60px 60px'}, + {at: 1, expect: ' 80px 80px'}, + {at: 1.25, expect: '100px 100px'}, ]); test_interpolation({ @@ -140,27 +140,27 @@ from: '0px', to: '80px', }, [ - {at: -0.25, expect: ' 0px, 0px, 0px, 0px'}, - {at: 0, expect: ' 0px, 0px, 0px, 0px'}, - {at: 0.25, expect: ' 20px, 20px, 20px, 20px'}, - {at: 0.5, expect: ' 40px, 40px, 40px, 40px'}, - {at: 0.75, expect: ' 60px, 60px, 60px, 60px'}, - {at: 1, expect: ' 80px, 80px, 80px, 80px'}, - {at: 1.25, expect: '100px, 100px, 100px, 100px'}, + {at: -0.25, expect: ' 0px'}, + {at: 0, expect: ' 0px'}, + {at: 0.25, expect: ' 20px'}, + {at: 0.5, expect: ' 40px'}, + {at: 0.75, expect: ' 60px'}, + {at: 1, expect: ' 80px'}, + {at: 1.25, expect: '100px'}, ]); // Mismatched numbers of size values. test_interpolation({ property: 'background-size', - from: '0px 0px, 80px 0px', - to: '40px 40px, 80px 80px, 0px 80px', + from: '0px 0px, 80px 0px', // intepreted as [ 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px] via repetition + to: '40px 40px, 80px 80px, 0px 80px', // intepreted as [40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px] via repetition }, [ - {at: -0.25, expect: ' 0px 0px, 80px 0px, 0px 0px, 90px 0px'}, - {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, - {at: 0.25, expect: '10px 10px, 80px 20px, 0px 20px, 70px 10px'}, - {at: 0.5, expect: '20px 20px, 80px 40px, 0px 40px, 60px 20px'}, - {at: 0.75, expect: '30px 30px, 80px 60px, 0px 60px, 50px 30px'}, - {at: 1, expect: '40px 40px, 80px 80px, 0px 80px, 40px 40px'}, - {at: 1.25, expect: '50px 50px, 80px 100px, 0px 100px, 30px 50px'}, + {at: -0.25, expect: ' 0px 0px, 80px 0px, 0px 0px, 90px 0px, 0px 0px, 100px 0px'}, + {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, + {at: 0.25, expect: '10px 10px, 80px 20px, 0px 20px, 70px 10px, 20px 20px, 60px 20px'}, + {at: 0.5, expect: '20px 20px, 80px 40px, 0px 40px, 60px 20px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: '30px 30px, 80px 60px, 0px 60px, 50px 30px, 60px 60px, 20px 60px'}, + {at: 1, expect: '40px 40px, 80px 80px, 0px 80px, 40px 40px, 80px 80px, 0px 80px'}, + {at: 1.25, expect: '50px 50px, 80px 100px, 0px 100px, 30px 50px, 100px 100px, 0px 100px'}, ]); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed-expected.txt index 436a0bbb28db..26fbe1a6ef21 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed-expected.txt @@ -1,4 +1,7 @@ PASS Property background-attachment value 'fixed' PASS Property background-attachment value 'scroll, fixed, local' +PASS Property background-attachment value 'scroll' multiple base values +PASS Property background-attachment value 'scroll, fixed' multiple base values +PASS Property background-attachment value 'scroll, fixed, local' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed.html index 702d5fc8ac89..46a0753f3e30 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-attachment-computed.html @@ -13,9 +13,12 @@
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed-expected.txt index e216320dcc09..e9ff568f23ba 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed-expected.txt @@ -4,4 +4,7 @@ PASS Property background-clip value 'padding-box' PASS Property background-clip value 'content-box' PASS Property background-clip value 'border-area' PASS Property background-clip value 'border-box, padding-box, content-box, border-area' +PASS Property background-clip value 'border-box' multiple base values +PASS Property background-clip value 'border-box, padding-box' multiple base values +PASS Property background-clip value 'border-box, padding-box, content-box' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed.html index 45dc75f7a4f9..46f2d7a95450 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-clip-computed.html @@ -16,9 +16,12 @@ test_computed_value("background-clip", "padding-box"); test_computed_value("background-clip", "content-box"); test_computed_value("background-clip", "border-area"); +test_computed_value("background-clip", "border-box, padding-box, content-box, border-area"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-clip", "border-box, padding-box, content-box, border-area", "border-box"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-clip", "border-box", "border-box", "multiple base values"); +test_computed_value("background-clip", "border-box, padding-box", "border-box, padding-box", "multiple base values"); +test_computed_value("background-clip", "border-box, padding-box, content-box", "border-box, padding-box, content-box", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-computed.html index 9c45a8888abd..214eca366859 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-computed.html @@ -4,7 +4,7 @@ CSS Backgrounds and Borders: getComputedStyle().background with multiple layers - + @@ -18,51 +18,50 @@
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed-expected.txt index f6f4bee0d1e6..12067d026be6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed-expected.txt @@ -28,4 +28,7 @@ PASS Property background-position value 'bottom right 19%' PASS Property background-position value 'calc(10px + 0.5em) calc(10px - 0.5em)' PASS Property background-position value 'calc(10px - 0.5em) calc(10px + 0.5em)' PASS Property background-position value '12px 13px, 50% 6px, 30px -10px' +PASS Property background-position value 'center' multiple base values +PASS Property background-position value 'center, left' multiple base values +PASS Property background-position value 'center, left, bottom' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed.html index 2a3f6fae1e77..a21e6522fbb9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-computed.html @@ -45,9 +45,12 @@ test_computed_value("background-position", "bottom right 19%", "81% 100%"); test_computed_value("background-position", "calc(10px + 0.5em) calc(10px - 0.5em)", "30px -10px"); test_computed_value("background-position", "calc(10px - 0.5em) calc(10px + 0.5em)", "-10px 30px"); +test_computed_value("background-position", "12px 13px, 50% 6px, 30px -10px", "12px 13px, 50% 6px, 30px -10px"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-position", "12px 13px, 50% 6px, 30px -10px", "12px 13px"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-position", "center", "50% 50%", "multiple base values"); +test_computed_value("background-position", "center, left", "50% 50%, 0% 50%", "multiple base values"); +test_computed_value("background-position", "center, left, bottom", "50% 50%, 0% 50%, 50% 100%", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed-expected.txt index e801b8166bda..17734e144f72 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed-expected.txt @@ -15,4 +15,7 @@ PASS Property background-position-x value 'center, left, right' PASS Property background-position-x value '0.5em, x-start, x-end' PASS Property background-position-x value 'calc(10px - 0.5em), -20%, 10px' PASS Property background-position-x value 'calc(10px - 0.5em), left -20%, right 10px' +PASS Property background-position-x value 'center' multiple base values +PASS Property background-position-x value 'center, left' multiple base values +PASS Property background-position-x value 'center, left, right' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed.html index 6cb7fb2c1740..5b0adbb2cc77 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-x-computed.html @@ -27,13 +27,16 @@ test_computed_value("background-position-x", "calc(10px - 0.5em)", "-10px"); test_computed_value("background-position-x", "left -20%", "-20%"); test_computed_value("background-position-x", "right -10px", "calc(100% + 10px)"); -test_computed_value("background-position-x", "-20%, 10px", "-20%"); -test_computed_value("background-position-x", "center, left, right", "50%"); -test_computed_value("background-position-x", "0.5em, x-start, x-end", "20px"); +test_computed_value("background-position-x", "-20%, 10px", "-20%, 10px"); +test_computed_value("background-position-x", "center, left, right", "50%, 0%, 100%"); +test_computed_value("background-position-x", "0.5em, x-start, x-end", "20px, 0%, 100%"); +test_computed_value("background-position-x", "calc(10px - 0.5em), -20%, 10px", "-10px, -20%, 10px"); +test_computed_value("background-position-x", "calc(10px - 0.5em), left -20%, right 10px", "-10px, -20%, calc(100% - 10px)"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-position-x", "calc(10px - 0.5em), -20%, 10px", "-10px"); -test_computed_value("background-position-x", "calc(10px - 0.5em), left -20%, right 10px", "-10px"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-position-x", "center", "50%", "multiple base values"); +test_computed_value("background-position-x", "center, left", "50%, 0%", "multiple base values"); +test_computed_value("background-position-x", "center, left, right", "50%, 0%, 100%", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed-expected.txt index ee797e56b637..35b18fefb443 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed-expected.txt @@ -15,4 +15,7 @@ PASS Property background-position-y value 'center, top, bottom' PASS Property background-position-y value '0.5em, y-start, y-end' PASS Property background-position-y value 'calc(10px - 0.5em), -20%, 10px' PASS Property background-position-y value 'calc(10px - 0.5em), top -20%, bottom 10px' +PASS Property background-position-y value 'center' multiple base values +PASS Property background-position-y value 'center, top' multiple base values +PASS Property background-position-y value 'center, top, bottom' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed.html index a2d60bfeb974..69cecaada8d0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-position-y-computed.html @@ -27,13 +27,16 @@ test_computed_value("background-position-y", "calc(10px - 0.5em)", "-10px"); test_computed_value("background-position-y", "top -20%", "-20%"); test_computed_value("background-position-y", "bottom -10px", "calc(100% + 10px)"); -test_computed_value("background-position-y", "-20%, 10px", "-20%"); -test_computed_value("background-position-y", "center, top, bottom", "50%"); -test_computed_value("background-position-y", "0.5em, y-start, y-end", "20px"); +test_computed_value("background-position-y", "-20%, 10px"); +test_computed_value("background-position-y", "center, top, bottom", "50%, 0%, 100%"); +test_computed_value("background-position-y", "0.5em, y-start, y-end", "20px, 0%, 100%"); +test_computed_value("background-position-y", "calc(10px - 0.5em), -20%, 10px", "-10px, -20%, 10px"); +test_computed_value("background-position-y", "calc(10px - 0.5em), top -20%, bottom 10px", "-10px, -20%, calc(100% - 10px)"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-position-y", "calc(10px - 0.5em), -20%, 10px", "-10px"); -test_computed_value("background-position-y", "calc(10px - 0.5em), top -20%, bottom 10px", "-10px"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-position-y", "center", "50%", "multiple base values"); +test_computed_value("background-position-y", "center, top", "50%, 0%", "multiple base values"); +test_computed_value("background-position-y", "center, top, bottom", "50%, 0%, 100%", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed-expected.txt index 94940c05107a..e2b829e970e2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed-expected.txt @@ -9,4 +9,7 @@ PASS Property background-repeat value 'repeat space' PASS Property background-repeat value 'round no-repeat' PASS Property background-repeat value 'repeat repeat' PASS Property background-repeat value 'repeat-x, repeat-y, repeat' +PASS Property background-repeat value 'repeat-x' multiple base values +PASS Property background-repeat value 'repeat-x, repeat-y' multiple base values +PASS Property background-repeat value 'repeat-x, repeat-y, repeat' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed.html index ad7bfa5a2122..3eb4cc4a90db 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-repeat-computed.html @@ -4,7 +4,7 @@ CSS Backgrounds and Borders: getComputedStyle().backgroundRepeat - + @@ -18,13 +18,15 @@ test_computed_value("background-repeat", "space"); test_computed_value("background-repeat", "round"); test_computed_value("background-repeat", "no-repeat"); - test_computed_value("background-repeat", "repeat space"); test_computed_value("background-repeat", "round no-repeat"); test_computed_value("background-repeat", "repeat repeat", "repeat"); +test_computed_value("background-repeat", "repeat-x, repeat-y, repeat"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-repeat", "repeat-x, repeat-y, repeat", "repeat-x"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-repeat", "repeat-x", "repeat-x", "multiple base values"); +test_computed_value("background-repeat", "repeat-x, repeat-y", "repeat-x, repeat-y", "multiple base values"); +test_computed_value("background-repeat", "repeat-x, repeat-y, repeat", "repeat-x, repeat-y, repeat", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed-expected.txt index 401da934949c..897ae4b4f421 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed-expected.txt @@ -10,4 +10,9 @@ PASS Property background-size value 'cover' PASS Property background-size value 'calc(10px + 0.5em) calc(10px - 0.5em)' PASS Property background-size value 'calc(10px - 0.5em) calc(10px + 0.5em)' PASS Property background-size value 'auto 1px, 2% 3%, contain' +PASS Property background-size value 'auto' multiple base values +PASS Property background-size value 'auto, auto' multiple base values +PASS Property background-size value 'auto, auto, auto' multiple base values +PASS Property background-size value 'auto, 100%' multiple base values +PASS Property background-size value '100%' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed.html index 80fdd0fb27bb..1ffe38386a5d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/parsing/background-size-computed.html @@ -27,9 +27,14 @@ test_computed_value("background-size", "cover"); test_computed_value("background-size", "calc(10px + 0.5em) calc(10px - 0.5em)", "30px 0px"); test_computed_value("background-size", "calc(10px - 0.5em) calc(10px + 0.5em)", "0px 30px"); +test_computed_value("background-size", "auto 1px, 2% 3%, contain"); -// See background-computed.html for a test with multiple background images. -test_computed_value("background-size", "auto 1px, 2% 3%, contain", "auto 1px"); +document.getElementById("target").style['background-image'] = "none, none"; +test_computed_value("background-size", "auto", "auto", "multiple base values"); +test_computed_value("background-size", "auto, auto", "auto, auto", "multiple base values"); +test_computed_value("background-size", "auto, auto, auto", "auto, auto, auto", "multiple base values"); +test_computed_value("background-size", "auto, 100%", "auto, 100% auto", "multiple base values"); +test_computed_value("background-size", "100%", "100% auto", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt index 0ef460265da7..5a96d8cfc84d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt @@ -170,7 +170,6 @@ PASS font-variant-position PASS font-variation-settings PASS font-weight PASS font-width -PASS glyph-orientation-horizontal PASS glyph-orientation-vertical PASS grid-auto-columns PASS grid-auto-flow diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt index c54b6e9a421e..b00e6c124fc0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt @@ -148,7 +148,6 @@ PASS font-variant-position PASS font-variation-settings PASS font-weight PASS font-width -PASS glyph-orientation-horizontal PASS glyph-orientation-vertical PASS grid-auto-columns PASS grid-auto-flow diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/WEB_FEATURES.yml index cbb0f23ede22..9b2999c284e3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/WEB_FEATURES.yml @@ -12,6 +12,13 @@ features: files: - color-mix-* - nested-color-mix-with-currentcolor.html +- name: currentcolor + files: + - currentcolor-* + - t44-currentcolor-* + - color-003.html + - currentcolor-visited-fallback.html + - t31-color-currentColor-b.xht - name: lab files: - lab-* @@ -23,3 +30,42 @@ features: files: - oklab-* - oklch-* +- name: hwb + files: + - hwb-* +- name: relative-color + files: + - relative-* +- name: rgb + files: + - rgb-* + - rgba-* + - hex-* +- name: system-color + files: + - "deprecated-sameas-*" + - "system-color-*" +- name: contrast-color + files: + - contrast-color-*.html +- name: hsl + files: + - background-color-hsl-* + - hsl-* + - hsla-* + - t424-hsl-* + - t425-hsla-* +- name: opacity + files: + - t32-opacity-*.xht + - inline-opacity-float-child.html + - opacity-overlapping-letters.html +- name: named-color + files: + - named-001.html +- name: color + files: + - color-001.html + - color-002.html + - t31-color-text-a.xht + - t423-transparent-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/WEB_FEATURES.yml new file mode 100644 index 000000000000..3e18422019fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: opacity + files: + - opacity-interpolation.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation-expected.html new file mode 100644 index 000000000000..82fcaa3b2aa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation-expected.html @@ -0,0 +1,4 @@ + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation.html new file mode 100644 index 000000000000..31328aab9631 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation.html @@ -0,0 +1,23 @@ + +CSS Color Test: Interpolate between contrast-color() and lime + + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/w3c-import.log index 4cb9660bd7ab..cbfb728965b4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/w3c-import.log @@ -14,8 +14,11 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/color-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/color-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/contrast-color-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/opacity-animation-ending-correctly-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/opacity-animation-ending-correctly-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/animation/opacity-animation-ending-correctly-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-expected.html index 11930b4c6dab..7e45ac4f8b7f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-expected.html @@ -55,7 +55,7 @@ if (sliceFromIPlusOne.length) document.body.append(createReference([...sliceUntilI, opaqueColor, ...sliceFromIPlusOne])); } - + if (sliceFromIPlusOne.length) document.body.append(createReference([...sliceUntilI, ...sliceFromIPlusOne])); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html index 11930b4c6dab..7e45ac4f8b7f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html @@ -55,7 +55,7 @@ if (sliceFromIPlusOne.length) document.body.append(createReference([...sliceUntilI, opaqueColor, ...sliceFromIPlusOne])); } - + if (sliceFromIPlusOne.length) document.body.append(createReference([...sliceUntilI, ...sliceFromIPlusOne])); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components-expected.txt new file mode 100644 index 000000000000..e8990acdd1c6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components-expected.txt @@ -0,0 +1,3 @@ + +PASS Property color value 'color-mix(in srgb, oklch(0 none none), white)' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components.html new file mode 100644 index 000000000000..3ce68eb2cae3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components.html @@ -0,0 +1,13 @@ + + +color-mix(): <color>s with missing components + + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-expected.html index 15556737c7f8..e143350866dc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-expected.html @@ -1,6 +1,6 @@ - + + +

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+ +

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001-ref.html new file mode 100644 index 000000000000..34c702462d72 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001-ref.html @@ -0,0 +1,70 @@ + + + +CSS Color 5 reference: contrast-color + + + + + + +

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+ +

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001.html new file mode 100644 index 000000000000..f107c163a961 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001.html @@ -0,0 +1,86 @@ + + + +CSS Color 5: contrast-color + + + + + + + + + + +

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+

This text should be black

+ +

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

+

This text should be white

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited-expected.txt new file mode 100644 index 000000000000..e679c77b2f71 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited-expected.txt @@ -0,0 +1,3 @@ + +PASS currentcolor inside contrast-color() computes to the keyword + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited.html new file mode 100644 index 000000000000..39e626b3d84b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited.html @@ -0,0 +1,20 @@ + +CSS Color 5: Inherit contrast-color(currentcolor) as computed value + + + + +
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-expected.html index 612566c4d2c3..34ae440631aa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-expected.html @@ -11,7 +11,7 @@ } span { -webkit-box-decoration-break: clone; - box-decoration-break: clone; + -webkit-box-decoration-break: clone; line-height: 50px; background-image: linear-gradient(currentcolor, currentcolor); background-color: currentColor; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-ref.html index 612566c4d2c3..7cabf85f3b4f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003-ref.html @@ -10,8 +10,8 @@ color: green; } span { - -webkit-box-decoration-break: clone; box-decoration-break: clone; + -webkit-box-decoration-break: clone; line-height: 50px; background-image: linear-gradient(currentcolor, currentcolor); background-color: currentColor; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003.html index 852ceac5d205..3bdf47f3e702 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-003.html @@ -21,7 +21,7 @@ } span { -webkit-box-decoration-break: clone; - box-decoration-break: clone; + -webkit-box-decoration-break: clone; line-height: 50px; background-image: linear-gradient(currentcolor, currentcolor); background-color: currentColor; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-expected.html new file mode 100644 index 000000000000..67c72813aff2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-expected.html @@ -0,0 +1,31 @@ + + + + Others depend on currentcolor should be recomputed when currentcolor changes + + + + + +
XXX
YYY
+
XXX
YYY
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-ref.html new file mode 100644 index 000000000000..67c72813aff2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-ref.html @@ -0,0 +1,31 @@ + + + + Others depend on currentcolor should be recomputed when currentcolor changes + + + + + +
XXX
YYY
+
XXX
YYY
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005.html new file mode 100644 index 000000000000..67a9dc2bb1f8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005.html @@ -0,0 +1,43 @@ + + + + column-rule-color that depend on currentcolor should be recomputed when currentcolor changes + + + + + + + +
XXX
YYY
+
XXX
YYY
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004-ref.html new file mode 100644 index 000000000000..8cf6103ea01d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004-ref.html @@ -0,0 +1,10 @@ + + +CSS Color 4:display-p3-linear + + +

Test passes if you see a single square, and not two rectangles of different colors.

+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006.html index 8a3ea45d1876..efbf38da9980 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006.html @@ -7,6 +7,7 @@ + +
    +
  • This item should not have a visible marker
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation-expected.html new file mode 100644 index 000000000000..58864c362727 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation-expected.html @@ -0,0 +1,8 @@ + +CSS Test Reference + +
    +
  • This item should not have a visible marker
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation.html new file mode 100644 index 000000000000..7952f2a9fad7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation.html @@ -0,0 +1,26 @@ + + +light-dark() with none rendered as transparent image during interpolation + + + +
    +
  • This item should not have a visible marker
  • +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-ref.html new file mode 100644 index 000000000000..58864c362727 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-ref.html @@ -0,0 +1,8 @@ + +CSS Test Reference + +
    +
  • This item should not have a visible marker
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none.html new file mode 100644 index 000000000000..738075aa08fd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none.html @@ -0,0 +1,10 @@ + +light-dark() with none rendered as transparent image + + + +
    +
  • This item should not have a visible marker
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image.html new file mode 100644 index 000000000000..c2e73686294b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image.html @@ -0,0 +1,295 @@ + +light-dark() with image values + + + + + +
+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/WEB_FEATURES.yml index cc8273c2adc8..2ed0d9b96003 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/WEB_FEATURES.yml @@ -3,3 +3,24 @@ features: files: - "*-color-mix-*" - color-mix-out-of-gamut.html +- name: relative-color + files: + - "relative-*" + - "*-relative-*" +- name: system-color + files: + - color-valid-system-color.html +- name: contrast-color + files: + - "*contrast-color*.html" +- name: hsl + files: + - color-computed-hsl.html + - color-invalid-hsl.html + - color-valid-hsl.html +- name: opacity + files: + - opacity-*.html +- name: named-color + files: + - "*-named-color.html" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed-expected.txt new file mode 100644 index 000000000000..69c78810dc83 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed-expected.txt @@ -0,0 +1,39 @@ + +PASS Property color value 'alpha(from red / 0.5)' +PASS Property color value 'alpha(from blue / 0)' +PASS Property color value 'alpha(from green / 1)' +PASS Property color value 'alpha(from red / 50%)' +PASS Property color value 'alpha(from red / 0%)' +PASS Property color value 'alpha(from red)' +PASS Property color value 'alpha(from rgba(255, 0, 0, 0.3))' +PASS Property color value 'alpha(from red / none)' +PASS Property color value 'alpha(from red / 2)' +PASS Property color value 'alpha(from red / -1)' +PASS Property color value 'alpha(from rgba(255, 0, 0, 0.3) / 0.8)' +PASS Property color value 'alpha(from color(display-p3 1 0 0) / 0.5)' +PASS Property color value 'alpha(from color(srgb 1 0 0) / 0.5)' +FAIL Property background-color value 'alpha(from currentcolor / 0.5)' Colors do not match. +Actual: rgba(255, 0, 0, 0.5) +Expected: color(srgb 1 0 0 / 0.5). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 1 +/- 0.01, expected 1 but got 255 +FAIL Property background-color value 'alpha(from currentcolor)' Colors do not match. +Actual: rgb(0, 0, 255) +Expected: color(srgb 0 0 1). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. property 2, expected 1 +/- 0.01, expected 1 but got 255 +FAIL Property background-color value 'alpha(from currentcolor / alpha)' Colors do not match. +Actual: rgba(255, 0, 0, 0.8) +Expected: color(srgb 1 0 0 / 0.8). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 1 +/- 0.01, expected 1 but got 255 +FAIL Property background-color value 'alpha(from currentcolor / none)' Colors do not match. +Actual: rgba(0, 128, 0, 0) +Expected: color(srgb 0 0.50196 0 / none). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 4 +FAIL Property background-color value 'alpha(from currentcolor / 50%)' Colors do not match. +Actual: rgba(255, 0, 0, 0.5) +Expected: color(srgb 1 0 0 / 0.5). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 1 +/- 0.01, expected 1 but got 255 +FAIL Property background-color value 'alpha(from currentcolor / calc(alpha * 0.5))' Colors do not match. +Actual: rgba(255, 0, 0, 0.4) +Expected: color(srgb 1 0 0 / 0.4). +Error: assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 1 +/- 0.01, expected 1 but got 255 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed.html new file mode 100644 index 000000000000..38e9b37066b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed.html @@ -0,0 +1,62 @@ + + +CSS Color 5: alpha() function - computed values + + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid-expected.txt new file mode 100644 index 000000000000..eddf3b43deda --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid-expected.txt @@ -0,0 +1,12 @@ + +PASS e.style['color'] = "alpha(red / 0.5)" should not set the property value +PASS e.style['color'] = "alpha()" should not set the property value +PASS e.style['color'] = "alpha(from / 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from)" should not set the property value +PASS e.style['color'] = "alpha(from red / 0.5 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from red 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from red r g b / 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from 42 / 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from none / 0.5)" should not set the property value +PASS e.style['color'] = "alpha(from red /)" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid.html new file mode 100644 index 000000000000..54ba54d33298 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid.html @@ -0,0 +1,36 @@ + + +CSS Color 5: alpha() function - invalid parsing + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid-expected.txt new file mode 100644 index 000000000000..d804e7a34807 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid-expected.txt @@ -0,0 +1,24 @@ + +PASS e.style['color'] = "alpha(from red / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from blue / 1)" should set the property value +PASS e.style['color'] = "alpha(from green / 0)" should set the property value +PASS e.style['color'] = "alpha(from red / 50%)" should set the property value +PASS e.style['color'] = "alpha(from red / 0%)" should set the property value +PASS e.style['color'] = "alpha(from red / 100%)" should set the property value +PASS e.style['color'] = "alpha(from red / none)" should set the property value +PASS e.style['color'] = "alpha(from red)" should set the property value +PASS e.style['color'] = "alpha(from currentcolor)" should set the property value +PASS e.style['color'] = "alpha(from currentcolor / alpha)" should set the property value +PASS e.style['color'] = "alpha(from currentcolor / calc(alpha * 0.5))" should set the property value +PASS e.style['color'] = "alpha(from currentcolor / calc(alpha + 0.1))" should set the property value +PASS e.style['color'] = "color-mix(in srgb, alpha(from red / 0.5), blue)" should set the property value +PASS e.style['color'] = "rgb(from alpha(from currentcolor / 0.5) r g b)" should set the property value +PASS e.style['color'] = "alpha(from color-mix(in srgb, red, blue) / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from rgb(from red r g b) / 0.8)" should set the property value +PASS e.style['color'] = "alpha(from color(display-p3 1 0 0) / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from lab(50 20 -30) / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from oklch(0.5 0.2 120) / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from currentcolor / 0.5)" should set the property value +PASS e.style['color'] = "alpha(from red / 2)" should set the property value +PASS e.style['color'] = "alpha(from red / -1)" should set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid.html new file mode 100644 index 000000000000..219dc2e71cc7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid.html @@ -0,0 +1,56 @@ + + +CSS Color 5: alpha() function - valid parsing + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function-expected.txt index 435e8837478b..871e58c8af7d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function-expected.txt @@ -36,6 +36,9 @@ PASS Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hs PASS Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' PASS Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' PASS Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))' +PASS Property color value 'color-mix(in hsl shorter hue, red, white)' +PASS Property color value 'color-mix(in hsl shorter hue, red, black)' +PASS Property color value 'color-mix(in hsl shorter hue, red, transparent)' PASS Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' PASS Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' PASS Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' @@ -43,6 +46,9 @@ PASS Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl PASS Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' PASS Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' PASS Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))' +PASS Property color value 'color-mix(in hsl longer hue, red, white)' +PASS Property color value 'color-mix(in hsl longer hue, red, black)' +PASS Property color value 'color-mix(in hsl longer hue, red, transparent)' PASS Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' PASS Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' PASS Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' @@ -50,6 +56,9 @@ PASS Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), PASS Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' PASS Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' PASS Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))' +PASS Property color value 'color-mix(in hsl increasing hue, red, white)' +PASS Property color value 'color-mix(in hsl increasing hue, red, black)' +PASS Property color value 'color-mix(in hsl increasing hue, red, transparent)' PASS Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' PASS Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' PASS Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' @@ -57,6 +66,9 @@ PASS Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), PASS Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' PASS Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' PASS Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))' +PASS Property color value 'color-mix(in hsl decreasing hue, red, white)' +PASS Property color value 'color-mix(in hsl decreasing hue, red, black)' +PASS Property color value 'color-mix(in hsl decreasing hue, red, transparent)' PASS Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))' PASS Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' PASS Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' @@ -108,24 +120,36 @@ PASS Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb PASS Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' PASS Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' PASS Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' +PASS Property color value 'color-mix(in hwb shorter hue, red, white)' +PASS Property color value 'color-mix(in hwb shorter hue, red, black)' +PASS Property color value 'color-mix(in hwb shorter hue, red, transparent)' PASS Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' PASS Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' PASS Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' PASS Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' PASS Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' PASS Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' +PASS Property color value 'color-mix(in hwb longer hue, red, white)' +PASS Property color value 'color-mix(in hwb longer hue, red, black)' +PASS Property color value 'color-mix(in hwb longer hue, red, transparent)' PASS Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' PASS Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' PASS Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' PASS Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' PASS Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' PASS Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' +PASS Property color value 'color-mix(in hwb increasing hue, red, white)' +PASS Property color value 'color-mix(in hwb increasing hue, red, black)' +PASS Property color value 'color-mix(in hwb increasing hue, red, transparent)' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' PASS Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' +PASS Property color value 'color-mix(in hwb decreasing hue, red, white)' +PASS Property color value 'color-mix(in hwb decreasing hue, red, black)' +PASS Property color value 'color-mix(in hwb decreasing hue, red, transparent)' PASS Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))' PASS Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' @@ -177,24 +201,36 @@ PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 50deg), lch(1 PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))' PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))' PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))' +PASS Property color value 'color-mix(in lch shorter hue, red, white)' +PASS Property color value 'color-mix(in lch shorter hue, red, black)' +PASS Property color value 'color-mix(in lch shorter hue, red, transparent)' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))' PASS Property color value 'color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))' +PASS Property color value 'color-mix(in lch longer hue, red, white)' +PASS Property color value 'color-mix(in lch longer hue, red, black)' +PASS Property color value 'color-mix(in lch longer hue, red, transparent)' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))' PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))' +PASS Property color value 'color-mix(in lch increasing hue, red, white)' +PASS Property color value 'color-mix(in lch increasing hue, red, black)' +PASS Property color value 'color-mix(in lch increasing hue, red, transparent)' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))' PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))' +PASS Property color value 'color-mix(in lch decreasing hue, red, white)' +PASS Property color value 'color-mix(in lch decreasing hue, red, black)' +PASS Property color value 'color-mix(in lch decreasing hue, red, transparent)' PASS Property color value 'color-mix(in lch, lch(none none none), lch(none none none))' PASS Property color value 'color-mix(in lch, lch(none none none), lch(50 60 70deg))' PASS Property color value 'color-mix(in lch, lch(10 20 30deg), lch(none none none))' @@ -247,24 +283,36 @@ PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 50deg), okl PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 330deg), oklch(1 0 50deg))' PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 20deg), oklch(1 0 320deg))' PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 320deg), oklch(1 0 20deg))' +PASS Property color value 'color-mix(in oklch shorter hue, red, white)' +PASS Property color value 'color-mix(in oklch shorter hue, red, black)' +PASS Property color value 'color-mix(in oklch shorter hue, red, transparent)' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 40deg), oklch(1 0 60deg))' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 60deg), oklch(1 0 40deg))' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 50deg), oklch(1 0 330deg))' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 330deg), oklch(1 0 50deg))' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 20deg), oklch(1 0 320deg))' PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 320deg), oklch(1 0 20deg))' +PASS Property color value 'color-mix(in oklch longer hue, red, white)' +PASS Property color value 'color-mix(in oklch longer hue, red, black)' +PASS Property color value 'color-mix(in oklch longer hue, red, transparent)' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 40deg), oklch(1 0 60deg))' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 60deg), oklch(1 0 40deg))' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 50deg), oklch(1 0 330deg))' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 330deg), oklch(1 0 50deg))' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 20deg), oklch(1 0 320deg))' PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 320deg), oklch(1 0 20deg))' +PASS Property color value 'color-mix(in oklch increasing hue, red, white)' +PASS Property color value 'color-mix(in oklch increasing hue, red, black)' +PASS Property color value 'color-mix(in oklch increasing hue, red, transparent)' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 40deg), oklch(1 0 60deg))' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 60deg), oklch(1 0 40deg))' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 50deg), oklch(1 0 330deg))' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 330deg), oklch(1 0 50deg))' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 20deg), oklch(1 0 320deg))' PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 320deg), oklch(1 0 20deg))' +PASS Property color value 'color-mix(in oklch decreasing hue, red, white)' +PASS Property color value 'color-mix(in oklch decreasing hue, red, black)' +PASS Property color value 'color-mix(in oklch decreasing hue, red, transparent)' PASS Property color value 'color-mix(in oklch, oklch(none none none), oklch(none none none))' PASS Property color value 'color-mix(in oklch, oklch(none none none), oklch(0.5 0.6 70deg))' PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(none none none))' @@ -838,4 +886,11 @@ PASS Property color value 'color-mix(in srgb, red, blue calc(50%))' PASS Property color value 'color-mix(in srgb, red, blue calc(90%))' PASS Property color value 'color-mix(in srgb, red, blue)' PASS Property color value 'color-mix(in srgb, red calc(50% + (sign(100em - 1px) * 10%)), blue)' +PASS Property color value 'color-mix(in oklch, hsl(0 100% 100%), blue)' +PASS Property color value 'color-mix(in srgb, red)' +PASS Property color value 'color-mix(in srgb, red 50%)' +PASS Property color value 'color-mix(in srgb, red, green, blue)' +PASS Property color value 'color-mix(in srgb, red 50%, green 30%, blue 20%)' +PASS Property color value 'color-mix(in srgb, red 30%, green 60%, blue 90%)' +PASS Property color value 'color-mix(in srgb, red, green, blue, white)' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html index 22e3b9baf17a..91f226f144b4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html @@ -59,6 +59,9 @@ fuzzy_test_computed_color(`color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); fuzzy_test_computed_color(`color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); fuzzy_test_computed_color(`color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.75 0.25)`); + fuzzy_test_computed_color(`color-mix(in hsl shorter hue, red, white)`, `color(srgb 0.875 0.625 0.625)`); + fuzzy_test_computed_color(`color-mix(in hsl shorter hue, red, black)`, `color(srgb 0.375 0.125 0.125)`); + fuzzy_test_computed_color(`color-mix(in hsl shorter hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); fuzzy_test_computed_color(`color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); @@ -67,6 +70,9 @@ fuzzy_test_computed_color(`color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); fuzzy_test_computed_color(`color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); fuzzy_test_computed_color(`color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.25 0.75)`); + fuzzy_test_computed_color(`color-mix(in hsl longer hue, red, white)`, `color(srgb 0.625 0.875 0.875)`); + fuzzy_test_computed_color(`color-mix(in hsl longer hue, red, black)`, `color(srgb 0.125 0.375 0.375)`); + fuzzy_test_computed_color(`color-mix(in hsl longer hue, red, transparent)`, `color(srgb 0 1 1 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); fuzzy_test_computed_color(`color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); @@ -75,6 +81,9 @@ fuzzy_test_computed_color(`color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); fuzzy_test_computed_color(`color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); fuzzy_test_computed_color(`color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.75 0.25)`); + fuzzy_test_computed_color(`color-mix(in hsl increasing hue, red, white)`, `color(srgb 0.875 0.625 0.625)`); + fuzzy_test_computed_color(`color-mix(in hsl increasing hue, red, black)`, `color(srgb 0.375 0.125 0.125)`); + fuzzy_test_computed_color(`color-mix(in hsl increasing hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); @@ -83,6 +92,9 @@ fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.75 0.25)`); + fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, red, white)`, `color(srgb 0.875 0.625 0.625)`); + fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, red, black)`, `color(srgb 0.375 0.125 0.125)`); + fuzzy_test_computed_color(`color-mix(in hsl decreasing hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hsl, hsl(none none none), hsl(none none none))`, `color(srgb 0 0 0)`); fuzzy_test_computed_color(`color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))`, `color(srgb 0.88 0.8 0.72)`); @@ -144,6 +156,9 @@ fuzzy_test_computed_color(`color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); fuzzy_test_computed_color(`color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); fuzzy_test_computed_color(`color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + fuzzy_test_computed_color(`color-mix(in hwb shorter hue, red, white)`, `color(srgb 1 0.5 0.5)`); + fuzzy_test_computed_color(`color-mix(in hwb shorter hue, red, black)`, `color(srgb 0.5 0 0)`); + fuzzy_test_computed_color(`color-mix(in hwb shorter hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); fuzzy_test_computed_color(`color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); @@ -151,6 +166,9 @@ fuzzy_test_computed_color(`color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); fuzzy_test_computed_color(`color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); fuzzy_test_computed_color(`color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + fuzzy_test_computed_color(`color-mix(in hwb longer hue, red, white)`, `color(srgb 0.5 1 1)`); + fuzzy_test_computed_color(`color-mix(in hwb longer hue, red, black)`, `color(srgb 0 0.5 0.5)`); + fuzzy_test_computed_color(`color-mix(in hwb longer hue, red, transparent)`, `color(srgb 0 1 1 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); fuzzy_test_computed_color(`color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); @@ -158,6 +176,9 @@ fuzzy_test_computed_color(`color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); fuzzy_test_computed_color(`color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); fuzzy_test_computed_color(`color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + fuzzy_test_computed_color(`color-mix(in hwb increasing hue, red, white)`, `color(srgb 1 0.5 0.5)`); + fuzzy_test_computed_color(`color-mix(in hwb increasing hue, red, black)`, `color(srgb 0.5 0 0)`); + fuzzy_test_computed_color(`color-mix(in hwb increasing hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); @@ -165,6 +186,9 @@ fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, red, white)`, `color(srgb 1 0.5 0.5)`); + fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, red, black)`, `color(srgb 0.5 0 0)`); + fuzzy_test_computed_color(`color-mix(in hwb decreasing hue, red, transparent)`, `color(srgb 1 0 0 / 0.5)`); fuzzy_test_computed_color(`color-mix(in hwb, hwb(none none none), hwb(none none none))`, `color(srgb 1 0 0)`); fuzzy_test_computed_color(`color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3)`); @@ -225,6 +249,9 @@ fuzzy_test_computed_color(`color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))`, `lch(100 0 10)`); fuzzy_test_computed_color(`color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))`, `lch(100 0 350)`); fuzzy_test_computed_color(`color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))`, `lch(100 0 350)`); + fuzzy_test_computed_color(`color-mix(in lch shorter hue, red, white)`, `lch(77.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch shorter hue, red, black)`, `lch(27.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch shorter hue, red, transparent)`, `lch(54.29 106.847 40.856 / 0.5)`); fuzzy_test_computed_color(`color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))`, `lch(100 0 230)`); fuzzy_test_computed_color(`color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))`, `lch(100 0 230)`); @@ -232,6 +259,9 @@ fuzzy_test_computed_color(`color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))`, `lch(100 0 190)`); fuzzy_test_computed_color(`color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))`, `lch(100 0 170)`); fuzzy_test_computed_color(`color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))`, `lch(100 0 170)`); + fuzzy_test_computed_color(`color-mix(in lch longer hue, red, white)`, `lch(77.145 53.4271 220.856)`); + fuzzy_test_computed_color(`color-mix(in lch longer hue, red, black)`, `lch(27.145 53.4271 220.856)`); + fuzzy_test_computed_color(`color-mix(in lch longer hue, red, transparent)`, `lch(54.29 106.847 220.856 / 0.5)`); fuzzy_test_computed_color(`color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))`, `lch(100 0 50)`); fuzzy_test_computed_color(`color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))`, `lch(100 0 230)`); @@ -239,6 +269,9 @@ fuzzy_test_computed_color(`color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))`, `lch(100 0 10)`); fuzzy_test_computed_color(`color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))`, `lch(100 0 170)`); fuzzy_test_computed_color(`color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))`, `lch(100 0 350)`); + fuzzy_test_computed_color(`color-mix(in lch increasing hue, red, white)`, `lch(77.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch increasing hue, red, black)`, `lch(27.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch increasing hue, red, transparent)`, `lch(54.29 106.847 40.856 / 0.5)`); fuzzy_test_computed_color(`color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))`, `lch(100 0 230)`); fuzzy_test_computed_color(`color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))`, `lch(100 0 50)`); @@ -246,6 +279,9 @@ fuzzy_test_computed_color(`color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))`, `lch(100 0 190)`); fuzzy_test_computed_color(`color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))`, `lch(100 0 350)`); fuzzy_test_computed_color(`color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))`, `lch(100 0 170)`); + fuzzy_test_computed_color(`color-mix(in lch decreasing hue, red, white)`, `lch(77.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch decreasing hue, red, black)`, `lch(27.145 53.4271 40.856)`); + fuzzy_test_computed_color(`color-mix(in lch decreasing hue, red, transparent)`, `lch(54.29 106.847 40.856 / 0.5)`); fuzzy_test_computed_color(`color-mix(in lch, lch(none none none), lch(none none none))`, `lch(none none none)`); fuzzy_test_computed_color(`color-mix(in lch, lch(none none none), lch(50 60 70deg))`, `lch(50 60 70)`); @@ -308,6 +344,9 @@ fuzzy_test_computed_color(`color-mix(in oklch shorter hue, oklch(1 0 330deg), oklch(1 0 50deg))`, `oklch(1 0 10)`); fuzzy_test_computed_color(`color-mix(in oklch shorter hue, oklch(1 0 20deg), oklch(1 0 320deg))`, `oklch(1 0 350)`); fuzzy_test_computed_color(`color-mix(in oklch shorter hue, oklch(1 0 320deg), oklch(1 0 20deg))`, `oklch(1 0 350)`); + fuzzy_test_computed_color(`color-mix(in oklch shorter hue, red, white)`, `oklch(0.81398 0.128877 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch shorter hue, red, black)`, `oklch(0.313983 0.128852 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch shorter hue, red, transparent)`, `oklch(0.627966 0.257704 29.2346 / 0.5)`); fuzzy_test_computed_color(`color-mix(in oklch longer hue, oklch(1 0 40deg), oklch(1 0 60deg))`, `oklch(1 0 230)`); fuzzy_test_computed_color(`color-mix(in oklch longer hue, oklch(1 0 60deg), oklch(1 0 40deg))`, `oklch(1 0 230)`); @@ -315,6 +354,9 @@ fuzzy_test_computed_color(`color-mix(in oklch longer hue, oklch(1 0 330deg), oklch(1 0 50deg))`, `oklch(1 0 190)`); fuzzy_test_computed_color(`color-mix(in oklch longer hue, oklch(1 0 20deg), oklch(1 0 320deg))`, `oklch(1 0 170)`); fuzzy_test_computed_color(`color-mix(in oklch longer hue, oklch(1 0 320deg), oklch(1 0 20deg))`, `oklch(1 0 170)`); + fuzzy_test_computed_color(`color-mix(in oklch longer hue, red, white)`, `oklch(0.81398 0.128877 209.235)`); + fuzzy_test_computed_color(`color-mix(in oklch longer hue, red, black)`, `oklch(0.313983 0.128852 209.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch longer hue, red, transparent)`, `oklch(0.627966 0.257704 209.2346 / 0.5)`); fuzzy_test_computed_color(`color-mix(in oklch increasing hue, oklch(1 0 40deg), oklch(1 0 60deg))`, `oklch(1 0 50)`); fuzzy_test_computed_color(`color-mix(in oklch increasing hue, oklch(1 0 60deg), oklch(1 0 40deg))`, `oklch(1 0 230)`); @@ -322,6 +364,9 @@ fuzzy_test_computed_color(`color-mix(in oklch increasing hue, oklch(1 0 330deg), oklch(1 0 50deg))`, `oklch(1 0 10)`); fuzzy_test_computed_color(`color-mix(in oklch increasing hue, oklch(1 0 20deg), oklch(1 0 320deg))`, `oklch(1 0 170)`); fuzzy_test_computed_color(`color-mix(in oklch increasing hue, oklch(1 0 320deg), oklch(1 0 20deg))`, `oklch(1 0 350)`); + fuzzy_test_computed_color(`color-mix(in oklch increasing hue, red, white)`, `oklch(0.81398 0.128877 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch increasing hue, red, black)`, `oklch(0.313983 0.128852 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch increasing hue, red, transparent)`, `oklch(0.627966 0.257704 29.2346 / 0.5)`); fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, oklch(1 0 40deg), oklch(1 0 60deg))`, `oklch(1 0 230)`); fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, oklch(1 0 60deg), oklch(1 0 40deg))`, `oklch(1 0 50)`); @@ -329,6 +374,9 @@ fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, oklch(1 0 330deg), oklch(1 0 50deg))`, `oklch(1 0 190)`); fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, oklch(1 0 20deg), oklch(1 0 320deg))`, `oklch(1 0 350)`); fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, oklch(1 0 320deg), oklch(1 0 20deg))`, `oklch(1 0 170)`); + fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, red, white)`, `oklch(0.81398 0.128877 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, red, black)`, `oklch(0.313983 0.128852 29.2346)`); + fuzzy_test_computed_color(`color-mix(in oklch decreasing hue, red, transparent)`, `oklch(0.627966 0.257704 29.2346 / 0.5)`); fuzzy_test_computed_color(`color-mix(in oklch, oklch(none none none), oklch(none none none))`, `oklch(none none none)`); fuzzy_test_computed_color(`color-mix(in oklch, oklch(none none none), oklch(0.5 0.6 70deg))`, `oklch(0.5 0.6 70)`); @@ -512,14 +560,25 @@ fuzzy_test_computed_color(`color-mix(in srgb, red 10%, blue)`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p1 specified fuzzy_test_computed_color(`color-mix(in srgb, red calc(50%), blue)`, `color(srgb 0.5 0 0.5)`); // `color-mix(in srgb, red, blue)` only p1 specified, is `calc()` is 50% fuzzy_test_computed_color(`color-mix(in srgb, red calc(10%), blue)`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p1 specified, is `calc()` - fuzzy_test_computed_color(`color-mix(in srgb, red, blue 50%)`, `color(srgb 0.5 0 0.5)`); // `color-mix(in srgb, red, blue)` only p2 specified, is 50% - fuzzy_test_computed_color(`color-mix(in srgb, red, blue 90%)`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p2 specified + fuzzy_test_computed_color(`color-mix(in srgb, red, blue 50%)`, `color(srgb 0.5 0 0.5)`); // `color-mix(in srgb, red, blue)` only p2 specified, is 50% + fuzzy_test_computed_color(`color-mix(in srgb, red, blue 90%)`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p2 specified fuzzy_test_computed_color(`color-mix(in srgb, red, blue calc(50%))`, `color(srgb 0.5 0 0.5)`); // `color-mix(in srgb, red, blue)` only p2 specified, is `calc()`, is 50% - fuzzy_test_computed_color(`color-mix(in srgb, red, blue calc(90%))`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p2 specified, is `calc()` + fuzzy_test_computed_color(`color-mix(in srgb, red, blue calc(90%))`, `color(srgb 0.1 0 0.9)`); // `color-mix(in srgb, red 10%, blue)` only p2 specified, is `calc()` fuzzy_test_computed_color(`color-mix(in srgb, red, blue)`, `color(srgb 0.5 0 0.5)`); // `color-mix(in srgb, red, blue)` neither is specified // Percent with calc that uses font-relative length. fuzzy_test_computed_color(`color-mix(in srgb, red calc(50% + (sign(100em - 1px) * 10%)), blue)`, `color(srgb 0.6 0 0.4)`); + + // Carry forward hue that became powerless due to conversion of colorspace + fuzzy_test_computed_color(`color-mix(in oklch, hsl(0 100% 100%), blue)`, `oklch(0.726007 0.156607 264.052)`); + + // color-mix() with 1 or more colors. + fuzzy_test_computed_color(`color-mix(in srgb, red)`, `rgb(255, 0, 0)`); + fuzzy_test_computed_color(`color-mix(in srgb, red 50%)`, `rgba(255, 0, 0, 0.5)`); + fuzzy_test_computed_color(`color-mix(in srgb, red, green, blue)`, `color(srgb 0.333333 0.167320 0.333333)`); + fuzzy_test_computed_color(`color-mix(in srgb, red 50%, green 30%, blue 20%)`, `color(srgb 0.5 0.150588 0.2)`); + fuzzy_test_computed_color(`color-mix(in srgb, red 30%, green 60%, blue 90%)`, `color(srgb 0.166667 0.167320 0.5)`); + fuzzy_test_computed_color(`color-mix(in srgb, red, green, blue, white)`, `color(srgb 0.5 0.375490 0.5)`); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function-expected.txt index 8f5b79714ea5..d95d2caf77f5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function-expected.txt @@ -8,5 +8,12 @@ PASS Property background-color value 'contrast-color(color(srgb 10 10 10))' PASS Property background-color value 'contrast-color(color(srgb -10 -10 -10))' PASS Property background-color value 'contrast-color(contrast-color(pink))' PASS Property background-color value 'contrast-color(currentcolor)' -PASS Property background-color value 'contrast-color(color(srgb calc(1 + (sign(20cqw - 10px) * 1)) calc(1 + (sign(20cqw - 10px) * 1)) calc(1 + (sign(20cqw - 10px) * 1))))' +PASS Property background-color value 'contrast-color(color(srgb calc(1 + 1 / 1) calc(1 + 1 / 1) calc(1 + 1 / 1)))' +PASS Property background-color value 'color-mix(in srgb, contrast-color(blue) 100%, purple)' +PASS Property background-color value 'rgb(from contrast-color(blue) r g b)' +PASS Property background-color value 'contrast-color(color-mix(blue, green))' +PASS Property background-color value 'contrast-color(rgb(from orange r g b))' +PASS Property background-color value 'contrast-color(buttonface)' +PASS Property background-color value 'contrast-color(transparent)' +PASS Property background-color value 'contrast-color(rgba(255, 255, 255, 0.2))' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function.html index 57537dd929fc..f9ff256a66ff 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function.html @@ -1,6 +1,4 @@ - - Test CSS Color Module 5 contrast-color() computed value @@ -8,18 +6,7 @@ - - - -
-
-
+
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl-expected.txt index 70b2eaaa8646..5da06444ba5e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl-expected.txt @@ -3751,5 +3751,5 @@ PASS Property color value 'hsla(60deg 100% 37.5% / calc(50% + (sign(1em - 10px) PASS Property color value 'hsl(60 100 37.5 / calc(0.75 + (sign(1em - 10px) * 0.1)))' PASS Property color value 'hsla(60 100 37.5 / calc(0.75 + (sign(1em - 10px) * 0.1)))' PASS Property color value 'hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 51%)' -PASS Property color value 'hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 52%)' +FAIL Property color value 'hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 52%)' assert_equals: expected "rgba(191, 128, 0, 0.52)" but got "rgba(191, 127, 0, 0.52)" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl.html index 6dbd95e5f5fb..034a212b4787 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl.html @@ -3787,9 +3787,9 @@ // Ensure that `calc` values work with dynamically changing relative units (slighly different alpha values to make test harness not complain about duplicate tests). document.getElementById("container").style.width = "1000px"; -test_computed_value("color", "hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 51%)", "rgba(191, 191, 0, 0.51)"); +test_computed_value("color", "hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 51%)", "rgba(191, 191, 0, 0.51)"); document.getElementById("container").style.width = "100px"; -test_computed_value("color", "hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 52%)", "rgba(191, 127, 0, 0.52)"); +test_computed_value("color", "hsla(calc(50deg + (sign(2cqw - 10px) * 10deg)), 100%, 37.5%, 52%)", "rgba(191, 128, 0, 0.52)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hwb.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hwb.html index cabd7d323c03..035792480f2e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hwb.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hwb.html @@ -88,7 +88,7 @@ // Ensure that `calc` values work with dynamically changing relative units (slighly different alpha values to make test harness not complain about duplicate tests). document.getElementById("container").style.width = "1000px"; -test_computed_value("color", "hwb(calc(110deg + (sign(2cqw - 10px) * 10deg)) 30 50 / 51%)", "rgba(77, 128, 77, 0.51)"); +test_computed_value("color", "hwb(calc(110deg + (sign(2cqw - 10px) * 10deg)) 30 50 / 51%)", "rgba(77, 128, 77, 0.51)"); document.getElementById("container").style.width = "100px"; test_computed_value("color", "hwb(calc(110deg + (sign(2cqw - 10px) * 10deg)) 30 50 / 52%)", "rgba(94, 128, 77, 0.52)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt index 130fa479a4fd..39c3beae548d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color-expected.txt @@ -60,27 +60,12 @@ PASS Property color value 'rgb(from rgb(100 110 120 / 0.8) calc(r + 1) calc(g + PASS Property color value 'rgb(from rebeccapurple calc((r / 255) * 100%) calc((g / 255) * 100%) calc((b / 255) * 100%) / calc(alpha * 100%))' PASS Property color value 'rgb(from rgb(from rebeccapurple r g b / calc(alpha + 0.5)) r g b / calc(alpha - 0.5))' PASS Property color value 'rgb(from rgb(from rebeccapurple r g b / calc(alpha - 1.5)) r g b / calc(alpha + 0.5))' -FAIL Property color value 'rgb(from rebeccapurple none none none)' Colors do not match. -Actual: color(srgb none none none) -Expected: color(srgb 0 0 0). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 0 -FAIL Property color value 'rgb(from rebeccapurple none none none / none)' Colors do not match. -Actual: color(srgb none none none / none) -Expected: color(srgb 0 0 0 / none). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 0 -FAIL Property color value 'rgb(from rebeccapurple r g none)' Colors do not match. -Actual: color(srgb 0.4 0.2 none) -Expected: color(srgb 0.4 0.2 0). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 2 -FAIL Property color value 'rgb(from rebeccapurple r g none / alpha)' Colors do not match. -Actual: color(srgb 0.4 0.2 none) -Expected: color(srgb 0.4 0.2 0). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 2 +PASS Property color value 'rgb(from rebeccapurple none none none)' +PASS Property color value 'rgb(from rebeccapurple none none none / none)' +PASS Property color value 'rgb(from rebeccapurple r g none)' +PASS Property color value 'rgb(from rebeccapurple r g none / alpha)' PASS Property color value 'rgb(from rebeccapurple r g b / none)' -FAIL Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' Colors do not match. -Actual: color(srgb 0.2 0.4 none / 0.8) -Expected: color(srgb 0.2 0.4 0 / 0.8). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 4 got 3 +PASS Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' PASS Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g b / none)' PASS Property color value 'rgb(from rgb(none none none) r g b)' PASS Property color value 'rgb(from rgb(none none none / none) r g b / alpha)' @@ -89,6 +74,10 @@ PASS Property color value 'rgb(from rgb(20% 40% 60% / none) r g b / alpha)' PASS Property color value 'color-mix(in srgb, rgb(from rebeccapurple none g b), rebeccapurple)' PASS Property background-color value 'rgb(from currentColor r g b)' PASS Property color value 'rgb(from color-mix(in srgb, red, red) r g b / alpha)' +PASS Property background-color value 'rgb(from color-mix(in srgb, currentColor, red) r g b / alpha)' +PASS Property background-color value 'rgb(from rgb(from currentColor r g b) r g b)' +PASS Property color value 'light-dark(rgb(from rebeccapurple r g b), rgb(from rebeccapurple r g b))' +PASS Property color value 'light-dark(color-mix(in srgb, rgb(from rebeccapurple none g b), rebeccapurple), color-mix(in srgb, rgb(from rebeccapurple none g b), rebeccapurple))' PASS Property color value 'hsl(from rebeccapurple h s l)' PASS Property color value 'hsl(from rebeccapurple h s l / alpha)' PASS Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' @@ -130,6 +119,14 @@ PASS Property color value 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' PASS Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' PASS Property color value 'hsl(from hsl(20 30 40 / 0.8) calc(h + 1) calc(s + 1) calc(l + 1) / calc(alpha + 0.01))' PASS Property color value 'hsl(from rebeccapurple calc((h / 360) * 360deg) calc((s / 100) * 100%) calc((l / 100) * 100%) / calc(alpha * 100%))' +PASS Property color value 'hsl(from rebeccapurple h s calc(50% * l / 100))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(l) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(sin(l)) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(asin(sin(l))) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(clamp(0, l, 50)) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(l * 1) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(l * (50rad / 50)) + 1) * 50))' +PASS Property color value 'hsl(from hsl(50 50 50) h s calc((sin(l * (50rad / (50deg * (180 / pi)))) + 1) * 50))' PASS Property color value 'hsl(from hsl(from rebeccapurple h s l / calc(alpha + 0.5)) h s l / calc(alpha - 0.5))' PASS Property color value 'hsl(from hsl(from rebeccapurple h s l / calc(alpha - 1.5)) h s l / calc(alpha + 0.5))' PASS Property color value 'hsl(from rebeccapurple none none none)' @@ -148,6 +145,7 @@ PASS Property color value 'hsl(from hsl(120deg 20% 50% / none) h s l / alpha)' PASS Property color value 'hsl(from hsl(none 20% 50% / .5) h s l / alpha)' PASS Property color value 'color-mix(in hsl, hsl(from rebeccapurple none s l), rebeccapurple)' PASS Property background-color value 'hsl(from currentColor h s l)' +PASS Property background-color value 'hsl(from currentColor calc((h / 360) * 360deg) s l)' PASS Property color value 'hsl(from color-mix(in srgb, red, red) h s l / alpha)' PASS Property color value 'hwb(from rebeccapurple h w b)' PASS Property color value 'hwb(from rebeccapurple h w b / alpha)' @@ -353,6 +351,8 @@ PASS Property color value 'lch(from lch(0.7 45 30) calc(l) calc(c) calc(h))' PASS Property color value 'lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' PASS Property color value 'lch(from lch(50 5 10 / 0.8) calc(l + 1) calc(c + 1) calc(h + 1) / calc(alpha + 0.01))' PASS Property color value 'lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))' +PASS Property color value 'lch(from red calc((49.44 - l) * infinity) 0 0)' +PASS Property color value 'lch(from blue calc((49.44 - l) * infinity) 0 0)' PASS Property color value 'lch(from lch(from lch(0.7 45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))' PASS Property color value 'lch(from lch(from lch(0.7 45 30) l c h / calc(alpha - 1.5)) l c h / calc(alpha + 0.5))' PASS Property color value 'lch(from lch(0.7 45 30) none none none)' @@ -413,6 +413,15 @@ PASS Property color value 'oklch(from oklch(0.5 .05 0.1 / 0.8) calc(l + 0.01) ca PASS Property color value 'oklch(from oklch(0.7 0.45 30) calc(l * 100%) calc((c / 0.4) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))' PASS Property color value 'oklch(from oklch(from oklch(0.7 0.45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))' PASS Property color value 'oklch(from oklch(from oklch(0.7 0.45 30) l c h / calc(alpha - 1.5)) l c h / calc(alpha + 0.5))' +PASS Property color value 'oklch(from blue .5 .3 180deg)' +PASS Property color value 'oklch(from blue .5 .3 .5turn)' +PASS Property color value 'oklch(from blue .5 .3 3.14159rad)' +PASS Property color value 'oklch(from blue .5 .3 200grad)' +PASS Property color value 'oklch(from blue .5 .3 calc(120deg + 60deg))' +PASS Property color value 'oklch(from blue .5 .3 calc(90deg + 1.5707rad))' +PASS Property color value 'oklch(from blue .5 .3 calc(0.25turn + 100grad))' +PASS Property color value 'oklch(from blue .5 .3 calc(180deg))' +PASS Property color value 'oklch(from blue .5 .3 calc(0.2turn + 0.3turn))' PASS Property color value 'oklch(from oklch(0.7 0.45 30) none none none)' PASS Property color value 'oklch(from oklch(0.7 0.45 30) none none none / none)' PASS Property color value 'oklch(from oklch(0.7 0.45 30) l c none)' @@ -1152,4 +1161,5 @@ PASS Property color value 'LCH(from var(--accent) l c calc(h + 180))' PASS Property color value 'lch(from var(--mycolor) l 0 h)' PASS Property color value 'var(--mygray)' PASS Property color value 'lch(from var(--mygray) l 30 h)' +PASS Property color value 'LCH(from var(--accent) l c calc(h + 180 * sibling-index()))' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html index bfb5f13b3d8c..2bb1e8572eda 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-relative-color.html @@ -120,12 +120,12 @@ // Testing with 'none'. Missing components are resolved to zero during color space conversion. // https://drafts.csswg.org/css-color-4/#missing - fuzzy_test_computed_color(`rgb(from rebeccapurple none none none)`, `color(srgb 0 0 0)`); - fuzzy_test_computed_color(`rgb(from rebeccapurple none none none / none)`, `color(srgb 0 0 0 / none)`); - fuzzy_test_computed_color(`rgb(from rebeccapurple r g none)`, `color(srgb 0.4 0.2 0)`); - fuzzy_test_computed_color(`rgb(from rebeccapurple r g none / alpha)`, `color(srgb 0.4 0.2 0)`); + fuzzy_test_computed_color(`rgb(from rebeccapurple none none none)`, `color(srgb none none none)`); + fuzzy_test_computed_color(`rgb(from rebeccapurple none none none / none)`, `color(srgb none none none / none)`); + fuzzy_test_computed_color(`rgb(from rebeccapurple r g none)`, `color(srgb 0.4 0.2 none)`); + fuzzy_test_computed_color(`rgb(from rebeccapurple r g none / alpha)`, `color(srgb 0.4 0.2 none)`); fuzzy_test_computed_color(`rgb(from rebeccapurple r g b / none)`, `color(srgb 0.4 0.2 0.6 / none)`); - fuzzy_test_computed_color(`rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)`, `color(srgb 0.2 0.4 0 / 0.8)`); + fuzzy_test_computed_color(`rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)`, `color(srgb 0.2 0.4 none / 0.8)`); fuzzy_test_computed_color(`rgb(from rgb(20% 40% 60% / 80%) r g b / none)`, `color(srgb 0.2 0.4 0.6 / none)`); fuzzy_test_computed_color(`rgb(from rgb(none none none) r g b)`, `color(srgb 0 0 0)`); fuzzy_test_computed_color(`rgb(from rgb(none none none / none) r g b / alpha)`, `color(srgb 0 0 0 / 0)`); @@ -139,6 +139,16 @@ // color-mix fuzzy_test_computed_color(`rgb(from color-mix(in srgb, red, red) r g b / alpha)`, `color(srgb 1 0 0)`); + // color-mix combined with 'currentColor' + fuzzy_test_computed_color_using_currentcolor(`rgb(from color-mix(in srgb, currentColor, red) r g b / alpha)`, `color(srgb 0.7 0.1 0.3)`, `rebeccapurple`); + + // Nesting combined with 'currentColor' + fuzzy_test_computed_color_using_currentcolor(`rgb(from rgb(from currentColor r g b) r g b)`, `color(srgb 0.4 0.2 0.6)`, `rebeccapurple`); + + // Nesting inside light-dark() + fuzzy_test_computed_color(`light-dark(rgb(from rebeccapurple r g b), rgb(from rebeccapurple r g b))`, `color(srgb 0.4 0.2 0.6)`); + fuzzy_test_computed_color(`light-dark(color-mix(in srgb, rgb(from rebeccapurple none g b), rebeccapurple), color-mix(in srgb, rgb(from rebeccapurple none g b), rebeccapurple))`, `color(srgb 0.4 0.2 0.6)`); + // hsl(from ...) // Testing no modifications. @@ -194,6 +204,16 @@ fuzzy_test_computed_color(`hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))`, `color(srgb 0.2 0.4 0.6 / 0.8)`); fuzzy_test_computed_color(`hsl(from hsl(20 30 40 / 0.8) calc(h + 1) calc(s + 1) calc(l + 1) / calc(alpha + 0.01))`, `color(srgb 0.537 0.372 0.283 / 0.81)`); // hsl(21 31 41) fuzzy_test_computed_color(`hsl(from rebeccapurple calc((h / 360) * 360deg) calc((s / 100) * 100%) calc((l / 100) * 100%) / calc(alpha * 100%))`, `color(srgb 0.4 0.2 0.6)`); + fuzzy_test_computed_color(`hsl(from rebeccapurple h s calc(50% * l / 100))`, `color(srgb 0.2 0.1 0.3)`); + + // Component keywords resolve to . + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(l) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(sin(l)) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(asin(sin(l))) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(clamp(0, l, 50)) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(l * 1) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(l * (50rad / 50)) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); + fuzzy_test_computed_color(`hsl(from hsl(50 50 50) h s calc((sin(l * (50rad / (50deg * (180 / pi)))) + 1) * 50))`, `color(srgb 0.553 0.492 0.184)`); // Alpha is clamped to [0,1] fuzzy_test_computed_color(`hsl(from hsl(from rebeccapurple h s l / calc(alpha + 0.5)) h s l / calc(alpha - 0.5))`, `color(srgb 0.4 0.2 0.6 / 0.5)`); @@ -219,6 +239,7 @@ // Testing with 'currentColor' fuzzy_test_computed_color_using_currentcolor(`hsl(from currentColor h s l)`, `color(srgb 0.4 0.2 0.6)`); + fuzzy_test_computed_color_using_currentcolor(`hsl(from currentColor calc((h / 360) * 360deg) s l)`, `color(srgb 0.2 0.2 0.6)`); // color-mix fuzzy_test_computed_color(`hsl(from color-mix(in srgb, red, red) h s l / alpha)`, `color(srgb 1 0 0)`); @@ -516,6 +537,8 @@ fuzzy_test_computed_color(`lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `lch(0.7 45 30 / 0.4)`); fuzzy_test_computed_color(`lch(from lch(50 5 10 / 0.8) calc(l + 1) calc(c + 1) calc(h + 1) / calc(alpha + 0.01))`, `lch(51 6 11 / 0.81)`); fuzzy_test_computed_color(`lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))`, `lch(0.7 45 30)`); + fuzzy_test_computed_color(`lch(from red calc((49.44 - l) * infinity) 0 0)`, `lch(0 0 0)`); + fuzzy_test_computed_color(`lch(from blue calc((49.44 - l) * infinity) 0 0)`, `lch(100 0 0)`); // Alpha is clamped to [0,1] fuzzy_test_computed_color(`lch(from lch(from lch(0.7 45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))`, `lch(0.7 45 30 / 0.5)`); @@ -606,6 +629,17 @@ fuzzy_test_computed_color(`oklch(from oklch(from oklch(0.7 0.45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))`, `oklch(0.7 0.45 30 / 0.5)`); fuzzy_test_computed_color(`oklch(from oklch(from oklch(0.7 0.45 30) l c h / calc(alpha - 1.5)) l c h / calc(alpha + 0.5))`, `oklch(0.7 0.45 30 / 0.5)`); + // Testing unit conversion with relative colors + fuzzy_test_computed_color(`oklch(from blue .5 .3 180deg)`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 .5turn)`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 3.14159rad)`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 200grad)`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 calc(120deg + 60deg))`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 calc(90deg + 1.5707rad))`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 calc(0.25turn + 100grad))`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 calc(180deg))`, `oklch(0.5 0.3 180)`); + fuzzy_test_computed_color(`oklch(from blue .5 .3 calc(0.2turn + 0.3turn))`, `oklch(0.5 0.3 180)`); + // Testing with 'none'. fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30) none none none)`, `oklch(none none none)`); fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30) none none none / none)`, `oklch(none none none / none)`); @@ -858,6 +892,7 @@ fuzzy_test_computed_color(`lch(from var(--mycolor) l 0 h)`, `lch(62.75 0 326.96)`, 0.02); fuzzy_test_computed_color(`var(--mygray)`, `lch(62.75 0 326.96)`, 0.02); fuzzy_test_computed_color(`lch(from var(--mygray) l 30 h)`, `lch(62.75 30 326.96)`, 0.02); + fuzzy_test_computed_color(`LCH(from var(--accent) l c calc(h + 180 * sibling-index()))`, `lch(65.49 39.45 10.11)`, 0.02); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-rgb.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-rgb.html index f08a2224955e..2f6e037b2a64 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-rgb.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-rgb.html @@ -143,7 +143,7 @@ // Ensure that `calc` values work with dynamically changing relative units (slighly different alpha values to make test harness not complain about duplicate tests). document.getElementById("container").style.width = "1000px"; -test_computed_value("color", "rgba(calc(50% + (sign(2cqw - 10px) * 10%)), 0%, 0%, 51%)", "rgba(153, 0, 0, 0.51)"); +test_computed_value("color", "rgba(calc(50% + (sign(2cqw - 10px) * 10%)), 0%, 0%, 51%)", "rgba(153, 0, 0, 0.51)"); document.getElementById("container").style.width = "100px"; test_computed_value("color", "rgba(calc(50% + (sign(2cqw - 10px) * 10%)), 0%, 0%, 52%)", "rgba(102, 0, 0, 0.52)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function-expected.txt index afd99dcff7c9..d72156a5639a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function-expected.txt @@ -168,4 +168,10 @@ PASS e.style['color'] = "color-mix(in xyz-d65 longer hue, color(xyz-d65 .1 .2 .3 PASS e.style['color'] = "color-mix(in xyz-d65 color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should not set the property value PASS e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) color(xyz-d65 .5 .6 .7))" should not set the property value PASS e.style['color'] = "color-mix(color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7), in xyz-d65)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, red 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, red 0%, green 0%, blue 0%)" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, red -10%, green 50%, blue)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) -10%, hsl(30deg 30% 40%), hsl(60deg 20% 30%))" should not set the property value +PASS e.style['color'] = "color-mix(in srgb, red 150%, green 50%, blue)" should not set the property value +PASS e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 150%, hsl(30deg 30% 40%), hsl(60deg 20% 30%))" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function.html index 3d6fd06c92be..8aae9fb736ab 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function.html @@ -82,6 +82,14 @@ test_invalid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) color(${colorSpace} .5 .6 .7))`); // Missing comma between colors. test_invalid_value(`color`, `color-mix(color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7), in ${colorSpace})`); // Interpolation method not at the beginning. } + + // color-mix() with 1 or more colors. + test_invalid_value(`color`, `color-mix(in srgb, red 0%)`); + test_invalid_value(`color`, `color-mix(in srgb, red 0%, green 0%, blue 0%)`); + test_invalid_value(`color`, `color-mix(in srgb, red -10%, green 50%, blue)`); + test_invalid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) -10%, hsl(30deg 30% 40%), hsl(60deg 20% 30%))`); + test_invalid_value(`color`, `color-mix(in srgb, red 150%, green 50%, blue)`); + test_invalid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 150%, hsl(30deg 30% 40%), hsl(60deg 20% 30%))`); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb-expected.txt index 9aedccdd2cde..565d8fefee57 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb-expected.txt @@ -6,7 +6,9 @@ PASS e.style['color'] = "rgb(255, 255, 255, none)" should not set the property v PASS e.style['color'] = "rgb(10%, 50%, 0)" should not set the property value PASS e.style['color'] = "rgb(255, 50%, 0%)" should not set the property value PASS e.style['color'] = "rgb(0, 0 0)" should not set the property value +PASS e.style['color'] = "rgb(0 0, 0)" should not set the property value PASS e.style['color'] = "rgb(,0, 0, 0)" should not set the property value +PASS e.style['color'] = "rgb(0, 0, 0,)" should not set the property value PASS e.style['color'] = "rgb(0, 0,, 0)" should not set the property value PASS e.style['color'] = "rgb(0, 0, 0deg)" should not set the property value PASS e.style['color'] = "rgb(0, 0, light)" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb.html index 08d4c6735aea..f1d54daf7214 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-rgb.html @@ -22,7 +22,9 @@ ["rgb(10%, 50%, 0)", "Values must be all numbers or all percentages"], ["rgb(255, 50%, 0%)", "Values must be all numbers or all percentages"], ["rgb(0, 0 0)", "Comma optional syntax requires no commas at all"], + ["rgb(0 0, 0)", "Comma optional syntax requires no commas at all"], ["rgb(,0, 0, 0)", "Leading commas are invalid"], + ["rgb(0, 0, 0,)", "Trailing commas are invalid"], ["rgb(0, 0,, 0)", "Double commas are invalid"], ["rgb(0, 0, 0deg)", "Angles are not accepted in the rgb function"], ["rgb(0, 0, light)", "Keywords are not accepted in the rgb function"], diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function-expected.txt index 76ac81271f53..502820739810 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function-expected.txt @@ -630,4 +630,15 @@ PASS e.style['color'] = "color-mix(in srgb, red, blue 50%)" should set PASS e.style['color'] = "color-mix(in srgb, red, blue 90%)" should set the property value PASS e.style['color'] = "color-mix(in srgb, red, blue calc(50%))" should set the property value PASS e.style['color'] = "color-mix(in srgb, red, blue)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red 100%)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red 50%)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red, green, blue)" should set the property value +PASS e.style['color'] = "color-mix(in hsl, red, green, blue)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red 50%, green 30%, blue 20%)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red 30%, green 60%, blue 90%)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red 50%, green, blue)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red, green 25%, blue 25%)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, red, green, blue, white)" should set the property value +PASS e.style['color'] = "color-mix(in srgb, currentcolor, red, blue)" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html index 799ad17471d5..fb563717fb75 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html @@ -28,7 +28,7 @@ fuzzy_test_valid_color(`color-mix(in hsl, red calc(20%), blue)`, `color-mix(in hsl, red calc(20%), blue)`); fuzzy_test_valid_color(`color-mix(in hsl, red calc(var(--v)*1%), blue)`, `color-mix(in hsl, red calc(var(--v)*1%), blue)`); fuzzy_test_valid_color(`color-mix(in hsl, currentcolor, blue)`, `color-mix(in hsl, currentcolor, blue)`); - fuzzy_test_valid_color(`color-mix(in hsl, red 60%, blue 40%)`, `color-mix(in hsl, red 60%, blue)`); + fuzzy_test_valid_color(`color-mix(in hsl, red 60%, blue 40%)`, `color-mix(in hsl, red 60%, blue 40%)`); fuzzy_test_valid_color(`color-mix(in hsl, red 50%, blue)`, `color-mix(in hsl, red, blue)`); fuzzy_test_valid_color(`color-mix(in hsl, red, blue 50%)`, `color-mix(in hsl, red, blue)`); fuzzy_test_valid_color(`color-mix(in lch decreasing hue, red, hsl(120, 100%, 50%))`, `color-mix(in lch decreasing hue, red, rgb(0, 255, 0))`); @@ -39,24 +39,24 @@ fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71))`, 1); fuzzy_test_valid_color(`color-mix(in hsl, 50% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71))`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), 50% hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71) 75%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `color-mix(in hsl, rgb(46, 56, 46) 30%, rgb(133, 102, 71) 90%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `color-mix(in hsl, rgb(46, 56, 46) 12.5%, rgb(133, 102, 71) 37.5%)`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 0%, rgb(133, 102, 71))`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 0%, rgb(133, 102, 71) 100%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgba(133, 102, 71, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8))`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgba(133, 102, 71, 0.8) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8) 75%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 30%, rgba(133, 102, 71, 0.8) 90%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 12.5%, rgba(133, 102, 71, 0.8) 37.5%)`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 0%, rgba(133, 102, 71, 0.8))`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 0%, rgba(133, 102, 71, 0.8) 100%)`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color-mix(in hsl, rgb(191, 149, 64), rgb(191, 191, 64))`, 1); fuzzy_test_valid_color(`color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color-mix(in hsl, rgb(191, 191, 64), rgb(191, 149, 64))`, 1); @@ -106,39 +106,39 @@ fuzzy_test_valid_color(`color-mix(hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(rgb(46, 56, 46), rgb(133, 102, 71))`); // Missing interpolation method. - fuzzy_test_valid_color(`color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0))`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, 1); + fuzzy_test_valid_color(`color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77))`, 1); fuzzy_test_valid_color(`color-mix(in hwb, 50% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77))`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), 50% hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77) 75%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `color-mix(in hwb, rgb(26, 204, 26) 30%, rgb(153, 115, 77) 90%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `color-mix(in hwb, rgb(26, 204, 26) 12.5%, rgb(153, 115, 77) 37.5%)`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 0%, rgb(153, 115, 77))`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 0%, rgb(153, 115, 77) 100%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4), rgba(153, 115, 77, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgba(153, 115, 77, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 75%, rgba(153, 115, 77, 0.8))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8) 75%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgba(153, 115, 77, 0.8) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 75%, rgba(153, 115, 77, 0.8) 25%)`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8) 75%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 30%, rgba(153, 115, 77, 0.8) 90%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 12.5%, rgba(153, 115, 77, 0.8) 37.5%)`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 0%, rgba(153, 115, 77, 0.8))`, 1); + fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 0%, rgba(153, 115, 77, 0.8) 100%)`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color-mix(in hwb, rgb(153, 128, 77), rgb(153, 153, 77))`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color-mix(in hwb, rgb(153, 153, 77), rgb(153, 128, 77))`, 1); @@ -185,40 +185,40 @@ fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, `color-mix(in hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0.5))`, 1); fuzzy_test_valid_color(`color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, `color-mix(in hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0))`, 1); - fuzzy_test_valid_color(`color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0))`); - fuzzy_test_valid_color(`color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0))`); + fuzzy_test_valid_color(`color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); + fuzzy_test_valid_color(`color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); fuzzy_test_valid_color(`color-mix(hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(rgb(26, 204, 26), rgb(153, 115, 77))`); // Missing interpolation method. // lch() fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30), lch(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 75%, lch(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)`, `color-mix(in lch, lch(10 20 30) 75%, lch(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70))`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 75%, lch(50 60 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)`, `color-mix(in lch, lch(10 20 30) 75%, lch(50 60 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)`, `color-mix(in lch, lch(10 20 30) 25%, lch(50 60 70) 75%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)`, `color-mix(in lch, lch(10 20 30) 30%, lch(50 60 70) 90%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)`, `color-mix(in lch, lch(10 20 30) 12.5%, lch(50 60 70) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 0%, lch(50 60 70))`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))`, `color-mix(in lch, lch(10 20 30) 0%, lch(50 60 70) 100%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4), lch(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 75%, lch(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 75%, lch(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 75%, lch(50 60 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 75%, lch(50 60 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 25%, lch(50 60 70 / 0.8) 75%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 30%, lch(50 60 70 / 0.8) 90%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)`, `color-mix(in lch, lch(10 20 30 / 0.4) 12.5%, lch(50 60 70 / 0.8) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 0%, lch(50 60 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))`, `color-mix(in lch, lch(10 20 30 / 0.4) 0%, lch(50 60 70 / 0.8) 100%)`); fuzzy_test_valid_color(`color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))`, `color-mix(in lch, lch(100 0 40), lch(100 0 60))`); fuzzy_test_valid_color(`color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))`, `color-mix(in lch, lch(100 0 60), lch(100 0 40))`); @@ -268,24 +268,24 @@ // oklch() fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30), oklch(0.5 0.6 70))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70))`); - fuzzy_test_valid_color(`color-mix(in oklch, 25% oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg), 25% oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 75%, oklch(0.5 0.6 70))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg) 25%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 75%, oklch(0.5 0.6 70))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg) 75%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70))`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklch, 25% oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg), 25% oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 75%, oklch(0.5 0.6 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg) 25%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 75%, oklch(0.5 0.6 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg) 75%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 25%, oklch(0.5 0.6 70) 75%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 30%, oklch(0.5 0.6 70deg) 90%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 30%, oklch(0.5 0.6 70) 90%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 12.5%, oklch(0.5 0.6 70deg) 37.5%)`, `color-mix(in oklch, oklch(0.1 0.2 30) 12.5%, oklch(0.5 0.6 70) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 0%, oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 0%, oklch(0.5 0.6 70))`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg) 0%, oklch(0.5 0.6 70deg))`, `color-mix(in oklch, oklch(0.1 0.2 30) 0%, oklch(0.5 0.6 70) 100%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4), oklch(0.5 0.6 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklch, 25% oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4), 25% oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 75%, oklch(0.5 0.6 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8) 25%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 75%, oklch(0.5 0.6 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8) 75%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklch, 25% oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4), 25% oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 75%, oklch(0.5 0.6 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8) 25%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 75%, oklch(0.5 0.6 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8) 75%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 25%, oklch(0.5 0.6 70 / 0.8) 75%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 30%, oklch(0.5 0.6 70deg / .8) 90%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 30%, oklch(0.5 0.6 70 / 0.8) 90%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 12.5%, oklch(0.5 0.6 70deg / .8) 37.5%)`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 12.5%, oklch(0.5 0.6 70 / 0.8) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 0%, oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 0%, oklch(0.5 0.6 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 0%, oklch(0.5 0.6 70deg / .8))`, `color-mix(in oklch, oklch(0.1 0.2 30 / 0.4) 0%, oklch(0.5 0.6 70 / 0.8) 100%)`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(1 0 40deg), oklch(1 0 60deg))`, `color-mix(in oklch, oklch(1 0 40), oklch(1 0 60))`); fuzzy_test_valid_color(`color-mix(in oklch, oklch(1 0 60deg), oklch(1 0 40deg))`, `color-mix(in oklch, oklch(1 0 60), oklch(1 0 40))`); @@ -336,24 +336,24 @@ // lab() fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30), lab(50 60 70))`, `color-mix(in lab, lab(10 20 30), lab(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 75%, lab(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)`, `color-mix(in lab, lab(10 20 30) 75%, lab(50 60 70))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 75%, lab(50 60 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)`, `color-mix(in lab, lab(10 20 30) 75%, lab(50 60 70) 25%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)`, `color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)`, `color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)`, `color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))`, `color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70) 100%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4), lab(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 75%, lab(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 75%, lab(50 60 70 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 75%, lab(50 60 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 75%, lab(50 60 70 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 25%, lab(50 60 70 / 0.8) 75%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 30%, lab(50 60 70 / 0.8) 90%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)`, `color-mix(in lab, lab(10 20 30 / 0.4) 12.5%, lab(50 60 70 / 0.8) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 0%, lab(50 60 70 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))`, `color-mix(in lab, lab(10 20 30 / 0.4) 0%, lab(50 60 70 / 0.8) 100%)`); fuzzy_test_valid_color(`color-mix(in lab, lab(none none none), lab(none none none))`, `color-mix(in lab, lab(none none none), lab(none none none))`); fuzzy_test_valid_color(`color-mix(in lab, lab(none none none), lab(50 60 70))`, `color-mix(in lab, lab(none none none), lab(50 60 70))`); @@ -369,24 +369,24 @@ // oklab() fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in oklab, 25% oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3), 25% oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 75%, oklab(0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7) 25%)`, `color-mix(oklab(0.1 0.2 0.3) 75%, oklab(0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklab, 25% oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3), 25% oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 75%, oklab(0.5 0.6 0.7) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7) 25%)`, `color-mix(oklab(0.1 0.2 0.3) 75%, oklab(0.5 0.6 0.7) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)`, `color-mix(oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 30%, oklab(0.5 0.6 0.7) 90%)`, `color-mix(oklab(0.1 0.2 0.3) 30%, oklab(0.5 0.6 0.7) 90%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 12.5%, oklab(0.5 0.6 0.7) 37.5%)`, `color-mix(oklab(0.1 0.2 0.3) 12.5%, oklab(0.5 0.6 0.7) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 0%, oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 0%, oklab(0.5 0.6 0.7))`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3) 0%, oklab(0.5 0.6 0.7))`, `color-mix(oklab(0.1 0.2 0.3) 0%, oklab(0.5 0.6 0.7) 100%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4), oklab(0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklab, 25% oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), 25% oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 75%, oklab(0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8) 25%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 75%, oklab(0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8) 75%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklab, 25% oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), 25% oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 75%, oklab(0.5 0.6 0.7 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8) 25%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 75%, oklab(0.5 0.6 0.7 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8) 75%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 25%, oklab(0.5 0.6 0.7 / 0.8) 75%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 30%, oklab(0.5 0.6 0.7 / .8) 90%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 30%, oklab(0.5 0.6 0.7 / 0.8) 90%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 12.5%, oklab(0.5 0.6 0.7 / .8) 37.5%)`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 12.5%, oklab(0.5 0.6 0.7 / 0.8) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 0%, oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 0%, oklab(0.5 0.6 0.7 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 0%, oklab(0.5 0.6 0.7 / .8))`, `color-mix(oklab(0.1 0.2 0.3 / 0.4) 0%, oklab(0.5 0.6 0.7 / 0.8) 100%)`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(none none none), oklab(none none none))`, `color-mix(oklab(none none none), oklab(none none none))`); fuzzy_test_valid_color(`color-mix(in oklab, oklab(none none none), oklab(0.5 0.6 0.7))`, `color-mix(oklab(none none none), oklab(0.5 0.6 0.7))`); @@ -406,20 +406,20 @@ fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3), color(${resultColorSpace} 0.5 0.6 0.7))`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, 50% color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3), color(${resultColorSpace} 0.5 0.6 0.7))`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), 50% color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3), color(${resultColorSpace} 0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 75%, color(${resultColorSpace} 0.5 0.6 0.7))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7))`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7) 75%)`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 75%, color(${resultColorSpace} 0.5 0.6 0.7) 25%)`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7) 75%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 30%, color(${colorSpace} .5 .6 .7) 90%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 30%, color(${resultColorSpace} 0.5 0.6 0.7) 90%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 12.5%, color(${colorSpace} .5 .6 .7) 37.5%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 12.5%, color(${resultColorSpace} 0.5 0.6 0.7) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 0%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 0%, color(${resultColorSpace} 0.5 0.6 0.7))`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 0%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 0%, color(${resultColorSpace} 0.5 0.6 0.7) 100%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .5), color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.5), color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4), color(${colorSpace} .5 .6 .7 / .8) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 75%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 75%)`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4), color(${colorSpace} .5 .6 .7 / .8) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 75%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 25%)`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 75%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 30%, color(${colorSpace} .5 .6 .7 / .8) 90%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 30%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 90%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 12.5%, color(${colorSpace} .5 .6 .7 / .8) 37.5%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 12.5%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 37.5%)`); - fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 0%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 0%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); + fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 0%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 0%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 100%)`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} 2 3 4 / 5), color(${colorSpace} 4 6 8 / 10))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 2 3 4), color(${resultColorSpace} 4 6 8))`); fuzzy_test_valid_color(`color-mix(in ${colorSpace}, color(${colorSpace} -2 -3 -4), color(${colorSpace} -4 -6 -8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} -2 -3 -4), color(${resultColorSpace} -4 -6 -8))`); @@ -440,7 +440,7 @@ // Test percent normalization fuzzy_test_valid_color(`color-mix(in srgb, red 50%, blue 50%)`, `color-mix(in srgb, red, blue)`) // both 50% - fuzzy_test_valid_color(`color-mix(in srgb, red 10%, blue 90%)`, `color-mix(in srgb, red 10%, blue)`) // sum to 100% + fuzzy_test_valid_color(`color-mix(in srgb, red 10%, blue 90%)`, `color-mix(in srgb, red 10%, blue 90%)`) // sum to 100% fuzzy_test_valid_color(`color-mix(in srgb, red 50%, blue 40%)`, `color-mix(in srgb, red 50%, blue 40%)`) // only one is 50% (p1) fuzzy_test_valid_color(`color-mix(in srgb, red 40%, blue 50%)`, `color-mix(in srgb, red 40%, blue 50%)`) // only one is 50% (p2) fuzzy_test_valid_color(`color-mix(in srgb, red 30%, blue 40%)`, `color-mix(in srgb, red 30%, blue 40%)`) // sum to less than 100 @@ -449,12 +449,25 @@ fuzzy_test_valid_color(`color-mix(in srgb, red 50%, blue calc(10%))`, `color-mix(in srgb, red 50%, blue calc(10%))`) // one is `calc()` (p2) fuzzy_test_valid_color(`color-mix(in srgb, red calc(10%), blue calc(90%))`, `color-mix(in srgb, red calc(10%), blue calc(90%))`) // both are `calc()` fuzzy_test_valid_color(`color-mix(in srgb, red 50%, blue)`, `color-mix(in srgb, red, blue)`) // only p1 specified, is 50% - fuzzy_test_valid_color(`color-mix(in srgb, red 10%, blue)`, `color-mix(in srgb, red 10%, blue)`) // only p1 specified + fuzzy_test_valid_color(`color-mix(in srgb, red 10%, blue)`, `color-mix(in srgb, red 10%, blue 90%)`) // only p1 specified fuzzy_test_valid_color(`color-mix(in srgb, red calc(50%), blue)`, `color-mix(in srgb, red calc(50%), blue)`) // only p1 specified, is `calc()` - fuzzy_test_valid_color(`color-mix(in srgb, red, blue 50%)`, `color-mix(in srgb, red, blue)`) // only p2 specified, is 50% - fuzzy_test_valid_color(`color-mix(in srgb, red, blue 90%)`, `color-mix(in srgb, red 10%, blue)`) // only p2 specified - fuzzy_test_valid_color(`color-mix(in srgb, red, blue calc(50%))`, `color-mix(in srgb, red, blue calc(50%))`) // only p2 specified, is `calc()` + fuzzy_test_valid_color(`color-mix(in srgb, red, blue 50%)`, `color-mix(in srgb, red, blue)`) // only p2 specified, is 50% + fuzzy_test_valid_color(`color-mix(in srgb, red, blue 90%)`, `color-mix(in srgb, red 10%, blue 90%)`) // only p2 specified + fuzzy_test_valid_color(`color-mix(in srgb, red, blue calc(50%))`, `color-mix(in srgb, red, blue calc(50%))`) // only p2 specified, is `calc()` fuzzy_test_valid_color(`color-mix(in srgb, red, blue)`, `color-mix(in srgb, red, blue)`) // neither is specified + + // color-mix() with 1 or more colors. + fuzzy_test_valid_color(`color-mix(in srgb, red)`, `color-mix(in srgb, red)`); + fuzzy_test_valid_color(`color-mix(in srgb, red 100%)`, `color-mix(in srgb, red)`); + fuzzy_test_valid_color(`color-mix(in srgb, red 50%)`, `color-mix(in srgb, red 50%)`); + fuzzy_test_valid_color(`color-mix(in srgb, red, green, blue)`, `color-mix(in srgb, red, green, blue)`); + fuzzy_test_valid_color(`color-mix(in hsl, red, green, blue)`, `color-mix(in hsl, red, green, blue)`); + fuzzy_test_valid_color(`color-mix(in srgb, red 50%, green 30%, blue 20%)`, `color-mix(in srgb, red 50%, green 30%, blue 20%)`); + fuzzy_test_valid_color(`color-mix(in srgb, red 30%, green 60%, blue 90%)`, `color-mix(in srgb, red 30%, green 60%, blue 90%)`); + fuzzy_test_valid_color(`color-mix(in srgb, red 50%, green, blue)`, `color-mix(in srgb, red 50%, green 25%, blue 25%)`); + fuzzy_test_valid_color(`color-mix(in srgb, red, green 25%, blue 25%)`, `color-mix(in srgb, red 50%, green 25%, blue 25%)`); + fuzzy_test_valid_color(`color-mix(in srgb, red, green, blue, white)`, `color-mix(in srgb, red, green, blue, white)`); + fuzzy_test_valid_color(`color-mix(in srgb, currentcolor, red, blue)`, `color-mix(in srgb, currentcolor, red, blue)`); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function-expected.txt index 106b3c5527a3..0f11210c73d0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function-expected.txt @@ -8,5 +8,12 @@ PASS e.style['background-color'] = "contrast-color(color(srgb 10 10 10))" should PASS e.style['background-color'] = "contrast-color(color(srgb -10 -10 -10))" should set the property value PASS e.style['background-color'] = "contrast-color(contrast-color(pink))" should set the property value PASS e.style['background-color'] = "contrast-color(currentcolor)" should set the property value -PASS e.style['background-color'] = "contrast-color(color(srgb calc(0.5) calc(1 + (sign(20cqw - 10px) * 0.5)) 1 / .5))" should set the property value +PASS e.style['background-color'] = "contrast-color(color(srgb calc(0.5) calc(1 + 1 / 1) 1 / .5))" should set the property value +PASS e.style['background-color'] = "color-mix(contrast-color(blue) 75%, purple 25%)" should set the property value +PASS e.style['background-color'] = "rgb(from contrast-color(blue) r g b)" should set the property value +PASS e.style['background-color'] = "contrast-color(color-mix(blue, green))" should set the property value +PASS e.style['background-color'] = "contrast-color(rgb(from blue r g b))" should set the property value +PASS e.style['background-color'] = "contrast-color(buttonface)" should set the property value +PASS e.style['background-color'] = "contrast-color(transparent)" should set the property value +PASS e.style['background-color'] = "contrast-color(rgba(255, 255, 255, 0.2))" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function.html index 85a133b78e98..1fc6ee11b48f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function.html @@ -1,6 +1,4 @@ - - Test CSS Color Module 5 contrast-color() parsing valid values @@ -15,8 +13,6 @@ color: pink; } - -
@@ -42,8 +38,23 @@ test_valid_value("background-color", "contrast-color(currentcolor)"); // Test color using calc(). -test_valid_value("background-color", "contrast-color(color(srgb calc(0.5) calc(1 + (sign(20cqw - 10px) * 0.5)) 1 / .5))", "contrast-color(color(srgb calc(0.5) calc(1 + (0.5 * sign(20cqw - 10px))) 1 / 0.5))"); +test_valid_value("background-color", "contrast-color(color(srgb calc(0.5) calc(1 + 1 / 1) 1 / .5))", [ + "contrast-color(color(srgb calc(0.5) calc(2) 1 / 0.5))", + "contrast-color(color(srgb 0.5 2 1 / 0.5))" +]); +// Test contrast-color in other color functions. +test_valid_value("background-color", "color-mix(contrast-color(blue) 75%, purple 25%)"); +test_valid_value("background-color", "rgb(from contrast-color(blue) r g b)"); + +// Test color functions in contrast-color. +test_valid_value("background-color", "contrast-color(color-mix(blue, green))"); +test_valid_value("background-color", "contrast-color(rgb(from blue r g b))"); + +// Test color using system color. +test_valid_value("background-color", "contrast-color(buttonface)"); + +// Test color using alpha channel. +test_valid_value("background-color", "contrast-color(transparent)"); +test_valid_value("background-color", "contrast-color(rgba(255, 255, 255, 0.2))"); - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-expected.txt index 633dcc7b4f43..144293a48a55 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-expected.txt @@ -15,4 +15,5 @@ PASS e.style['color'] = "rgb(-2, 3, 4)" should set the property value PASS e.style['color'] = "rgb(100, 200, 300)" should set the property value PASS e.style['color'] = "rgb(20, 10, 0, -10)" should set the property value PASS e.style['color'] = "rgb(100%, 200%, 300%)" should set the property value +PASS e.style['color'] = "light-dark(black, white)" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt index 4773f43bedb0..4a0f224b4c32 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color-expected.txt @@ -499,6 +499,7 @@ PASS e.style['color'] = "oklch(from oklch(0.7 0.45 30 / 40%) calc(l) calc(c) cal PASS e.style['color'] = "oklch(from oklch(0.7 0.2 300) calc(l - 0.2) c h)" should set the property value PASS e.style['color'] = "oklch(from oklch(0.7 0.2 300) l calc(c / 2) h)" should set the property value PASS e.style['color'] = "oklch(from oklch(0.7 0.2 300) l c calc(h * 2.5))" should set the property value +PASS e.style['color'] = "oklch(from red calc(1 / l) c h)" should set the property value PASS e.style['color'] = "oklch(from oklch(0.7 0.45 30) none none none)" should set the property value PASS e.style['color'] = "oklch(from oklch(0.7 0.45 30) none none none / none)" should set the property value PASS e.style['color'] = "oklch(from oklch(0.7 0.45 30) l c none)" should set the property value @@ -1145,12 +1146,4 @@ PASS e.style['color'] = "LCH(from var(--accent) l c calc(h + 180))" should set t PASS e.style['color'] = "lch(from var(--mycolor) l 0 h)" should set the property value PASS e.style['color'] = "var(--mygray)" should set the property value PASS e.style['color'] = "lch(from var(--mygray) l 30 h)" should set the property value -FAIL e.style['color'] = "color(from rebeccapurple srgb r g b)" should set the property value Colors do not match. -Actual: color(from rebeccapurple srgb r g b) -Expected: color(srgb 0.4 0.2 0.6). -Error: assert_array_approx_equals: Numeric parameters are approximately equal. lengths differ, expected 3 got 0 -FAIL e.style['color'] = "rgb(from color(srgb 0.4 0.2 0.6) r g b)" should set the property value Colors do not match. -Actual: rgb(from color(srgb 0.4 0.2 0.6) r g b) -Expected: color(srgb 0.4 0.2 0.6). -Error: assert_equals: Color format is correct. expected "color(srgb )" but got "rgb(from color(srgb ) r g b)" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html index 97a1e1a16e3f..5f05a55eaaf1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-relative-color.html @@ -560,6 +560,7 @@ fuzzy_test_valid_color(`oklch(from oklch(0.7 0.2 300) calc(l - 0.2) c h)`, `oklch(from oklch(0.7 0.2 300) calc(-0.2 + l) c h)`); fuzzy_test_valid_color(`oklch(from oklch(0.7 0.2 300) l calc(c / 2) h)`, `oklch(from oklch(0.7 0.2 300) l calc(0.5 * c) h)`); fuzzy_test_valid_color(`oklch(from oklch(0.7 0.2 300) l c calc(h * 2.5))`, `oklch(from oklch(0.7 0.2 300) l c calc(2.5 * h))`); + fuzzy_test_valid_color(`oklch(from red calc(1 / l) c h)`); // Testing with 'none'. fuzzy_test_valid_color(`oklch(from oklch(0.7 0.45 30) none none none)`); @@ -755,10 +756,6 @@ fuzzy_test_valid_color(`lch(from var(--mycolor) l 0 h)`); fuzzy_test_valid_color(`var(--mygray)`); fuzzy_test_valid_color(`lch(from var(--mygray) l 30 h)`); - - // Ensure that converting between legacy and modern sRGB color spaces work as expected. - fuzzy_test_valid_color(`color(from rebeccapurple srgb r g b)`, `color(srgb 0.4 0.2 0.6)`, 0.01); - fuzzy_test_valid_color(`rgb(from color(srgb 0.4 0.2 0.6) r g b)`, `color(srgb 0.4 0.2 0.6)`, 0.01); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid.html index 5c18d62d7592..ee513d3ab606 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid.html @@ -28,6 +28,7 @@ test_valid_value("color", "rgb(100, 200, 300)", "rgb(100, 200, 255)"); test_valid_value("color", "rgb(20, 10, 0, -10)", "rgba(20, 10, 0, 0)"); test_valid_value("color", "rgb(100%, 200%, 300%)", "rgb(255, 255, 255)"); +test_valid_value("color", "light-dark(black, white)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container-expected.txt new file mode 100644 index 000000000000..b912d4a08aa6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container-expected.txt @@ -0,0 +1,4 @@ + +PASS Property background-color value 'contrast-color(color(srgb calc(1 + (sign(20cqw - 10px) * 1)) calc(1 + (sign(20cqw - 10px) * 1)) calc(1 + (sign(20cqw - 10px) * 1))))' +PASS e.style['background-color'] = "contrast-color(color(srgb calc(0.5) calc(1 + (sign(20cqw - 10px) * 0.5)) 1 / .5))" should set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container.html new file mode 100644 index 000000000000..22ea96572671 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container.html @@ -0,0 +1,26 @@ + + +Test CSS Color Module 5 contrast-color() computed value with calc() and container units + + + + + + + + + +
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/relative-color-out-of-gamut.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/relative-color-out-of-gamut.html index 745b21a0404f..6f399aaf385b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/relative-color-out-of-gamut.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/relative-color-out-of-gamut.html @@ -21,34 +21,34 @@ // No gamut mapping should occur and the resulting colors should be of the // format color(srgb ... ) // See: https://github.com/mozilla/wg-decisions/issues/1125 - fuzzy_test_computed_color(`rgb(from color(display-p3 0 1 0) r g b / alpha)`, `color(srgb -0.511814 1.01832 -0.310726)`); - fuzzy_test_computed_color(`rgb(from lab(100 104.3 -50.9) r g b)`, `color(srgb 1.59343 0.58802 1.40564)`); - fuzzy_test_computed_color(`rgb(from lab(0 104.3 -50.9) r g b)`, `color(srgb 0.351376 -0.213938 0.299501)`); - fuzzy_test_computed_color(`rgb(from lch(100 116 334) r g b)`, `color(srgb 1.59328 0.58828 1.40527)`); - fuzzy_test_computed_color(`rgb(from lch(0 116 334) r g b)`, `color(srgb 0.351307 -0.213865 0.299236)`); - fuzzy_test_computed_color(`rgb(from oklab(1 0.365 -0.16) r g b)`, `color(srgb 1.59295 0.360371 1.38571)`); - fuzzy_test_computed_color(`rgb(from oklab(0 0.365 -0.16) r g b)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`); - fuzzy_test_computed_color(`rgb(from oklch(1 0.399 336.3) r g b)`, `color(srgb 1.59328 0.358736 1.38663)`); - fuzzy_test_computed_color(`rgb(from oklch(0 0.399 336.3) r g b)`, `color(srgb 0.0765362 -0.045825 0.0937443)`); + fuzzy_test_computed_color(`rgb(from color(display-p3 0 1 0) r g b / alpha)`, `color(srgb -0.5116 1.01827 -0.31067)`, 0.0001); + fuzzy_test_computed_color(`rgb(from lab(100 104.3 -50.9) r g b)`, `color(srgb 1.5935 0.58776 1.40555)`, 0.0001); + fuzzy_test_computed_color(`rgb(from lab(0 104.3 -50.9) r g b)`, `color(srgb 0.35137 -0.21392 0.29945)`, 0.0001); + fuzzy_test_computed_color(`rgb(from lch(100 116 334) r g b)`, `color(srgb 1.59336 0.58802 1.40517)`, 0.0001); + fuzzy_test_computed_color(`rgb(from lch(0 116 334) r g b)`, `color(srgb 0.3513 -0.21385 0.29918)`, 0.0001); + fuzzy_test_computed_color(`rgb(from oklab(1 0.365 -0.16) r g b)`, `color(srgb 1.59297 0.3602 1.38555)`, 0.0001); + fuzzy_test_computed_color(`rgb(from oklab(0 0.365 -0.16) r g b)`, `color(srgb 0.07636 -0.04559 0.09322)`, 0.0001); + fuzzy_test_computed_color(`rgb(from oklch(1 0.399 336.3) r g b)`, `color(srgb 1.59331 0.35856 1.38647)`, 0.0001); + fuzzy_test_computed_color(`rgb(from oklch(0 0.399 336.3) r g b)`, `color(srgb 0.07651 -0.04579 0.0937)`, 0.0001); - fuzzy_test_computed_color(`hsl(from color(display-p3 0 1 0) h s l / alpha)`, `color(srgb -0.511814 1.01832 -0.310726)`); - fuzzy_test_computed_color(`hsl(from lab(100 104.3 -50.9) h s l)`, `color(srgb 1.59343 0.58802 1.40564)`); - fuzzy_test_computed_color(`hsl(from lab(0 104.3 -50.9) h s l)`, `color(srgb 0.351376 -0.213938 0.299502)`); - fuzzy_test_computed_color(`hsl(from lch(100 116 334) h s l)`, `color(srgb 1.59328 0.58828 1.40527)`); - fuzzy_test_computed_color(`hsl(from lch(0 116 334) h s l)`, `color(srgb 0.351307 -0.213865 0.299236)`); - fuzzy_test_computed_color(`hsl(from oklab(1 0.365 -0.16) h s l)`, `color(srgb 1.59295 0.360371 1.38571)`); - fuzzy_test_computed_color(`hsl(from oklab(0 0.365 -0.16) h s l)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`); - fuzzy_test_computed_color(`hsl(from oklch(1 0.399 336.3) h s l)`, `color(srgb 1.59328 0.358736 1.38663)`); - fuzzy_test_computed_color(`hsl(from oklch(0 0.399 336.3) h s l)`, `color(srgb 0.0765362 -0.045825 0.0937443)`); + fuzzy_test_computed_color(`hsl(from color(display-p3 0 1 0) h s l / alpha)`, `color(srgb -0.5116 1.01827 -0.31067)`, 0.0001); + fuzzy_test_computed_color(`hsl(from lab(100 104.3 -50.9) h s l)`, `color(srgb 1.5935 0.58776 1.40555)`, 0.0001); + fuzzy_test_computed_color(`hsl(from lab(0 104.3 -50.9) h s l)`, `color(srgb 0.35137 -0.21392 0.29945)`, 0.0001); + fuzzy_test_computed_color(`hsl(from lch(100 116 334) h s l)`, `color(srgb 1.59336 0.58802 1.40517)`, 0.0001); + fuzzy_test_computed_color(`hsl(from lch(0 116 334) h s l)`, `color(srgb 0.3513 -0.21385 0.29918)`, 0.0001); + fuzzy_test_computed_color(`hsl(from oklab(1 0.365 -0.16) h s l)`, `color(srgb 1.59297 0.3602 1.38555)`, 0.0001); + fuzzy_test_computed_color(`hsl(from oklab(0 0.365 -0.16) h s l)`, `color(srgb 0.07636 -0.04559 0.09322)`, 0.0001); + fuzzy_test_computed_color(`hsl(from oklch(1 0.399 336.3) h s l)`, `color(srgb 1.59331 0.35856 1.38647)`, 0.0001); + fuzzy_test_computed_color(`hsl(from oklch(0 0.399 336.3) h s l)`, `color(srgb 0.07651 -0.04579 0.0937)`, 0.0001); - fuzzy_test_computed_color(`hwb(from color(display-p3 0 1 0) h w b / alpha)`, `color(srgb -0.511814 1.01832 -0.310726)`); - fuzzy_test_computed_color(`hwb(from lab(100 104.3 -50.9) h w b)`, `color(srgb 1.59343 0.58802 1.40564)`); - fuzzy_test_computed_color(`hwb(from lab(0 104.3 -50.9) h w b)`, `color(srgb 0.351376 -0.213938 0.299502)`); - fuzzy_test_computed_color(`hwb(from lch(100 116 334) h w b)`, `color(srgb 1.59328 0.58828 1.40527)`); - fuzzy_test_computed_color(`hwb(from lch(0 116 334) h w b)`, `color(srgb 0.351307 -0.213865 0.299236)`); - fuzzy_test_computed_color(`hwb(from oklab(1 0.365 -0.16) h w b)`, `color(srgb 1.59295 0.360371 1.38571)`); - fuzzy_test_computed_color(`hwb(from oklab(0 0.365 -0.16) h w b)`, `color(srgb 0.0763894 -0.0456266 0.0932598)`); - fuzzy_test_computed_color(`hwb(from oklch(1 0.399 336.3) h w b)`, `color(srgb 1.59328 0.358736 1.38664)`); - fuzzy_test_computed_color(`hwb(from oklch(0 0.399 336.3) h w b)`, `color(srgb 0.0765362 -0.045825 0.0937443)`); + fuzzy_test_computed_color(`hwb(from color(display-p3 0 1 0) h w b / alpha)`, `color(srgb -0.5116 1.01827 -0.31067)`, 0.0001); + fuzzy_test_computed_color(`hwb(from lab(100 104.3 -50.9) h w b)`, `color(srgb 1.5935 0.58776 1.40555)`, 0.0001); + fuzzy_test_computed_color(`hwb(from lab(0 104.3 -50.9) h w b)`, `color(srgb 0.35137 -0.21392 0.29945)`, 0.0001); + fuzzy_test_computed_color(`hwb(from lch(100 116 334) h w b)`, `color(srgb 1.59336 0.58802 1.40517)`, 0.0001); + fuzzy_test_computed_color(`hwb(from lch(0 116 334) h w b)`, `color(srgb 0.3513 -0.21385 0.29918)`, 0.0001); + fuzzy_test_computed_color(`hwb(from oklab(1 0.365 -0.16) h w b)`, `color(srgb 1.59297 0.3602 1.38555)`, 0.0001); + fuzzy_test_computed_color(`hwb(from oklab(0 0.365 -0.16) h w b)`, `color(srgb 0.07636 -0.04559 0.09322)`, 0.0001); + fuzzy_test_computed_color(`hwb(from oklch(1 0.399 336.3) h w b)`, `color(srgb 1.59331 0.35856 1.38647)`, 0.0001); + fuzzy_test_computed_color(`hwb(from oklch(0 0.399 336.3) h w b)`, `color(srgb 0.07651 -0.04579 0.0937)`, 0.0001); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/w3c-import.log index 33b588441e81..8864d7805de6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/w3c-import.log @@ -15,8 +15,12 @@ None ------------------------------------------------------------------------ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/WEB_FEATURES.yml +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/alpha-color-parsing-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-contrast-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hex-color.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hsl.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-computed-hwb.html @@ -28,6 +32,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-layers-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-color-mix-function.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-contrast-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-hex-color.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-hsl.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-invalid-hwb.html @@ -40,6 +45,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-layers-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-contrast-color-function.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-hsl.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-hwb.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-lab.html @@ -47,6 +53,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-rgb.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-system-color.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/contrast-color-function-calc-container.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/opacity-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/opacity-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/opacity-valid.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom-expected.txt new file mode 100644 index 000000000000..29f7a2649c76 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom-expected.txt @@ -0,0 +1,3 @@ + +PASS oklch(from oklch(calc(0.54 + 0.01) 0.04 257) calc(0.994 + 0.001) calc(0.001 + 0.004) calc(h / alpha)) should be used-value-equivalent to oklch(0.995 0.005 257) + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom.html new file mode 100644 index 000000000000..a14be5587ea0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom.html @@ -0,0 +1,17 @@ + +CSS Color: relative color is not affected by zoom + + + + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02.html index 603938d0dbd9..b5ccce19f99b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02.html @@ -13,7 +13,7 @@ background-color: rgb(from currentColor g r b); } div div { - color: #7F0000; + color: #800000; background-color: inherit; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle-expected.txt new file mode 100644 index 000000000000..8cad3b540857 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle-expected.txt @@ -0,0 +1,4 @@ +getComputedStyle should return lime for background-color on this element + +PASS Property background-color value 'rgb(from currentcolor r g b)' should not leak :visited for computed style + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle.html new file mode 100644 index 000000000000..443af36888a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle.html @@ -0,0 +1,23 @@ + + +Relative color syntax and currentcolor with :visited don't leak information via getComputedStyle + + + + + + + +getComputedStyle should return lime for background-color on this element + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency-expected.txt index e86a01fd1283..5d045e5c3a6f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency-expected.txt @@ -27,6 +27,9 @@ FAIL Property color value 'FieldText' resolves to the same color as text on a te PASS Property color value 'Mark' has the same color as the background-color of a mark element (light) PASS Property color value 'MarkText' has the same color as the color of a mark element (light) PASS Property color value 'LinkText' has the same color as the color of an anchor element (light) +PASS LinkText should not match Canvas in light mode +PASS ActiveText should not match Canvas in light mode +PASS VisitedText should not match Canvas in light mode FAIL Property color value 'ButtonBorder' resolves to the same color as the border-color of a button (dark) assert_equals: expected "rgba(255, 255, 255, 0.847) rgba(255, 255, 255, 0.247)" but got "rgb(255, 255, 255)" PASS Property color value 'ButtonFace' resolves to the same color as the background-color of a button (dark) PASS Property color value 'ButtonText' resolves to the same color as text on a button (dark) @@ -55,4 +58,7 @@ FAIL Property color value 'FieldText' resolves to the same color as text on a te PASS Property color value 'Mark' has the same color as the background-color of a mark element (dark) PASS Property color value 'MarkText' has the same color as the color of a mark element (dark) PASS Property color value 'LinkText' has the same color as the color of an anchor element (dark) +PASS LinkText should not match Canvas in dark mode +PASS ActiveText should not match Canvas in dark mode +PASS VisitedText should not match Canvas in dark mode diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency.html index a3849c5781b1..fd73d1ab2f28 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/system-color-consistency.html @@ -1,19 +1,13 @@ - - - - - CSS Color 4: System color consistency - - - - - - - - - -
+ +CSS Color 4: System color consistency + + + + + + +
@@ -31,41 +25,55 @@ Marked text Link -
+
Canvas Colors +
+ - + // LinkText + style = getComputedStyle(document.getElementById('link')); + test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`); - + // These colors are only text colors and do not have corresponding + // backgrounds, so they should not match the canvas background (as + // otherwise they'd be invisible) + test_not_canvas("LinkText", colorScheme); + test_not_canvas("ActiveText", colorScheme); + test_not_canvas("VisitedText", colorScheme); + }); + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/w3c-import.log index be6b6b99f0b1..ef4b55cff6f4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-color/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-color/w3c-import.log @@ -78,9 +78,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-003-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-003.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-contrast-001-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-contrast-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-initial-canvastext.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-layers-no-blend-mode.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-basic-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-basic-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-basic-001.html @@ -100,6 +101,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-currentcolor-visited-getcomputedstyle.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-currentcolor-visited-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-currentcolor-visited.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-missing-components.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/color-mix-non-srgb-001.html @@ -111,6 +113,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/composited-filters-under-opacity-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/composited-filters-under-opacity-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/composited-filters-under-opacity.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/contrast-color-currentcolor-inherited.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-002-expected.html @@ -121,6 +127,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-004-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-004-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-005.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-visited-fallback-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-visited-fallback-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/currentcolor-visited-fallback.html @@ -188,6 +197,19 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-005.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-006-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-006.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-005-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-005.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/display-p3-linear-006.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/filters-under-will-change-opacity-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/filters-under-will-change-opacity.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/greensquare-090-ref.html @@ -316,6 +338,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-currentcolor-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-currentcolor-in-color.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-currentcolor.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image-none.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-image.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-inheritance-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/light-dark-inheritance.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/mossgreensquare-ref.html @@ -445,6 +473,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/rec2020-004.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/rec2020-005-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/rec2020-005.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-color-with-zoom.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-a98rgb-01-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-a98rgb-01.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-displayp3-01-expected.html @@ -473,6 +502,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-01.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-rgb-02.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-visited-getcomputedstyle.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-xyzd50-01-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-xyzd50-01.html /LayoutTests/imported/w3c/web-platform-tests/css/css-color/relative-currentcolor-xyzd65-01-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var-expected.txt new file mode 100644 index 000000000000..725f7a88ea9b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var-expected.txt @@ -0,0 +1,7 @@ + +PASS single-line var() fallback +PASS multi-line var() fallback +PASS newline after comma in var() fallback +PASS newline before closing parentheses in var() fallback +PASS newline before var() and around fallback + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var.html new file mode 100644 index 000000000000..206d26c21d6b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/custom-property-style-query-multiline-var.html @@ -0,0 +1,88 @@ + +CSS Container Queries Test: style() query against custom property with multi-line var() fallback + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle-expected.txt new file mode 100644 index 000000000000..d9a80f5f1419 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle-expected.txt @@ -0,0 +1,4 @@ + +PASS Initial style() container match applies under both rendered and display:contents containers +PASS Restyling a descendant must not lose the style() container match when the container is display:contents + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle.html new file mode 100644 index 000000000000..2b0cf566a1ec --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/display-contents-style-query-descendant-restyle.html @@ -0,0 +1,41 @@ + +CSS Container Queries Test: style() container with display:contents survives descendant restyle + + + + + +
+
+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-computed-expected.txt index eedf86976ca3..492832cf0713 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-computed-expected.txt @@ -1,5 +1,5 @@ -FAIL Property container-type value 'scroll-state' assert_true: 'scroll-state' is a supported value for container-type. expected true got false -FAIL Property container-type value 'scroll-state size' assert_true: 'scroll-state size' is a supported value for container-type. expected true got false -FAIL Property container-type value 'inline-size scroll-state' assert_true: 'inline-size scroll-state' is a supported value for container-type. expected true got false +FAIL Property container-type value 'scroll-state' assert_equals: expected "scroll-state" but got "normal" +FAIL Property container-type value 'scroll-state size' assert_equals: expected "size scroll-state" but got "normal" +FAIL Property container-type value 'inline-size scroll-state' assert_equals: expected "inline-size scroll-state" but got "normal" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-parsing-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-parsing-expected.txt index 51cdf8fc50c6..858faeb2b586 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-parsing-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/container-queries/scroll-state/container-type-scroll-state-parsing-expected.txt @@ -1,4 +1,8 @@ -Harness Error (FAIL), message = Error: assert_implements: Basic support for scroll-state container queries required undefined - +PASS e.style['container-type'] = "scroll-state" should set the property value +PASS e.style['container-type'] = "size scroll-state" should set the property value +PASS e.style['container-type'] = "scroll-state inline-size" should set the property value +PASS e.style['container-type'] = "scroll-state scroll-state" should not set the property value +PASS e.style['container-type'] = "normal scroll-state" should not set the property value +PASS e.style['container-type'] = "inline-size block-size scroll-state" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration-expected.txt index 09e1a994a038..631b44900ef0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration-expected.txt @@ -879,8 +879,8 @@ PASS flood-color: _dashed_attribute v. CSS.supports PASS flood-opacity: _camel_cased_attribute v. CSS.supports PASS flood-opacity: _dashed_attribute v. CSS.supports PASS font: _camel_cased_attribute v. CSS.supports -FAIL font-display: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false -FAIL font-display: _dashed_attribute v. CSS.supports assert_equals: expected true but got false +PASS font-display: _camel_cased_attribute v. CSS.supports +PASS font-display: _dashed_attribute v. CSS.supports PASS font-family: _camel_cased_attribute v. CSS.supports PASS font-family: _dashed_attribute v. CSS.supports PASS font-feature-settings: _camel_cased_attribute v. CSS.supports @@ -969,9 +969,9 @@ PASS image-rendering: _camel_cased_attribute v. CSS.supports PASS image-rendering: _dashed_attribute v. CSS.supports PASS ime-mode: _camel_cased_attribute v. CSS.supports PASS ime-mode: _dashed_attribute v. CSS.supports -FAIL inherits: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false -FAIL initial-value: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false -FAIL initial-value: _dashed_attribute v. CSS.supports assert_equals: expected true but got false +PASS inherits: _camel_cased_attribute v. CSS.supports +PASS initial-value: _camel_cased_attribute v. CSS.supports +PASS initial-value: _dashed_attribute v. CSS.supports PASS inline-size: _camel_cased_attribute v. CSS.supports PASS inline-size: _dashed_attribute v. CSS.supports PASS inset: _camel_cased_attribute v. CSS.supports @@ -1317,11 +1317,11 @@ PASS shape-outside: _camel_cased_attribute v. CSS.supports PASS shape-outside: _dashed_attribute v. CSS.supports PASS shape-rendering: _camel_cased_attribute v. CSS.supports PASS shape-rendering: _dashed_attribute v. CSS.supports -FAIL size: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false +PASS size: _camel_cased_attribute v. CSS.supports PASS speak: _camel_cased_attribute v. CSS.supports PASS speak-as: _camel_cased_attribute v. CSS.supports PASS speak-as: _dashed_attribute v. CSS.supports -FAIL src: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false +PASS src: _camel_cased_attribute v. CSS.supports PASS stop-color: _camel_cased_attribute v. CSS.supports PASS stop-color: _dashed_attribute v. CSS.supports PASS stop-opacity: _camel_cased_attribute v. CSS.supports @@ -1345,7 +1345,7 @@ PASS stroke-width: _camel_cased_attribute v. CSS.supports PASS stroke-width: _dashed_attribute v. CSS.supports PASS supported-color-schemes: _camel_cased_attribute v. CSS.supports PASS supported-color-schemes: _dashed_attribute v. CSS.supports -FAIL syntax: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false +PASS syntax: _camel_cased_attribute v. CSS.supports PASS tab-size: _camel_cased_attribute v. CSS.supports PASS tab-size: _dashed_attribute v. CSS.supports PASS table-layout: _camel_cased_attribute v. CSS.supports @@ -1462,8 +1462,8 @@ PASS transition-timing-function: _dashed_attribute v. CSS.supports PASS translate: _camel_cased_attribute v. CSS.supports PASS unicode-bidi: _camel_cased_attribute v. CSS.supports PASS unicode-bidi: _dashed_attribute v. CSS.supports -FAIL unicode-range: _camel_cased_attribute v. CSS.supports assert_equals: expected true but got false -FAIL unicode-range: _dashed_attribute v. CSS.supports assert_equals: expected true but got false +PASS unicode-range: _camel_cased_attribute v. CSS.supports +PASS unicode-range: _dashed_attribute v. CSS.supports PASS user-select: _camel_cased_attribute v. CSS.supports PASS user-select: _dashed_attribute v. CSS.supports PASS user-zoom: _camel_cased_attribute v. CSS.supports diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-display/display-contents-svg-anchor-child-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-display/display-contents-svg-anchor-child-expected.txt index a8edac290343..5cdfe966fd49 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-display/display-contents-svg-anchor-child-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-display/display-contents-svg-anchor-child-expected.txt @@ -1,3 +1,4 @@ +Text PASS Loading this page should not cause a crash. diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-expected.html new file mode 100644 index 000000000000..f4c3eb364473 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-expected.html @@ -0,0 +1,10 @@ +Reference + +

Test passes if the green strip below is 200x50 and not taller.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-ref.html new file mode 100644 index 000000000000..f4c3eb364473 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002-ref.html @@ -0,0 +1,10 @@ +Reference + +

Test passes if the green strip below is 200x50 and not taller.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002.html new file mode 100644 index 000000000000..3c423f734235 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-002.html @@ -0,0 +1,32 @@ +Nested flex containers with aspect-ratio do not inflate container height through content min-size feedback + + + + +

Test passes if the green strip below is 200x50 and not taller.

+
+
+
+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/WEB_FEATURES.yml index 856ded1a75b7..79f9cb526b72 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/WEB_FEATURES.yml @@ -1,9 +1,24 @@ features: +- name: lang-attr + files: + - lang-attribute-affects-rendering* - name: font-palette files: - font-palette.html - font-palette-* - palette-values-rule-* +- name: font-size + files: + - font-size-zero-* + - font-size-relative-across-calc-ff-bug-001.html + - font-size-sign-function.html + - font-size-xxx-large.html + - rcap-in-monospace.html + - rch-in-monospace.html + - rem-in-monospace.html + - rex-in-monospace.html + - ric-in-monospace.html + - rlh-in-monospace.html - name: font-size-adjust files: - font-size-adjust-* @@ -24,15 +39,84 @@ features: - name: font-synthesis-weight files: - font-synthesis-weight* +- name: font-variant + files: + - font-variant-01.html + - font-variant-02.html + - font-variant-03.html + - font-variant-04.html - name: font-variant-alternates files: - alternates-order.html - font-variant-alternates-* +- name: font-variant-caps + files: + - font-variant-caps-* +- name: font-variant-east-asian + files: + - font-variant-east-asian-* +- name: font-variant-emoji + files: + - font-variant-emoji-* +- name: font-variant-ligatures + files: + - font-variant-ligatures-* + - language-specific-01.html +- name: font-variant-numeric + files: + - font-variant-numeric-* - name: font-variant-position files: - font-variant-position-* +- name: font-variation-settings + files: + - font-variation-settings-* + - variable-in-font-variation-settings.html - name: font-metric-overrides files: - ascent-descent-override.html - line-gap-override.html - metrics-override-normal-keyword.html +- name: font-language-override + files: + - font-language-override-* +- name: font-family-system + files: + - system-ui* +- name: font-family-ui + files: + - standard-font-family-* +- name: font-face + files: + - font-face-* + - downloadable-font-* + - idlharness.html + - font-family-src-quoted.html + - crash-font-face-invalid-descriptor.html + - web-font-no-longer-accessible-when-stylesheet-removed.html + - test_datafont_same_origin.html +- name: font-feature-settings + files: + - font-feature-settings-* + - font-default-03.html + - font-default-04.html + - variable-in-feature-crash.html +- name: font-kerning + files: + - font-kerning-* + - cjk-kerning.html + - hiragana-katakana-kerning.html +- name: font-weight + files: + - font-weight-* +- name: font-shorthand + files: + - font-shorthand-* +- name: font-style + files: + - font-style-* + - italic-oblique-fallback.html + - test-synthetic-italic* +- name: font-stretch + files: + - font-stretch-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/WEB_FEATURES.yml index 6a3e58e9f54a..20d3e0c169e2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/WEB_FEATURES.yml @@ -4,6 +4,22 @@ features: - font-palette-animation-not-specified-endpoints.html - font-palette-interpolation.html - multiple-elements-font-palette-animation.html +- name: font-size + files: + - font-size-composition.html + - font-size-interpolation-* - name: font-size-adjust files: - font-size-adjust-* +- name: font-style + files: + - font-style-interpolation.html +- name: font-weight + files: + - font-weight-composition.html +- name: font-variation-settings + files: + - font-variation-settings-* +- name: font-stretch + files: + - font-stretch-interpolation.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition-expected.txt new file mode 100644 index 000000000000..5d056e9db20f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition-expected.txt @@ -0,0 +1,37 @@ + +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (-0.3) should be [120px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (0) should be [150px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (0.25) should be [175px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (0.5) should be [200px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (0.75) should be [225px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (1) should be [250px] +PASS Compositing: property underlying [50px] from add [100px] to add [200px] at (1.5) should be [300px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (-0.5) should be [106px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (0) should be [110px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (0.25) should be [112px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (0.5) should be [114px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (0.75) should be [116px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (1) should be [118px] +PASS Compositing: property underlying [100px] from add [10px] to add [large] at (1.5) should be [122px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (-0.3) should be [20.9px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (0) should be [23px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (0.25) should be [24.75px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (0.5) should be [26.5px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (0.75) should be [28.25px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (1) should be [30px] +PASS Compositing: property underlying [50%] from add [small] to add [20px] at (1.5) should be [33.5px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (-0.3) should be [365.2px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (0) should be [304px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (0.25) should be [253px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (0.5) should be [202px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (0.75) should be [151px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (1) should be [100px] +PASS Compositing: property underlying [20%] from add [10rem] to replace [5em] at (1.5) should be [0px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (-0.3) should be [9.7px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (0) should be [16px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (0.25) should be [21.25px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (0.5) should be [26.5px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (0.75) should be [31.75px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (1) should be [37px] +PASS Compositing: property underlying [small] from replace [medium] to add [larger] at (1.5) should be [47.5px] + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition.html new file mode 100644 index 000000000000..74626256dd43 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition.html @@ -0,0 +1,93 @@ + + +font-size composition + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition-expected.txt new file mode 100644 index 000000000000..d1dd35a17761 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition-expected.txt @@ -0,0 +1,12 @@ + +PASS Compositing: property underlying [500] from add [100] to add [500] at (-0.3) should be [480] +PASS Compositing: property underlying [500] from add [100] to add [500] at (0) should be [600] +PASS Compositing: property underlying [500] from add [100] to add [500] at (0.5) should be [800] +PASS Compositing: property underlying [500] from add [100] to add [500] at (1) should be [1000] +PASS Compositing: property underlying [500] from add [100] to add [500] at (1.5) should be [1000] +FAIL Compositing: property underlying [200] from add [600] to replace [500] at (-0.3) should be [889.75] assert_equals: expected "889.75 " but got "890 " +PASS Compositing: property underlying [200] from add [600] to replace [500] at (0) should be [800] +PASS Compositing: property underlying [200] from add [600] to replace [500] at (0.5) should be [650] +PASS Compositing: property underlying [200] from add [600] to replace [500] at (1) should be [500] +PASS Compositing: property underlying [200] from add [600] to replace [500] at (1.5) should be [350] + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition.html new file mode 100644 index 000000000000..f5a77e80656d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition.html @@ -0,0 +1,36 @@ + + +font-weight composition + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/w3c-import.log index 331913810f1a..1945eb541c21 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/w3c-import.log @@ -19,6 +19,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-palette-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html @@ -26,6 +27,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-style-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-variation-settings-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/font-weight-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/multiple-elements-font-palette-animation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/system-fonts.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/animations/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning-expected.txt index 4ea77599b782..694b9115bf63 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning-expected.txt @@ -17,9 +17,9 @@ PASS expected match: .kernON .latin vs .paltOFFkernON .latin FAIL expected match: .kernON .latin vs .paltONkernON .latin assert_equals: expected 252 but got 235 PASS expected match: .kernOFF .latin vs .paltONkernOFF .latin FAIL expected match: .kernON .cjk vs .paltONkernON .cjk assert_equals: expected 339 but got 385 +PASS expected match: .default .cjk vs .kernOFF .cjk PASS expected mismatch: .kernOFF .latin vs .kernON .latin FAIL expected mismatch: .kernOFF .cjk vs .kernON .cjk assert_not_equals: got disallowed value 385 PASS expected mismatch: .paltOFFkernON .cjk vs .paltONkernON .cjk PASS .default .latin matches one of [.kernON .latin, .kernOFF .latin] -PASS .default .cjk matches one of [.kernON .cjk, .kernOFF .cjk] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning.html index 7dfeb676c59c..5851757c8486 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/cjk-kerning.html @@ -83,6 +83,7 @@

font-feature-settings:"palt" 1; font-kerning: none;

[ ".kernON .latin", ".paltONkernON .latin" ], [ ".kernOFF .latin", ".paltONkernOFF .latin" ], [ ".kernON .cjk", ".paltONkernON .cjk" ], + [ ".default .cjk", ".kernOFF .cjk" ], ]; const expectMismatch = [ [ ".kernOFF .latin", ".kernON .latin" ], @@ -91,7 +92,6 @@

font-feature-settings:"palt" 1; font-kerning: none;

]; const expectMatchOneOf = [ [ ".default .latin", [".kernON .latin", ".kernOFF .latin"] ], - [ ".default .cjk", [".kernON .cjk", ".kernOFF .cjk"] ], ]; expectMatch.forEach((t) => { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/WEB_FEATURES.yml new file mode 100644 index 000000000000..4be980c4c25e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: font-display + files: + - "*" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.headers b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.headers deleted file mode 100644 index e6c4898d5d3d..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.headers +++ /dev/null @@ -1 +0,0 @@ -Feature-Policy-Report-Only: font-display-late-swap 'none'; \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-permissions-policy-02.tentative.html.headers b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-permissions-policy-02.tentative.html.headers new file mode 100644 index 000000000000..dfdb972e20a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-permissions-policy-02.tentative.html.headers @@ -0,0 +1 @@ +Permissions-Policy-Report-Only: font-display-late-swap=() \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/w3c-import.log index a7a8d1904b4e..076a2137fa29 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-change-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-change-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-change.html @@ -22,10 +23,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.headers +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-permissions-policy-02.tentative.html.headers /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-preload-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-preload-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-preload.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/font-display.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-display/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-face-style-normal-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-face-style-normal-expected.txt index b43e24472123..9ad71f240395 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-face-style-normal-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-face-style-normal-expected.txt @@ -1,6 +1,6 @@ PASS CSS Fonts: parsing 'normal' in the font-style descriptor -FAIL CSS Fonts: parsing 'normal' in the font-style descriptor 1 assert_equals: 'oblique 0deg' serializes as 'normal' expected "normal" but got "oblique 0deg" +PASS CSS Fonts: parsing 'normal' in the font-style descriptor 1 PASS CSS Fonts: parsing 'normal' in the font-style descriptor 2 PASS CSS Fonts: parsing 'normal' in the font-style descriptor 3 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-expected.html new file mode 100644 index 000000000000..180a9cccbb29 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-expected.html @@ -0,0 +1,20 @@ + + + +CSS Test: font-feature-settings descriptor + + +

Test passes if below line does not have a graph symbol.

+
+ This paragraph demonstrates the liga descriptor disabled through the @font-face rule. + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-ref.html new file mode 100644 index 000000000000..180a9cccbb29 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-ref.html @@ -0,0 +1,20 @@ + + + +CSS Test: font-feature-settings descriptor + + +

Test passes if below line does not have a graph symbol.

+
+ This paragraph demonstrates the liga descriptor disabled through the @font-face rule. + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02.html new file mode 100644 index 000000000000..4be3aaa0d82d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02.html @@ -0,0 +1,25 @@ + + + +CSS Test: font-feature-settings descriptor + + + + + + +

Test passes if below line does not have a graph symbol.

+
+ This paragraph demonstrates the liga descriptor disabled through the @font-face rule. +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-expected.html new file mode 100644 index 000000000000..c5119f37bdee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-expected.html @@ -0,0 +1,27 @@ + + + +CSS Test: font-feature-settings descriptor + + +

The test passes if the two lines render differently, demonstrating that the "smcp" (Small Caps) feature correctly transforms lowercase letters into smaller uppercase in first line, and remains unchanged in second line.

+
+

Filler text

+
+
+

Filler text

+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-ref.html new file mode 100644 index 000000000000..c5119f37bdee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-ref.html @@ -0,0 +1,27 @@ + + + +CSS Test: font-feature-settings descriptor + + +

The test passes if the two lines render differently, demonstrating that the "smcp" (Small Caps) feature correctly transforms lowercase letters into smaller uppercase in first line, and remains unchanged in second line.

+
+

Filler text

+
+
+

Filler text

+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary.html new file mode 100644 index 000000000000..a7c11bb8dec6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary.html @@ -0,0 +1,32 @@ + + + +CSS Test: font-feature-settings descriptor + + + + + + +

The test passes if the two lines render differently, demonstrating that the "smcp" (Small Caps) feature correctly transforms lowercase letters into smaller uppercase in first line, and remains unchanged in second line.

+
+

Filler text

+
+
+

Filler text

+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-expected.html new file mode 100644 index 000000000000..09d58f5de455 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-expected.html @@ -0,0 +1,33 @@ + + + +Test @font-palette-values override-colors using relative colors (reference) + + + + +

Relative color: A

+

Simple color: A

+

Default: A

+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-ref.html new file mode 100644 index 000000000000..09d58f5de455 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-ref.html @@ -0,0 +1,33 @@ + + + +Test @font-palette-values override-colors using relative colors (reference) + + + + +

Relative color: A

+

Simple color: A

+

Default: A

+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors.html new file mode 100644 index 000000000000..a3bc7cd94446 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors.html @@ -0,0 +1,34 @@ + + + +Test @font-palette-values override-colors using relative colors + + + + + + +

Relative color: A

+

Simple color: A

+

Default: A

+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-expected.html index 2ee9d0a0c8b7..9796dda8cbc0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-expected.html @@ -11,7 +11,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } @@ -22,12 +22,12 @@ #test2 { color: blue; background: blue; - font-size: 90px; + font-size: 84px; } #test3 { color: magenta; background: magenta; - font-size: 45px; + font-size: 42px; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-ref.html index 2ee9d0a0c8b7..9796dda8cbc0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009-ref.html @@ -11,7 +11,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } @@ -22,12 +22,12 @@ #test2 { color: blue; background: blue; - font-size: 90px; + font-size: 84px; } #test3 { color: magenta; background: magenta; - font-size: 45px; + font-size: 42px; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009.html index 133f96f450cd..8dcee7f53c85 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-009.html @@ -17,7 +17,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010-expected.html index 2ee9d0a0c8b7..9796dda8cbc0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010-expected.html @@ -11,7 +11,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } @@ -22,12 +22,12 @@ #test2 { color: blue; background: blue; - font-size: 90px; + font-size: 84px; } #test3 { color: magenta; background: magenta; - font-size: 45px; + font-size: 42px; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010.html index 490c7711c9a0..d70119a98e46 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-010.html @@ -18,7 +18,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011-expected.html index 2ee9d0a0c8b7..9796dda8cbc0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011-expected.html @@ -11,7 +11,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } @@ -22,12 +22,12 @@ #test2 { color: blue; background: blue; - font-size: 90px; + font-size: 84px; } #test3 { color: magenta; background: magenta; - font-size: 45px; + font-size: 42px; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011.html index 3f6afd8a3708..cf0d620da728 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-adjust-011.html @@ -17,7 +17,7 @@ div { clear: left; float: left; - font: 60px/120px test; + font: 56px/112px test; color: orange; background: orange; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3-expected.html new file mode 100644 index 000000000000..d8d71f862012 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3-expected.html @@ -0,0 +1,13 @@ + + +CSS Reftest Reference + + +

Test passes if there is a filled green square and no red.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3.html new file mode 100644 index 000000000000..87587445e308 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3.html @@ -0,0 +1,20 @@ + + +CSS Test: font-size: 0 + + + + + +

Test passes if there is a filled green square and no red.

+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-expected.html new file mode 100644 index 000000000000..d99ea697610d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-expected.html @@ -0,0 +1,17 @@ + + + + CSS Test: font synthesis weight: bold web font should not be "double emboldened" + + +

Filler text

+ \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-ref.html new file mode 100644 index 000000000000..d99ea697610d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-ref.html @@ -0,0 +1,17 @@ + + + + CSS Test: font synthesis weight: bold web font should not be "double emboldened" + + +

Filler text

+ \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold.html new file mode 100644 index 000000000000..63a2bdcdde55 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold.html @@ -0,0 +1,23 @@ + + + + CSS Test: font synthesis weight: bold web font should not be "double emboldened" + + + + + +

Filler text

+ \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-expected.html new file mode 100644 index 000000000000..801f2fa884f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-expected.html @@ -0,0 +1,21 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the line below has slanted text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-ref.html new file mode 100644 index 000000000000..801f2fa884f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-ref.html @@ -0,0 +1,21 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the line below has slanted text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01.html new file mode 100644 index 000000000000..e5a3fb356287 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01.html @@ -0,0 +1,25 @@ + + + +CSS Test: font-variation-settings descriptor + + + + + + +

Test passes if the line below has slanted text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-expected.html new file mode 100644 index 000000000000..0d1198e08ad1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-expected.html @@ -0,0 +1,21 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the line below has lighter text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-ref.html new file mode 100644 index 000000000000..0d1198e08ad1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-ref.html @@ -0,0 +1,21 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the line below has lighter text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02.html new file mode 100644 index 000000000000..73cdf924f511 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02.html @@ -0,0 +1,26 @@ + + + +CSS Test: font-variation-settings descriptor + + + + + + +

Test passes if the line below has lighter text.

+
+ filler text +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-expected.html new file mode 100644 index 000000000000..7cfe77b1973d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-expected.html @@ -0,0 +1,29 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the text below maintains the same optical size and width, while weight varies.

+

Filler Text

+

Filler Text

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-ref.html new file mode 100644 index 000000000000..7cfe77b1973d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-ref.html @@ -0,0 +1,29 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the text below maintains the same optical size and width, while weight varies.

+

Filler Text

+

Filler Text

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03.html new file mode 100644 index 000000000000..ffa3acf49085 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03.html @@ -0,0 +1,34 @@ + + + +CSS Test: font-variation-settings descriptor + + + + + + +

Test passes if the text below maintains the same optical size and width, while weight varies.

+

Filler Text

+

Filler Text

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-expected.html new file mode 100644 index 000000000000..43464b249cd4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-expected.html @@ -0,0 +1,19 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the text below renders correct text weight.

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-ref.html new file mode 100644 index 000000000000..43464b249cd4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-ref.html @@ -0,0 +1,19 @@ + + + +CSS Test: font-variation-settings descriptor + + +

Test passes if the text below renders correct text weight.

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04.html new file mode 100644 index 000000000000..25640401067b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04.html @@ -0,0 +1,23 @@ + + + +CSS Test: font-variation-settings descriptor + + + + + + +

Test passes if the text below renders correct text weight.

+

Filler Text

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002-expected.txt new file mode 100644 index 000000000000..0bb02d6f6c1e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002-expected.txt @@ -0,0 +1,6 @@ +Test passes if font variation settings are correctly sorted in serialization. + +Sample text + +PASS Check if font variation settings serialization is sorted. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002.html new file mode 100644 index 000000000000..47a518f18b66 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002.html @@ -0,0 +1,32 @@ + + + +CSS Test: font-variation-settings serialization + + + + + + + +

Test passes if font variation settings are correctly sorted in serialization.

+
Sample text
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration-expected.txt new file mode 100644 index 000000000000..8f7e9ce820ac --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration-expected.txt @@ -0,0 +1,3 @@ + +FAIL Iteration of the CSSFontFeatureValuesMap does not crash. undefined is not an object (evaluating 'map.entries') + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration.html new file mode 100644 index 000000000000..eac7198b0b4a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration.html @@ -0,0 +1,52 @@ + + + + CSSFontFeatureValuesMap Iteration and Modification + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.html deleted file mode 100644 index 01b95e8e72e5..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - -"If a given character is a Private-Use Area Unicode codepoint, user agents must only match font families named in the font-family list that are not generic families. If none of the families named in the font-family list contain a glyph for that codepoint, user agents must display some form of missing glyph symbol for that character rather than attempting installed font fallback for that codepoint." - css-fonts-4 -

The first line should render as the second. This means that no generic font was used during fallback and the first non generic font was used.

-



-



- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.txt new file mode 100644 index 000000000000..721a8cdcfca3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.txt @@ -0,0 +1,12 @@ +"If a given character is a Private-Use Area Unicode codepoint, user agents must only match font families named in the font-family list that are not generic families. If none of the families named in the font-family list contain a glyph for that codepoint, user agents must display some form of missing glyph symbol for that character rather than attempting installed font fallback for that codepoint." - css-fonts-4 +The first line should render as the second. This means that no generic font was used during fallback and the first non generic font was used. + + + + + + +PASS PUA character U+F000 is rendered with a non-generic font. +PASS PUA character U+F001 is rendered with a non-generic font. +PASS PUA character U+F002 is rendered with a non-generic font. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-ref.html deleted file mode 100644 index 01b95e8e72e5..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-ref.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - -"If a given character is a Private-Use Area Unicode codepoint, user agents must only match font families named in the font-family list that are not generic families. If none of the families named in the font-family list contain a glyph for that codepoint, user agents must display some form of missing glyph symbol for that character rather than attempting installed font fallback for that codepoint." - css-fonts-4 -

The first line should render as the second. This means that no generic font was used during fallback and the first non generic font was used.

-



-



- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA.html index 9ed897aa0063..afc55d114ab4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA.html @@ -3,23 +3,40 @@ - + + + "If a given character is a Private-Use Area Unicode codepoint, user agents must only match font families named in the font-family list that are not generic families. If none of the families named in the font-family list contain a glyph for that codepoint, user agents must display some form of missing glyph symbol for that character rather than attempting installed font fallback for that codepoint." - css-fonts-4

The first line should render as the second. This means that no generic font was used during fallback and the first non generic font was used.

-



-



+

+

+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-expected.html new file mode 100644 index 000000000000..1d2b66811b8a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-expected.html @@ -0,0 +1,35 @@ + + + + + +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+ +
+ +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-ref.html new file mode 100644 index 000000000000..1d2b66811b8a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-ref.html @@ -0,0 +1,35 @@ + + + + + +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+ +
+ +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction.html new file mode 100644 index 000000000000..24ae55bc76ec --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction.html @@ -0,0 +1,48 @@ + + + +CSS Fonts 4: Font matching algorithm + + + + + + + + +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+ +
+ + +
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be normal weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
+
This should be bold weight
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/w3c-import.log index c82ac2f4722e..10014c9d8e7c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/w3c-import.log @@ -16,4 +16,3 @@ None List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/AhemCrossmarkSupport.otf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/variabletest_matching.ttf -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/resources/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/w3c-import.log index 08fbc2aa1cb3..ca64be0c6333 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/w3c-import.log @@ -20,15 +20,16 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/fixed-stretch-style-over-weight-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/fixed-stretch-style-over-weight.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-matching.css -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-primary-font-expected-mismatch.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-primary-font-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-primary-font.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-PUA.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-presented-as-emoji-outline-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-presented-as-emoji-outline-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-unicode-presented-as-emoji-outline.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/font-weight-search-direction.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/range-descriptor-reversed-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/range-descriptor-reversed-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/range-descriptor-reversed.html @@ -38,4 +39,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/style-ranges-over-weight-direction-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/style-ranges-over-weight-direction-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/style-ranges-over-weight-direction.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/matching/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/w3c-import.log index dbeda23569bc..fc17dbdf7373 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/w3c-import.log @@ -46,4 +46,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/math-script-level-and-math-style/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping-expected.txt new file mode 100644 index 000000000000..397d49a6f3c5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping-expected.txt @@ -0,0 +1,8 @@ +ᠠᠨ᠎ᠠ + +PASS ᠢ -> AI.isol(993) +PASS ᠠ -> AA.isol(929) +PASS ᠠᠨ -> AA.init(786)|A.fina(427) +PASS ᠠᠨ᠎ᠢ -> AA.init(786)|A.fina(427)|mvs.wide(260)|I.isol(548) +PASS ᠠᠨ᠎ᠠ -> AA.init(786)|N.fina.mvs(427)|mvs.narrow(55)|Aa.isol(415) + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping.html new file mode 100644 index 000000000000..4a728d7b7f95 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping.html @@ -0,0 +1,45 @@ + + + +CSS test: shaping with Mongolian Vowel Separator + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/parsing/font-variant-serialization-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/parsing/font-variant-serialization-expected.txt index b37cf467c49f..1a42d4fc7e96 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/parsing/font-variant-serialization-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/parsing/font-variant-serialization-expected.txt @@ -1,3 +1,3 @@ -FAIL checking serialized value of font-variant assert_equals: expected "tabular-nums" but got "" +PASS checking serialized value of font-variant diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/NotoSansMongolian-18xx.woff2 b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/NotoSansMongolian-18xx.woff2 new file mode 100644 index 000000000000..f5ea7418b759 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/NotoSansMongolian-18xx.woff2 differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar1[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar1[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..028df35ba775 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar1[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar2[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar2[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..1088c0a91a5e Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar2[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTest[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTest[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..b0be5285273d Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTest[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar1[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar1[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..d7a493de1081 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar1[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar2[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar2[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..5dbb06ad0275 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar2[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTest[opsz,wdth,wght].ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTest[opsz,wdth,wght].ttf new file mode 100644 index 000000000000..8e262b0b7331 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTest[opsz,wdth,wght].ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/w3c-import.log new file mode 100644 index 000000000000..5468b4637222 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/w3c-import.log @@ -0,0 +1,22 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar1[opsz,wdth,wght].ttf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTestAvar2[opsz,wdth,wght].ttf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/DesignSpaceWarpTest[opsz,wdth,wght].ttf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar1[opsz,wdth,wght].ttf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTestAvar2[opsz,wdth,wght].ttf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar/rvrnTest[opsz,wdth,wght].ttf diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar2_kern_test.ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar2_kern_test.ttf new file mode 100644 index 000000000000..ff80c60cf24d Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar2_kern_test.ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/w3c-import.log index e6d854a74f8c..89746260f7aa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/w3c-import.log @@ -21,4 +21,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/NotoSansJP-Regular_with-cmap14-subset.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/NotoSansMath-Regular_without-cmap14-subset.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/STIXTwoMath-Regular_with-cmap14-subset.ttf -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/vs/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/w3c-import.log index 38acd646c2eb..43ae2688bc72 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/w3c-import.log @@ -17,10 +17,11 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/COLR-palettes-test-font-no-light-dark.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/COLR-palettes-test-font.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/NotoSansJP-kana_test-subset.otf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/NotoSansMongolian-18xx.woff2 /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/ahem-ex-250.otf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/ahem-ex-500.otf +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/avar2_kern_test.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/colorization_SVG_COLR.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/markA.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/markB.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/separator-test-font.ttf -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-expected.html index f7afe19eb687..d1d56f576f7d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-expected.html @@ -11,11 +11,11 @@ } -

V O

-

V
O

-

V
O

+

V O

+

V
O

+

V
O

-

V O

-

V O

-

V O

+

V O

+

V O

+

V O

\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-ref.html index f7afe19eb687..d1d56f576f7d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators-ref.html @@ -11,11 +11,11 @@ } -

V O

-

V
O

-

V
O

+

V O

+

V
O

+

V
O

-

V O

-

V O

-

V O

+

V O

+

V O

+

V O

\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators.html index 0083b35ad943..b2ec6a2a5340 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/separators.html @@ -14,11 +14,11 @@ } -

V O

-

V
O

-

V
O

+

V O

+

V
O

+

V
O

-

V O

-

V
O

-

V
O

+

V O

+

V
O

+

V
O

\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/w3c-import.log index 933f3d85dce3..84e9d53267b3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/w3c-import.log @@ -16,4 +16,3 @@ None List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/font-variant-features.css /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/variation-sequences.css -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/css/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/RobotoExtremo-VF-wght-400-500.subset.ttf b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/RobotoExtremo-VF-wght-400-500.subset.ttf new file mode 100644 index 000000000000..3897d45e5541 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/RobotoExtremo-VF-wght-400-500.subset.ttf differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/w3c-import.log index 90a7a923ee13..a8c3d7c15876 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/w3c-import.log @@ -1447,7 +1447,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/vrt2.default.glif /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/vrt2.fail.glif /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/vrt2.pass.glif -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/w3c-import.log /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/zero.alt1.glif /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/zero.alt2.glif /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/glyphs/zero.alt3.glif diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/w3c-import.log index 56060a64282b..74a3524281b0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/w3c-import.log @@ -17,4 +17,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/features.fea /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/fontinfo.plist /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/metainfo.plist -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/gsubtest-lookup3.ufo/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/w3c-import.log index 4a31f78d6022..b130d21bf21b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/w3c-import.log @@ -23,6 +23,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/Inter-VF.subset.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/LigatureSymbolsWithSpaces.woff /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/LinLibertine_Re-4.7.5.woff +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/RobotoExtremo-VF-wght-400-500.subset.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/RobotoExtremo-VF.subset.ttf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/Rochester.otf /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/fail.woff @@ -34,4 +35,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/makegsubfonts.py /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/pass.woff /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/roboto_var_light_range.ttf -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/fonts/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/w3c-import.log index 7bb9de968d14..d6704bd8942b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/w3c-import.log @@ -16,4 +16,3 @@ None List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/font-variant-features.js /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/variation-sequences.js -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/js/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/w3c-import.log index 782488463510..19261df5cf59 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/w3c-import.log @@ -71,4 +71,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/test-tl.png /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/test-tr.png /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/transparent_green.png -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/support/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-expected.html new file mode 100644 index 000000000000..942b2529f622 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-expected.html @@ -0,0 +1,16 @@ + + +Tests that font-weight with value outside of the 'wght' range support by the font does not synthesize bold faces. + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-ref.html new file mode 100644 index 000000000000..942b2529f622 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-ref.html @@ -0,0 +1,16 @@ + + +Tests that font-weight with value outside of the 'wght' range support by the font does not synthesize bold faces. + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range.html new file mode 100644 index 000000000000..db2d8c7f57fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range.html @@ -0,0 +1,20 @@ + + +Tests that font-weight with value outside of the 'wght' range support by the font does not synthesize bold faces. + + + + + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-expected.html new file mode 100644 index 000000000000..f2a5ba01aef2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-expected.html @@ -0,0 +1,16 @@ + + +Tests that font-style with angle outside of the 'slnt' range support by the font does not synthesize oblique faces. + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-ref.html new file mode 100644 index 000000000000..f2a5ba01aef2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-ref.html @@ -0,0 +1,16 @@ + + +Tests that font-style with angle outside of the 'slnt' range support by the font does not synthesize oblique faces. + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range.html new file mode 100644 index 000000000000..9d6d7a981af4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range.html @@ -0,0 +1,20 @@ + + +Tests that font-style with angle outside of the 'slnt' range support by the font does not synthesize oblique faces. + + + + + + +

text

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-expected-mismatch.html deleted file mode 100644 index ec5051519d70..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-expected-mismatch.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - CSS Fonts: font-weight: bold; with bold font face without explicit font weight - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is bolder than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-notref.html deleted file mode 100644 index ec5051519d70..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-notref.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - CSS Fonts: font-weight: bold; with bold font face without explicit font weight - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is bolder than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2.html deleted file mode 100644 index b7930c172c2a..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - CSS Fonts: font-weight: bold; with bold font face without explicit font weight - - - - - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is bolder than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-expected-mismatch.html deleted file mode 100644 index d6f9050be302..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-expected-mismatch.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - CSS Fonts: font-style: italic; with italic font face without explicit font style - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is more italic than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-notref.html deleted file mode 100644 index d6f9050be302..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-notref.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - CSS Fonts: font-style: italic; with italic font face without explicit font style - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is more italic than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4.html deleted file mode 100644 index fa1f815b4219..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - CSS Fonts: font-style: italic; with italic font face without explicit font style - - - - - - - - -
Test fonts must be installed for this test: FAIL
-

Test passes if the second line is more italic than the first:

-
Filler text
-
Filler text
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/WEB_FEATURES.yml index c035a0ee11b7..792e97835e2d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/WEB_FEATURES.yml @@ -2,3 +2,12 @@ features: - name: font-optical-sizing files: - variable-opsz* +- name: font-style + files: + - font-slant-* +- name: font-variation-settings + files: + - font-variation-settings-inherit.html +- name: font-stretch + files: + - font-stretch.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors-expected.txt index 2dc7230aad96..925d3a6e436d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors-expected.txt @@ -20,7 +20,7 @@ PASS font-weight(valid): Valid calc expression: calc(100.5*3 + 50.5) PASS font-weight(valid): Valid calc expression with out-of-range value: calc(100.5*3 + 800) PASS font-weight(invalid): Valid calc expression with units: calc(100.5px + 50.5px) PASS font-weight(valid): Simple range: 100 900 -FAIL font-weight(valid): Simple range with equal upper and lower bounds: 500 500 assert_equals: Unexpected resulting value. expected "500" but got "500 500" +PASS font-weight(valid): Simple range with equal upper and lower bounds: 500 500 PASS font-weight(invalid): Lower bound out of range: 0.9 100 PASS font-weight(invalid): Upper bound out of range: 100 1001 PASS font-weight(valid): Lower bound calc(): calc(100 + 100) 400 @@ -54,7 +54,7 @@ PASS font-stretch(valid): Negative calc expression (to be clamped): calc(50% - 5 PASS font-stretch(invalid): Unit-less calc value: calc(100) PASS font-stretch(invalid): Calc value with units: calc(100px) PASS font-stretch(valid): Simple range: 100% 200% -FAIL font-stretch(valid): Simple range with equal upper and lower bounds: 100% 100% assert_equals: Unexpected resulting value. expected "100%" but got "100% 100%" +PASS font-stretch(valid): Simple range with equal upper and lower bounds: 100% 100% PASS font-stretch(invalid): Lower bound out of range: -100% 100% PASS font-stretch(valid): Lower bound calc(): calc(10% + 10%) 30% PASS font-stretch(valid): Upper bound calc(): 10% calc(10% + 10%) @@ -73,7 +73,7 @@ PASS font-style(valid): 'oblique' followed by maxumum 90 degree angle: oblique 9 PASS font-style(valid): 'oblique' followed by minimum -90 degree angle: oblique -90deg PASS font-style(valid): 'oblique' followed by calc with out of range value (should be clamped): oblique calc(91deg) PASS font-style(valid): 'oblique' followed by calc with out of range value (should be clamped): oblique calc(-91deg) -FAIL font-style(valid): 'oblique' followed by angle in radians: oblique 0rad assert_equals: Unexpected resulting value. expected "oblique 0deg" but got "oblique 0rad" +PASS font-style(valid): 'oblique' followed by angle in radians: oblique 0rad PASS font-style(invalid): 'oblique' followed by unit-less number: oblique 20 PASS font-style(invalid): 'oblique' followed by non-angle: oblique 20px PASS font-style(invalid): 'oblique' followed by non-number: oblique a @@ -81,7 +81,8 @@ PASS font-style(invalid): 'oblique' followed by isolated minus: oblique - PASS font-style(invalid): 'oblique' followed by minus and angle separated by space: oblique - 20deg PASS font-style(invalid): 'oblique' followed by minus and non-number: oblique -a PASS font-style(valid): Simple range: oblique 10deg 20deg -FAIL font-style(valid): Simple range with equal upper and lower bounds: oblique 10deg 10deg assert_equals: Unexpected resulting value. expected "oblique 10deg" but got "oblique 10deg 10deg" +PASS font-style(valid): Simple range with equal upper and lower bounds: oblique 10deg 10deg +PASS font-style(valid): Simple range with equal upper and lower bounds: oblique 0deg 0deg PASS font-style(valid): Simple range with former default angle for both bounds: oblique 20deg 20deg PASS font-style(valid): Bounds out of order: oblique 20deg 10deg PASS font-style(invalid): Lower bound out of range: oblique -100deg 20deg diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors.html index 7e9792730dc1..eaa4a988c7f4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-descriptors.html @@ -146,13 +146,13 @@ // Single value { value: "italic 20deg", isValid: false, description: "'italic' followed by angle" }, { value: "italic a", isValid: false, description: "Extra content after keyword" }, - { value: "oblique 0deg", isValid: true, description: "'oblique' followed by zero degrees" }, + { value: "oblique 0deg", isValid: true, expectedValue: "normal", description: "'oblique' followed by zero degrees" }, { value: "oblique 20deg", isValid: true, description: "'oblique' followed by former default 20deg angle" }, { value: "oblique 90deg", isValid: true, description: "'oblique' followed by maxumum 90 degree angle" }, { value: "oblique -90deg", isValid: true, description: "'oblique' followed by minimum -90 degree angle" }, { value: "oblique calc(91deg)", isValid: true, description: "'oblique' followed by calc with out of range value (should be clamped)" }, { value: "oblique calc(-91deg)", isValid: true, description: "'oblique' followed by calc with out of range value (should be clamped)" }, - { value: "oblique 0rad", isValid: true, expectedValue: "oblique 0deg", description: "'oblique' followed by angle in radians" }, + { value: "oblique 0rad", isValid: true, expectedValue: "normal", description: "'oblique' followed by angle in radians" }, { value: "oblique 20", isValid: false, description: "'oblique' followed by unit-less number" }, { value: "oblique 20px", isValid: false, description: "'oblique' followed by non-angle" }, { value: "oblique a", isValid: false, description: "'oblique' followed by non-number" }, @@ -163,7 +163,8 @@ // Value range { value: "oblique 10deg 20deg", isValid: true, description: "Simple range" }, { value: "oblique 10deg 10deg", isValid: true, expectedValue: "oblique 10deg", description: "Simple range with equal upper and lower bounds" }, - { value: "oblique 20deg 20deg", isValid: true, description: "Simple range with former default angle for both bounds" }, + { value: "oblique 0deg 0deg", isValid: true, expectedValue: "normal", description: "Simple range with equal upper and lower bounds" }, + { value: "oblique 20deg 20deg", isValid: true, expectedValue: "oblique 20deg", description: "Simple range with former default angle for both bounds" }, { value: "oblique 20deg 10deg", isValid: true, expectedValue: "oblique 20deg 10deg", description: "Bounds out of order" }, { value: "oblique -100deg 20deg", isValid: false, description: "Lower bound out of range" }, { value: "oblique 20deg 100deg", isValid: false, description: "Upper bound out of range" }, diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-font-matching-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-font-matching-expected.txt index e8319d9c1f63..b69ded3eb356 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-font-matching-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/at-font-face-font-matching-expected.txt @@ -9,7 +9,7 @@ PASS Matching font-weight: '400' should prefer '500' over '350 399' PASS Matching font-weight: '400' should prefer '350 399' over '351 398' PASS Matching font-weight: '400' should prefer '351 398' over '501 550' PASS Matching font-weight: '400' should prefer '501 550' over '502 560' -FAIL Matching font-weight: '430' should prefer '420 440' over '450 460' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-weight: '430' should prefer '420 440' over '450 460' PASS Matching font-weight: '430' should prefer '450 460' over '500' PASS Matching font-weight: '430' should prefer '500' over '400 425' PASS Matching font-weight: '430' should prefer '400 425' over '350 399' @@ -17,7 +17,7 @@ PASS Matching font-weight: '430' should prefer '350 399' over '340 398' PASS Matching font-weight: '430' should prefer '340 398' over '501 550' PASS Matching font-weight: '430' should prefer '501 550' over '502 560' PASS Matching font-weight: '500' should prefer '500' over '450 460' -FAIL Matching font-weight: '500' should prefer '450 460' over '400' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-weight: '500' should prefer '450 460' over '400' PASS Matching font-weight: '500' should prefer '400' over '350 399' PASS Matching font-weight: '500' should prefer '350 399' over '351 398' PASS Matching font-weight: '500' should prefer '351 398' over '501 550' @@ -47,7 +47,7 @@ PASS Matching font-stretch: '90%' should prefer '60% 70%' over '110% 140%' PASS Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%' PASS Matching font-style: 'normal' should prefer 'normal' over 'oblique 10deg 40deg' PASS Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg' -FAIL Matching font-style: 'normal' should prefer 'oblique 20deg 30deg' over 'oblique -50deg -20deg' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-style: 'normal' should prefer 'oblique 20deg 30deg' over 'oblique -50deg -20deg' PASS Matching font-style: 'normal' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg' PASS Matching font-style: 'italic' should prefer 'italic' over 'oblique 20deg' PASS Matching font-style: 'italic' should prefer 'oblique 20deg' over 'oblique 30deg 60deg' @@ -57,13 +57,13 @@ PASS Matching font-style: 'italic' should prefer 'oblique 5deg 10deg' over 'obli PASS Matching font-style: 'italic' should prefer 'oblique 5deg' over 'normal' PASS Matching font-style: 'italic' should prefer 'normal' over 'oblique -60deg -30deg' PASS Matching font-style: 'italic' should prefer 'oblique -60deg -30deg' over 'oblique -50deg -40deg' -FAIL Matching font-style: 'oblique 20deg' should prefer 'oblique 20deg' over 'oblique 30deg 60deg' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-style: 'oblique 20deg' should prefer 'oblique 20deg' over 'oblique 30deg 60deg' PASS Matching font-style: 'oblique 20deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' PASS Matching font-style: 'oblique 20deg' should prefer 'oblique 40deg 50deg' over 'oblique 10deg' PASS Matching font-style: 'oblique 20deg' should prefer 'oblique 10deg' over 'oblique 0deg' PASS Matching font-style: 'oblique 20deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg' PASS Matching font-style: 'oblique 20deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg' -FAIL Matching font-style: 'oblique 20deg' should prefer 'oblique -40deg -30deg' over 'italic' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-style: 'oblique 20deg' should prefer 'oblique -40deg -30deg' over 'italic' PASS Matching font-style: 'oblique 21deg' should prefer 'oblique 21deg' over 'oblique 30deg 60deg' PASS Matching font-style: 'oblique 21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' PASS Matching font-style: 'oblique 21deg' should prefer 'oblique 40deg 50deg' over 'oblique 20deg' @@ -74,37 +74,37 @@ PASS Matching font-style: 'oblique 21deg' should prefer 'oblique -50deg -20deg' PASS Matching font-style: 'oblique 21deg' should prefer 'oblique -40deg -30deg' over 'italic' PASS Matching font-style: 'oblique 10deg' should prefer 'oblique 10deg' over 'oblique 5deg' PASS Matching font-style: 'oblique 10deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg' -FAIL Matching font-style: 'oblique 10deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique 10deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique 10deg' should prefer 'oblique 40deg 50deg' over 'oblique 0deg' assert_equals: Unexpected font on test element expected 277 but got 533 +PASS Matching font-style: 'oblique 10deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg' +PASS Matching font-style: 'oblique 10deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' +FAIL Matching font-style: 'oblique 10deg' should prefer 'oblique 40deg 50deg' over 'oblique 0deg' assert_equals: Unexpected font on test element expected 488 but got 533 PASS Matching font-style: 'oblique 10deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg' PASS Matching font-style: 'oblique 10deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg' PASS Matching font-style: 'oblique 10deg' should prefer 'oblique -40deg -30deg' over 'italic' PASS Matching font-style: 'oblique 0deg' should prefer 'oblique 0deg' over 'oblique 5deg' PASS Matching font-style: 'oblique 0deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg' -FAIL Matching font-style: 'oblique 0deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique 0deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique 0deg' should prefer 'oblique 40deg 50deg' over 'oblique -50deg -20deg' assert_equals: Unexpected font on test element expected 488 but got 533 +PASS Matching font-style: 'oblique 0deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg' +PASS Matching font-style: 'oblique 0deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' +PASS Matching font-style: 'oblique 0deg' should prefer 'oblique 40deg 50deg' over 'oblique -50deg -20deg' PASS Matching font-style: 'oblique 0deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg' -PASS Matching font-style: 'oblique 0deg' should prefer 'oblique -40deg -30deg' over 'italic' +FAIL Matching font-style: 'oblique 0deg' should prefer 'oblique -40deg -30deg' over 'italic' assert_equals: Unexpected font on test element expected 488 but got 533 PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -10deg' over 'oblique -5deg' PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -5deg' over 'oblique -1deg 0deg' PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -1deg 0deg' over 'oblique -20deg -15deg' PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -20deg -15deg' over 'oblique -60deg -30deg' PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -60deg -30deg' over 'oblique -50deg -40deg' -PASS Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'oblique 0deg 10deg' +FAIL Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'oblique 0deg 10deg' assert_equals: Unexpected font on test element expected 488 but got 533 PASS Matching font-style: 'oblique -10deg' should prefer 'oblique 0deg 10deg' over 'oblique 40deg 50deg' -FAIL Matching font-style: 'oblique -10deg' should prefer 'oblique 40deg 50deg' over 'italic' assert_equals: Unexpected font on test element expected 277 but got 533 +PASS Matching font-style: 'oblique -10deg' should prefer 'oblique 40deg 50deg' over 'italic' PASS Matching font-style: 'oblique -20deg' should prefer 'oblique -20deg' over 'oblique -60deg -40deg' PASS Matching font-style: 'oblique -20deg' should prefer 'oblique -60deg -40deg' over 'oblique -10deg' PASS Matching font-style: 'oblique -20deg' should prefer 'oblique -10deg' over 'oblique 0deg' PASS Matching font-style: 'oblique -20deg' should prefer 'oblique 0deg' over 'oblique 30deg 60deg' -FAIL Matching font-style: 'oblique -20deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique -20deg' should prefer 'oblique 40deg 50deg' over 'italic' assert_equals: Unexpected font on test element expected 277 but got 533 +PASS Matching font-style: 'oblique -20deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' +PASS Matching font-style: 'oblique -20deg' should prefer 'oblique 40deg 50deg' over 'italic' PASS Matching font-style: 'oblique -21deg' should prefer 'oblique -21deg' over 'oblique -60deg -40deg' PASS Matching font-style: 'oblique -21deg' should prefer 'oblique -60deg -40deg' over 'oblique -10deg' PASS Matching font-style: 'oblique -21deg' should prefer 'oblique -10deg' over 'oblique 0deg' PASS Matching font-style: 'oblique -21deg' should prefer 'oblique 0deg' over 'oblique 30deg 60deg' -FAIL Matching font-style: 'oblique -21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' assert_equals: Unexpected font on test element expected 277 but got 533 -FAIL Matching font-style: 'oblique -21deg' should prefer 'oblique 40deg 50deg' over 'italic' assert_equals: Unexpected font on test element expected 277 but got 533 +PASS Matching font-style: 'oblique -21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg' +PASS Matching font-style: 'oblique -21deg' should prefer 'oblique 40deg 50deg' over 'italic' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/font-stretch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/font-stretch.html index a27b251f480f..f652703511c3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/font-stretch.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/font-stretch.html @@ -7,7 +7,7 @@ -
Abc
+
Abc
AbcAbcAbc
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-expected.html new file mode 100644 index 000000000000..71f5775b5798 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-expected.html @@ -0,0 +1,41 @@ + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-mismatch.html new file mode 100644 index 000000000000..72c768e2732e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-mismatch.html @@ -0,0 +1,38 @@ + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-ref.html new file mode 100644 index 000000000000..71f5775b5798 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-ref.html @@ -0,0 +1,41 @@ + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn.html new file mode 100644 index 000000000000..8181d4989de0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn.html @@ -0,0 +1,42 @@ + + + + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected-mismatch.html new file mode 100644 index 000000000000..30e7d8bef026 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected-mismatch.html @@ -0,0 +1,38 @@ + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected.html new file mode 100644 index 000000000000..840a3228e7a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected.html @@ -0,0 +1,35 @@ + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-mismatch.html new file mode 100644 index 000000000000..30e7d8bef026 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-mismatch.html @@ -0,0 +1,38 @@ + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-ref.html new file mode 100644 index 000000000000..840a3228e7a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-ref.html @@ -0,0 +1,35 @@ + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp.html new file mode 100644 index 000000000000..8981a485e559 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp.html @@ -0,0 +1,42 @@ + + + Avar2 Designspace warping tested against avar1 reference + + + + + + + H + H + H + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-expected.html new file mode 100644 index 000000000000..bc2f4e655c3e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-expected.html @@ -0,0 +1,38 @@ + + + + + + Avar2 GPOS Variable Kerning Reference + + + + + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖ ⌖
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-ref.html new file mode 100644 index 000000000000..bc2f4e655c3e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-ref.html @@ -0,0 +1,38 @@ + + + + + + Avar2 GPOS Variable Kerning Reference + + + + + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖ ⌖
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2.html new file mode 100644 index 000000000000..4b9c72a6ab42 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2.html @@ -0,0 +1,48 @@ + + + + + + Avar2 GPOS Variable Kerning Test + + + + + + + + + + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖⌖
+ + +
⌖ ⌖
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/w3c-import.log index fc5776af1a51..85afaee5c63d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/w3c-import.log @@ -55,9 +55,22 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/slnt-variable-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/slnt-variable-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/slnt-variable.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-expected-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-rvrn.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-avar2-warp.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-box-font-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-box-font-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-box-font.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-avar2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-m2b-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-m2b-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-gpos-m2b.html @@ -70,4 +83,3 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-opsz-size-adjust-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-opsz-size-adjust.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/variable-opsz.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variations/w3c-import.log diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/w3c-import.log index b37246e96258..20e4e466f035 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/w3c-import.log @@ -183,6 +183,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-01-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-01-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-01.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-02.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-descriptor-binary.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-serialization-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-tibetan-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-tibetan-ref.html @@ -354,6 +360,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-remove-expected-mismatch.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-remove-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-remove.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-values-relative-colors.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-vs-shorthand.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-shorthand-serialization-001.html @@ -432,6 +441,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-2-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-2-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-2.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-3.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-size-zero-ligatures.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-stretch-01-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-stretch-01.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-stretch-02-expected.html @@ -537,6 +549,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-first-line-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-first-line.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight-webfont-bold.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-synthesis-weight.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variant-01-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variant-01-ref.html @@ -772,7 +787,20 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variant-position-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variant-position.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-calc.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-01.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-02.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-03.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-descriptor-04.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-variation-settings-serialization-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-bolder-001-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-bolder-001-ref.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-bolder-001.xht @@ -783,6 +811,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-normal-001-ref.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-normal-001.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-weight-sign-function.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font_feature_values_map_iteration.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/format-specifiers-variations.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-002.html @@ -809,6 +838,11 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/metrics-override-normal-keyword-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/metrics-override-normal-keyword-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/metrics-override-normal-keyword.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/mvs-shaping.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/oblique-last-resort-weight-selection-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/oblique-last-resort-weight-selection-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/oblique-last-resort-weight-selection.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/oblique-request-italic-only-family-no-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/palette-mix-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/palette-values-rule-add-2-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/palette-values-rule-add-2-ref.html @@ -924,9 +958,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/standard-font-family-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/standard-font-family-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/standard-font-family.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-out-of-capabilities-range.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-space-width-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-space-width-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-bold-space-width.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/synthetic-oblique-out-of-capabilities-range.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-fonts-serialization.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-ui-ar-expected-mismatch.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-ui-ar-notref.html @@ -950,9 +990,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-ui-zh-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-ui-zh.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-ui.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-expected-mismatch.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2-notref.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-expected-mismatch.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-bold.html @@ -962,9 +999,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-3-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-3-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-3.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-expected-mismatch.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4-notref.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-4.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-expected-mismatch.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/test-synthetic-italic.html @@ -976,7 +1010,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variation-sequences-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variation-sequences-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/variation-sequences.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/w3c-import.log /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/web-font-no-longer-accessible-when-stylesheet-removed-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/web-font-no-longer-accessible-when-stylesheet-removed-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/web-font-no-longer-accessible-when-stylesheet-removed.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-expected.html new file mode 100644 index 000000000000..33b1e55747a6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-expected.html @@ -0,0 +1,19 @@ + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-ref.html new file mode 100644 index 000000000000..33b1e55747a6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-ref.html @@ -0,0 +1,19 @@ + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026.html new file mode 100644 index 000000000000..94e5c6fbefce --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026.html @@ -0,0 +1,25 @@ + + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/w3c-import.log index 627fd88f20f7..bb67c46a00b3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/w3c-import.log @@ -431,6 +431,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-025-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-025-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-025.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-026.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-negative-indices-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/abspos/positioned-grid-items-negative-indices-001-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-expected.html new file mode 100644 index 000000000000..33b1e55747a6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-expected.html @@ -0,0 +1,19 @@ + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-ref.html new file mode 100644 index 000000000000..33b1e55747a6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-ref.html @@ -0,0 +1,19 @@ + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004.html new file mode 100644 index 000000000000..8d6ceec60848 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004.html @@ -0,0 +1,25 @@ + + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/w3c-import.log index 26959398fbed..68819fe20480 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/w3c-import.log @@ -29,6 +29,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-003-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-003-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-out-of-flow-004.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-positioned-item-dynamic-change-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-positioned-item-dynamic-change-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/abspos/column-grid-lanes-positioned-item-dynamic-change.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation-expected.txt new file mode 100644 index 000000000000..1f271a926653 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation-expected.txt @@ -0,0 +1,242 @@ + +FAIL CSS Transitions: property from [10px] to [50px] at (-1) should be [0px] assert_equals: expected "0px " but got "10px " +PASS CSS Transitions: property from [10px] to [50px] at (0) should be [10px] +FAIL CSS Transitions: property from [10px] to [50px] at (0.25) should be [20px] assert_equals: expected "20px " but got "10px " +FAIL CSS Transitions: property from [10px] to [50px] at (0.5) should be [30px] assert_equals: expected "30px " but got "10px " +FAIL CSS Transitions: property from [10px] to [50px] at (0.75) should be [40px] assert_equals: expected "40px " but got "10px " +FAIL CSS Transitions: property from [10px] to [50px] at (1) should be [50px] assert_equals: expected "50px " but got "10px " +FAIL CSS Transitions: property from [10px] to [50px] at (2) should be [90px] assert_equals: expected "90px " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (-1) should be [0px] assert_equals: expected "0px " but got "10px " +PASS CSS Transitions with transition: all: property from [10px] to [50px] at (0) should be [10px] +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (0.25) should be [20px] assert_equals: expected "20px " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (0.5) should be [30px] assert_equals: expected "30px " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (0.75) should be [40px] assert_equals: expected "40px " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (1) should be [50px] assert_equals: expected "50px " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50px] at (2) should be [90px] assert_equals: expected "90px " but got "10px " +FAIL CSS Animations: property from [10px] to [50px] at (-1) should be [0px] assert_equals: expected "0px " but got "10px " +PASS CSS Animations: property from [10px] to [50px] at (0) should be [10px] +FAIL CSS Animations: property from [10px] to [50px] at (0.25) should be [20px] assert_equals: expected "20px " but got "10px " +FAIL CSS Animations: property from [10px] to [50px] at (0.5) should be [30px] assert_equals: expected "30px " but got "10px " +FAIL CSS Animations: property from [10px] to [50px] at (0.75) should be [40px] assert_equals: expected "40px " but got "10px " +FAIL CSS Animations: property from [10px] to [50px] at (1) should be [50px] assert_equals: expected "50px " but got "10px " +FAIL CSS Animations: property from [10px] to [50px] at (2) should be [90px] assert_equals: expected "90px " but got "10px " +FAIL Web Animations: property from [10px] to [50px] at (-1) should be [0px] assert_equals: expected "0px " but got "10px " +PASS Web Animations: property from [10px] to [50px] at (0) should be [10px] +FAIL Web Animations: property from [10px] to [50px] at (0.25) should be [20px] assert_equals: expected "20px " but got "10px " +FAIL Web Animations: property from [10px] to [50px] at (0.5) should be [30px] assert_equals: expected "30px " but got "10px " +FAIL Web Animations: property from [10px] to [50px] at (0.75) should be [40px] assert_equals: expected "40px " but got "10px " +FAIL Web Animations: property from [10px] to [50px] at (1) should be [50px] assert_equals: expected "50px " but got "10px " +FAIL Web Animations: property from [10px] to [50px] at (2) should be [90px] assert_equals: expected "90px " but got "10px " +PASS CSS Transitions: property from [10%] to [50%] at (0) should be [10%] +FAIL CSS Transitions: property from [10%] to [50%] at (0.5) should be [30%] assert_equals: expected "30 % " but got "10 % " +FAIL CSS Transitions: property from [10%] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10 % " +PASS CSS Transitions with transition: all: property from [10%] to [50%] at (0) should be [10%] +FAIL CSS Transitions with transition: all: property from [10%] to [50%] at (0.5) should be [30%] assert_equals: expected "30 % " but got "10 % " +FAIL CSS Transitions with transition: all: property from [10%] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10 % " +PASS CSS Animations: property from [10%] to [50%] at (0) should be [10%] +FAIL CSS Animations: property from [10%] to [50%] at (0.5) should be [30%] assert_equals: expected "30 % " but got "10 % " +FAIL CSS Animations: property from [10%] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10 % " +PASS Web Animations: property from [10%] to [50%] at (0) should be [10%] +FAIL Web Animations: property from [10%] to [50%] at (0.5) should be [30%] assert_equals: expected "30 % " but got "10 % " +FAIL Web Animations: property from [10%] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10 % " +FAIL CSS Transitions: property from [10px] to [50%] at (0) should be [calc(10px + 0%)] assert_equals: expected "calc ( 0 % + 10px ) " but got "10px " +FAIL CSS Transitions: property from [10px] to [50%] at (0.5) should be [calc(5px + 25%)] assert_equals: expected "calc ( 25 % + 5px ) " but got "10px " +FAIL CSS Transitions: property from [10px] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50%] at (0) should be [calc(10px + 0%)] assert_equals: expected "calc ( 0 % + 10px ) " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50%] at (0.5) should be [calc(5px + 25%)] assert_equals: expected "calc ( 25 % + 5px ) " but got "10px " +FAIL CSS Transitions with transition: all: property from [10px] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10px " +FAIL CSS Animations: property from [10px] to [50%] at (0) should be [calc(10px + 0%)] assert_equals: expected "calc ( 0 % + 10px ) " but got "10px " +FAIL CSS Animations: property from [10px] to [50%] at (0.5) should be [calc(5px + 25%)] assert_equals: expected "calc ( 25 % + 5px ) " but got "10px " +FAIL CSS Animations: property from [10px] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10px " +FAIL Web Animations: property from [10px] to [50%] at (0) should be [calc(10px + 0%)] assert_equals: expected "calc ( 0 % + 10px ) " but got "10px " +FAIL Web Animations: property from [10px] to [50%] at (0.5) should be [calc(5px + 25%)] assert_equals: expected "calc ( 25 % + 5px ) " but got "10px " +FAIL Web Animations: property from [10px] to [50%] at (1) should be [50%] assert_equals: expected "50 % " but got "10px " +PASS CSS Transitions: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0) should be [calc(10px + 20%)] +FAIL CSS Transitions: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.25) should be [calc(20px + 30%)] assert_equals: expected "calc ( 30 % + 20px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.5) should be [calc(30px + 40%)] assert_equals: expected "calc ( 40 % + 30px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.75) should be [calc(40px + 50%)] assert_equals: expected "calc ( 50 % + 40px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (1) should be [calc(50px + 60%)] assert_equals: expected "calc ( 60 % + 50px ) " but got "calc ( 20 % + 10px ) " +PASS CSS Transitions with transition: all: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0) should be [calc(10px + 20%)] +FAIL CSS Transitions with transition: all: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.25) should be [calc(20px + 30%)] assert_equals: expected "calc ( 30 % + 20px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions with transition: all: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.5) should be [calc(30px + 40%)] assert_equals: expected "calc ( 40 % + 30px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions with transition: all: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.75) should be [calc(40px + 50%)] assert_equals: expected "calc ( 50 % + 40px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Transitions with transition: all: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (1) should be [calc(50px + 60%)] assert_equals: expected "calc ( 60 % + 50px ) " but got "calc ( 20 % + 10px ) " +PASS CSS Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0) should be [calc(10px + 20%)] +FAIL CSS Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.25) should be [calc(20px + 30%)] assert_equals: expected "calc ( 30 % + 20px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.5) should be [calc(30px + 40%)] assert_equals: expected "calc ( 40 % + 30px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.75) should be [calc(40px + 50%)] assert_equals: expected "calc ( 50 % + 40px ) " but got "calc ( 20 % + 10px ) " +FAIL CSS Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (1) should be [calc(50px + 60%)] assert_equals: expected "calc ( 60 % + 50px ) " but got "calc ( 20 % + 10px ) " +PASS Web Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0) should be [calc(10px + 20%)] +FAIL Web Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.25) should be [calc(20px + 30%)] assert_equals: expected "calc ( 30 % + 20px ) " but got "calc ( 20 % + 10px ) " +FAIL Web Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.5) should be [calc(30px + 40%)] assert_equals: expected "calc ( 40 % + 30px ) " but got "calc ( 20 % + 10px ) " +FAIL Web Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (0.75) should be [calc(40px + 50%)] assert_equals: expected "calc ( 50 % + 40px ) " but got "calc ( 20 % + 10px ) " +FAIL Web Animations: property from [calc(20% + 10px)] to [calc(60% + 50px)] at (1) should be [calc(50px + 60%)] assert_equals: expected "calc ( 60 % + 50px ) " but got "calc ( 20 % + 10px ) " +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (-0.3) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (0) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (0.3) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (-0.3) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (0) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (0.3) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [50px] at (1.5) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (-0.3) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (0) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (0.3) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (0.5) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (0.6) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (1) should be [50px] +PASS CSS Transitions: property from [normal] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (-0.3) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (0) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (0.3) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition: all: property from [normal] to [50px] at (1.5) should be [50px] +PASS CSS Animations: property from [normal] to [50px] at (-0.3) should be [normal] +PASS CSS Animations: property from [normal] to [50px] at (0) should be [normal] +PASS CSS Animations: property from [normal] to [50px] at (0.3) should be [normal] +PASS CSS Animations: property from [normal] to [50px] at (0.5) should be [50px] +PASS CSS Animations: property from [normal] to [50px] at (0.6) should be [50px] +PASS CSS Animations: property from [normal] to [50px] at (1) should be [50px] +PASS CSS Animations: property from [normal] to [50px] at (1.5) should be [50px] +PASS Web Animations: property from [normal] to [50px] at (-0.3) should be [normal] +PASS Web Animations: property from [normal] to [50px] at (0) should be [normal] +PASS Web Animations: property from [normal] to [50px] at (0.3) should be [normal] +PASS Web Animations: property from [normal] to [50px] at (0.5) should be [50px] +PASS Web Animations: property from [normal] to [50px] at (0.6) should be [50px] +PASS Web Animations: property from [normal] to [50px] at (1) should be [50px] +PASS Web Animations: property from [normal] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (-0.3) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (0) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (0.3) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [infinite] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (-0.3) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (0) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (0.3) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [infinite] to [50px] at (1.5) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (-0.3) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (0) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (0.3) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (0.5) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (0.6) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (1) should be [50px] +PASS CSS Transitions: property from [infinite] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (-0.3) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (0) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (0.3) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (0.5) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (0.6) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (1) should be [50px] +PASS CSS Transitions with transition: all: property from [infinite] to [50px] at (1.5) should be [50px] +PASS CSS Animations: property from [infinite] to [50px] at (-0.3) should be [infinite] +PASS CSS Animations: property from [infinite] to [50px] at (0) should be [infinite] +PASS CSS Animations: property from [infinite] to [50px] at (0.3) should be [infinite] +PASS CSS Animations: property from [infinite] to [50px] at (0.5) should be [50px] +PASS CSS Animations: property from [infinite] to [50px] at (0.6) should be [50px] +PASS CSS Animations: property from [infinite] to [50px] at (1) should be [50px] +PASS CSS Animations: property from [infinite] to [50px] at (1.5) should be [50px] +PASS Web Animations: property from [infinite] to [50px] at (-0.3) should be [infinite] +PASS Web Animations: property from [infinite] to [50px] at (0) should be [infinite] +PASS Web Animations: property from [infinite] to [50px] at (0.3) should be [infinite] +PASS Web Animations: property from [infinite] to [50px] at (0.5) should be [50px] +PASS Web Animations: property from [infinite] to [50px] at (0.6) should be [50px] +PASS Web Animations: property from [infinite] to [50px] at (1) should be [50px] +PASS Web Animations: property from [infinite] to [50px] at (1.5) should be [50px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (-0.3) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (0) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (0.3) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (1) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (-0.3) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (0) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (0.3) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (1) should be [infinite] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (-0.3) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (0) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (0.3) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (1) should be [infinite] +PASS CSS Transitions: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (-0.3) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (0) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (0.3) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (1) should be [infinite] +PASS CSS Transitions with transition: all: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS CSS Animations: property from [normal] to [infinite] at (-0.3) should be [normal] +PASS CSS Animations: property from [normal] to [infinite] at (0) should be [normal] +PASS CSS Animations: property from [normal] to [infinite] at (0.3) should be [normal] +PASS CSS Animations: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS CSS Animations: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS CSS Animations: property from [normal] to [infinite] at (1) should be [infinite] +PASS CSS Animations: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS Web Animations: property from [normal] to [infinite] at (-0.3) should be [normal] +PASS Web Animations: property from [normal] to [infinite] at (0) should be [normal] +PASS Web Animations: property from [normal] to [infinite] at (0.3) should be [normal] +PASS Web Animations: property from [normal] to [infinite] at (0.5) should be [infinite] +PASS Web Animations: property from [normal] to [infinite] at (0.6) should be [infinite] +PASS Web Animations: property from [normal] to [infinite] at (1) should be [infinite] +PASS Web Animations: property from [normal] to [infinite] at (1.5) should be [infinite] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (-0.3) should be [10px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (0) should be [10px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (0.3) should be [10px] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (0.5) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (0.6) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (1) should be [normal] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [10px] to [normal] at (1.5) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (-0.3) should be [10px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (0) should be [10px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (0.3) should be [10px] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (0.5) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (0.6) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (1) should be [normal] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [10px] to [normal] at (1.5) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (-0.3) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (0) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (0.3) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (0.5) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (0.6) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (1) should be [normal] +PASS CSS Transitions: property from [10px] to [normal] at (1.5) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (-0.3) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (0) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (0.3) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (0.5) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (0.6) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (1) should be [normal] +PASS CSS Transitions with transition: all: property from [10px] to [normal] at (1.5) should be [normal] +PASS CSS Animations: property from [10px] to [normal] at (-0.3) should be [10px] +PASS CSS Animations: property from [10px] to [normal] at (0) should be [10px] +PASS CSS Animations: property from [10px] to [normal] at (0.3) should be [10px] +PASS CSS Animations: property from [10px] to [normal] at (0.5) should be [normal] +PASS CSS Animations: property from [10px] to [normal] at (0.6) should be [normal] +PASS CSS Animations: property from [10px] to [normal] at (1) should be [normal] +PASS CSS Animations: property from [10px] to [normal] at (1.5) should be [normal] +PASS Web Animations: property from [10px] to [normal] at (-0.3) should be [10px] +PASS Web Animations: property from [10px] to [normal] at (0) should be [10px] +PASS Web Animations: property from [10px] to [normal] at (0.3) should be [10px] +PASS Web Animations: property from [10px] to [normal] at (0.5) should be [normal] +PASS Web Animations: property from [10px] to [normal] at (0.6) should be [normal] +PASS Web Animations: property from [10px] to [normal] at (1) should be [normal] +PASS Web Animations: property from [10px] to [normal] at (1.5) should be [normal] + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation.html new file mode 100644 index 000000000000..5a0108ceb633 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation.html @@ -0,0 +1,93 @@ + + + + + CSS Grid Lanes Test: flow-tolerance interpolation + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/w3c-import.log index d4b5eb8d5cc5..e886a21d5d73 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/flow-tolerance-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/grid-template-columns-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/grid-template-columns-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/animation/grid-template-columns-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes-expected.txt index 0d3d863171fb..a184cd86c10e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes-expected.txt @@ -1,4 +1,104 @@ -Harness Error (FAIL), message = ReferenceError: Can't find variable: TestingUtils - +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 2fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, .5fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 2fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(75px, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr 0fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr 1fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr 0fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr 1fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr 3fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr 0fr 1fr; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 0fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr minmax(0, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr minmax(25px, 1fr); +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr min-content; +PASS auto min item 'grid-lanes' with: grid-template-columns: 0fr auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: 0.5fr auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr max-content; +PASS auto min item 'grid-lanes' with: grid-template-columns: 1fr min-content; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) min-content; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr) auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(25px, 0fr) auto; +PASS auto min item 'grid-lanes' with: grid-template-columns: minmax(25px, 1fr) auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 2fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, .5fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 2fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(75px, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr 0fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr 1fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr 0fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr 1fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr 3fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr 0fr 1fr; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 0fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr minmax(0, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr minmax(25px, 1fr); +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr min-content; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0fr auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 0.5fr auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr max-content; +PASS min-content min item 'grid-lanes' with: grid-template-columns: 1fr min-content; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) min-content; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr) auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(25px, 0fr) auto; +PASS min-content min item 'grid-lanes' with: grid-template-columns: minmax(25px, 1fr) auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 2fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, .5fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 2fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(75px, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr 0fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr 1fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr 0fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr 1fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr 3fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr 0fr 1fr; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 0fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr minmax(0, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr minmax(25px, 1fr); +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr min-content; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0fr auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 0.5fr auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr max-content; +PASS 50px min item 'grid-lanes' with: grid-template-columns: 1fr min-content; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) min-content; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 0fr) auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(0, 1fr) auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(25px, 0fr) auto; +PASS 50px min item 'grid-lanes' with: grid-template-columns: minmax(25px, 1fr) auto; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes.html index 840f303ca7ea..6e5fc47b66ec 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-lanes/items/column-flex-track-intrinsic-sizes.html @@ -32,7 +32,7 @@ - + - + - + - + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/w3c-import.log index 6c842bc1b48b..0d6301145351 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/w3c-import.log @@ -14,7 +14,9 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/image-no-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/image-slice-interpolation-math-functions-tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/object-position-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/object-position-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/animation/object-view-box-interpolation.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation-expected.html new file mode 100644 index 000000000000..82fcaa3b2aa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation-expected.html @@ -0,0 +1,4 @@ + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation.html new file mode 100644 index 000000000000..a074780beb60 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-color-mix-currentcolor-invalidation.html @@ -0,0 +1,30 @@ + + +CSS Images Test: Invalidate currentcolor in gradient with color-mix() color stop + + + + + +

Test passes if there is a filled green square.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation-expected.html new file mode 100644 index 000000000000..7d9cb8910789 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation-expected.html @@ -0,0 +1,18 @@ + + + + Reference rendering - pass if square below, black 96px + + + + +

Test passes if there is a square below.

+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation.html new file mode 100644 index 000000000000..a091bb413c4c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-contrast-color-currentcolor-invalidation.html @@ -0,0 +1,31 @@ + + +CSS Images Test: Invalidate currentcolor in gradient with contrast-color() color stop + + + + + + +

Test passes if there is a square below.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation-expected.html new file mode 100644 index 000000000000..82fcaa3b2aa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation-expected.html @@ -0,0 +1,4 @@ + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation.html new file mode 100644 index 000000000000..0f114d407714 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-currentcolor-invalidation.html @@ -0,0 +1,29 @@ + + +CSS Images Test: Invalidate currentcolor in gradient color stop + + + + +

Test passes if there is a filled green square.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation-expected.html new file mode 100644 index 000000000000..82fcaa3b2aa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation-expected.html @@ -0,0 +1,4 @@ + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation.html new file mode 100644 index 000000000000..7e8bbc4cb7a8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-light-dark-currentcolor-invalidation.html @@ -0,0 +1,31 @@ + + +CSS Images Test: Invalidate currentcolor in gradient with light-dark() color stop + + + + + +

Test passes if there is a filled green square.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation-expected.html new file mode 100644 index 000000000000..82fcaa3b2aa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation-expected.html @@ -0,0 +1,4 @@ + + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation.html new file mode 100644 index 000000000000..ee9e1ab41b30 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/color-stop-relative-color-currentcolor-invalidation.html @@ -0,0 +1,30 @@ + + +CSS Images Test: Invalidate currentcolor in gradient with relative color stop + + + + + +

Test passes if there is a filled green square.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-angle-negative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-angle-negative.html index ff8e20aafedd..7f29f376d349 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-angle-negative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-angle-negative.html @@ -1,8 +1,10 @@ Conic gradient with negative angle parameter + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage-ref.html new file mode 100644 index 000000000000..4e84e0ce5fa9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage-ref.html @@ -0,0 +1,22 @@ + + +CSS Images Reference: conic-gradient color stops with resolved angles + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage.html new file mode 100644 index 000000000000..7c9163d112bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-calc-angle-percentage.html @@ -0,0 +1,28 @@ + + +CSS Images Test: conic-gradient color stops with calc() mixing angle and percentage + + + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-center.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-center.html index ecbc3ffa5c7c..8f7354840f58 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-center.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-center.html @@ -1,8 +1,10 @@ Conic gradient with custom center parameter + + + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001.html new file mode 100644 index 000000000000..c5dbda4f1bc0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-001.html @@ -0,0 +1,25 @@ + +conic-gradient() with line-height relative unit <position> (horizontal) + + + + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002.html new file mode 100644 index 000000000000..67212f5f6c4a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-002.html @@ -0,0 +1,25 @@ + +conic-gradient() with line-height relative unit <position> (horizontal) + + + + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003.html new file mode 100644 index 000000000000..6e98d1d3ca7a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-003.html @@ -0,0 +1,36 @@ + +conic-gradient() with line-height relative unit <position> (horizontal) + + + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004.html new file mode 100644 index 000000000000..782c2a00d934 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/conic-gradient-line-height-relative-units-004.html @@ -0,0 +1,36 @@ + +conic-gradient() with line-height relative unit <position> (vertical) + + + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value-expected.txt index 5e58595d39b2..e5e251f0b6a3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value-expected.txt @@ -5,4 +5,5 @@ FAIL Property background-image value 'cross-fade(20% red, 20% green)' assert_tru FAIL Property background-image value 'cross-fade(50% red, 50% green, 50% blue)' assert_true: 'cross-fade(50% red, 50% green, 50% blue)' is a supported value for background-image. expected true got false FAIL Property background-image value 'cross-fade(calc(101%) red, green)' assert_true: 'cross-fade(calc(101%) red, green)' is a supported value for background-image. expected true got false FAIL Property background-image value 'cross-fade(calc(-200%) red, green)' assert_true: 'cross-fade(calc(-200%) red, green)' is a supported value for background-image. expected true got false +FAIL Property background-image value 'cross-fade(calc(50% + 1% * sign(1em - 10000px)) red, green)' assert_true: 'cross-fade(calc(50% + 1% * sign(1em - 10000px)) red, green)' is a supported value for background-image. expected true got false diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value.html index dbecb4a6545b..007696a5c22c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-computed-value.html @@ -47,6 +47,12 @@ test_computed_value('background-image', 'cross-fade(calc(-200%) red, green)', 'cross-fade(rgb(255, 0, 0) 0%, rgb(0, 128, 0))'); + + // The percentage here is not resolvable parse-time, but should always be 49% + // for all reasonable font sizes. + test_computed_value('background-image', + 'cross-fade(calc(50% + 1% * sign(1em - 10000px)) red, green)', + 'cross-fade(rgb(255, 0, 0) 49%, rgb(0, 128, 0))'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation-ref.html new file mode 100644 index 000000000000..83f253d195b0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation-ref.html @@ -0,0 +1,15 @@ + + +cross-fade() respects orientation for cross-origin images even with image-orientation: none (ref) + +

The image below should be rotated (50x100) because it is cross-origin, despite image-orientation: none.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub-expected.html new file mode 100644 index 000000000000..83f253d195b0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub-expected.html @@ -0,0 +1,15 @@ + + +cross-fade() respects orientation for cross-origin images even with image-orientation: none (ref) + +

The image below should be rotated (50x100) because it is cross-origin, despite image-orientation: none.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub.html new file mode 100644 index 000000000000..23ca3c641aa2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-cross-origin-orientation.sub.html @@ -0,0 +1,17 @@ + + +cross-fade() respects orientation for cross-origin images even with image-orientation: none + + + +

The image below should be rotated (50x100) because it is cross-origin, despite image-orientation: none.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-legacy-2-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-legacy-2-crash.html new file mode 100644 index 000000000000..37321f88c167 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/cross-fade-legacy-2-crash.html @@ -0,0 +1,14 @@ + + + + CSS Images Test: Legacy cross-fade syntax unresolvable at parse time crashes Chrome + + + + +
+

Test passes if the browser does not crash.

+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient-border-box.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient-border-box.html index 2938c5ea99e1..d12968a40b7e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient-border-box.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient-border-box.html @@ -5,6 +5,7 @@ Gradient Background aligned to Content Box + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient-ref.html new file mode 100644 index 000000000000..50e109606dc7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient-ref.html @@ -0,0 +1,18 @@ + + + + display-p3-linear gradient interpolation + + + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient.html new file mode 100644 index 000000000000..0fd3cf828ec0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/display-p3-linear-gradient.html @@ -0,0 +1,20 @@ + + + + display-p3-linear gradient interpolation + + + + + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-001.html index befda53a301e..5b1fa38d03f1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-001.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/gradient-analogous-missing-components-001.html @@ -5,7 +5,7 @@ - + +

Four 120×120 squares on red: centered 40×40 green (no-repeat), full-width 40px green band at vertical center (repeat-x), full-height 40px green band at horizontal center (repeat-y), 60×60 green at bottom-right (no-repeat).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined-ref.html new file mode 100644 index 000000000000..86b6c2309157 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined-ref.html @@ -0,0 +1,36 @@ + + +CSS reftest reference: image(<color>) with background-size, background-position, and background-repeat + +

Four 120×120 squares on red: centered 40×40 green (no-repeat), full-width 40px green band at vertical center (repeat-x), full-height 40px green band at horizontal center (repeat-y), 60×60 green at bottom-right (no-repeat).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined.html new file mode 100644 index 000000000000..9e75011ef5f8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-combined.html @@ -0,0 +1,49 @@ + + +CSS Images Module Level 4: image(<color>) with background-size, background-position, and background-repeat + + + + +

Four 120×120 squares on red: centered 40×40 green (no-repeat), full-width 40px green band at vertical center (repeat-x), full-height 40px green band at horizontal center (repeat-y), 60×60 green at bottom-right (no-repeat).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-expected.html new file mode 100644 index 000000000000..72aa368e6055 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-expected.html @@ -0,0 +1,38 @@ + + +CSS reftest reference: image(<color>) with background-position + +

Four 100×100 squares with a 50×50 green tile on red at: top-left, center, bottom-right, 25px offset.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-ref.html new file mode 100644 index 000000000000..72aa368e6055 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position-ref.html @@ -0,0 +1,38 @@ + + +CSS reftest reference: image(<color>) with background-position + +

Four 100×100 squares with a 50×50 green tile on red at: top-left, center, bottom-right, 25px offset.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position.html new file mode 100644 index 000000000000..392b8b101d81 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-position.html @@ -0,0 +1,28 @@ + + +CSS Images Module Level 4: image(<color>) with background-position + + + + +

Four 100×100 squares with a 50×50 green tile on red at: top-left, center, bottom-right, 25px offset.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-expected.html new file mode 100644 index 000000000000..47ed5d2c8820 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-expected.html @@ -0,0 +1,37 @@ + + +CSS reftest reference: image(<color>) with background-repeat + +

Four 200×200 squares: fully green (repeat), top-left quadrant green (no-repeat), +top half green (repeat-x), left half green (repeat-y).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-ref.html new file mode 100644 index 000000000000..47ed5d2c8820 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat-ref.html @@ -0,0 +1,37 @@ + + +CSS reftest reference: image(<color>) with background-repeat + +

Four 200×200 squares: fully green (repeat), top-left quadrant green (no-repeat), +top half green (repeat-x), left half green (repeat-y).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat.html new file mode 100644 index 000000000000..b60f7023c842 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-repeat.html @@ -0,0 +1,36 @@ + + +CSS Images Module Level 4: image(<color>) with background-repeat + + + + +

Four 200×200 squares: fully green (repeat), top-left quadrant green (no-repeat), +top half green (repeat-x), left half green (repeat-y).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-expected.html new file mode 100644 index 000000000000..c675152b77a5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-expected.html @@ -0,0 +1,34 @@ + + +CSS reftest reference: image(<color>) with background-size + +

Six squares: first three fully green, then left-half green, top-half green, top-left quarter green.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-ref.html new file mode 100644 index 000000000000..c675152b77a5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size-ref.html @@ -0,0 +1,34 @@ + + +CSS reftest reference: image(<color>) with background-size + +

Six squares: first three fully green, then left-half green, top-half green, top-left quarter green.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size.html new file mode 100644 index 000000000000..8e71637457b6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-background-size.html @@ -0,0 +1,58 @@ + + +CSS Images Module Level 4: image(<color>) with background-size + + + + +

Six squares: first three fully green, then left-half green, top-half green, top-left quarter green.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-expected.html new file mode 100644 index 000000000000..b118d40965c6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-expected.html @@ -0,0 +1,17 @@ + + +CSS reftest reference: image(<color>) renders as a solid color + +

Test passes if there are four green squares below.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-ref.html new file mode 100644 index 000000000000..b118d40965c6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic-ref.html @@ -0,0 +1,17 @@ + + +CSS reftest reference: image(<color>) renders as a solid color + +

Test passes if there are four green squares below.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic.html new file mode 100644 index 000000000000..de0afba8538c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-basic.html @@ -0,0 +1,24 @@ + + +CSS Images Module Level 4: image(<color>) renders as a solid color + + + + +

Test passes if there are four green squares below.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-expected.html new file mode 100644 index 000000000000..0b18d6b91d40 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-expected.html @@ -0,0 +1,14 @@ + + +CSS reftest reference: image(<color>) inside cross-fade() + +

Test passes if there are two solid green squares.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-ref.html new file mode 100644 index 000000000000..0b18d6b91d40 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade-ref.html @@ -0,0 +1,14 @@ + + +CSS reftest reference: image(<color>) inside cross-fade() + +

Test passes if there are two solid green squares.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade.html new file mode 100644 index 000000000000..aa4db6832871 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-cross-fade.html @@ -0,0 +1,22 @@ + + +CSS Images Module Level 4: image(<color>) inside cross-fade() + + + + + +

Test passes if there are two solid green squares.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-expected.html new file mode 100644 index 000000000000..4aebc12bb55e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-expected.html @@ -0,0 +1,15 @@ + + +CSS reftest reference: image(<color>) as a background-image layer + +

Test passes if there are two green squares below.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-ref.html new file mode 100644 index 000000000000..4aebc12bb55e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered-ref.html @@ -0,0 +1,15 @@ + + +CSS reftest reference: image(<color>) as a background-image layer + +

Test passes if there are two green squares below.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered.html new file mode 100644 index 000000000000..a3e1615474a8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-color-layered.html @@ -0,0 +1,27 @@ + + +CSS Images Module Level 4: image(<color>) as a background-image layer + + + + +

Test passes if there are two green squares below.

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-expected.html new file mode 100644 index 000000000000..5757999b7989 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-expected.html @@ -0,0 +1,17 @@ + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-ref.html new file mode 100644 index 000000000000..5757999b7989 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark-ref.html @@ -0,0 +1,17 @@ + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark.html new file mode 100644 index 000000000000..586a8c670205 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-light-dark.html @@ -0,0 +1,18 @@ + + + + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.gif b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.gif new file mode 100644 index 000000000000..70dc36e3f63b Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.gif differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.html new file mode 100644 index 000000000000..2980f17ae3f4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-multipart-crash.html @@ -0,0 +1,3 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/WEB_FEATURES.yml new file mode 100644 index 000000000000..db5802c6ef48 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: image-orientation + files: + - "*" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-properties.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-properties.html index 81876c6ecc1d..431fba1330eb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-properties.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-properties.html @@ -6,7 +6,7 @@ - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub-expected.html new file mode 100644 index 000000000000..205feb0b591e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub-expected.html @@ -0,0 +1,11 @@ + +CSS Images Module Level 3: image-orientation: none / border-image (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub.html new file mode 100644 index 000000000000..2e7c8dc39416 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub.html @@ -0,0 +1,15 @@ + +CSS Images Module Level 3: image-orientation: none / cross-origin / border-image + + + + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-svg.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-svg.html index 1e3ca87dc6f1..4fc9474edf25 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-svg.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-svg.html @@ -113,7 +113,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -141,7 +141,7 @@ - + @@ -155,7 +155,7 @@ - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-border-image-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-border-image-ref.html new file mode 100644 index 000000000000..b65831783a3d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-border-image-ref.html @@ -0,0 +1,11 @@ + +CSS Images Module Level 3: image-orientation: none / border-image (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/w3c-import.log index 0b10f909c197..0f65e7d3ac45 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/w3c-import.log @@ -29,6 +29,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-border-image-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-canvas-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-svg-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/w3c-import.log index ce332edf2570..311c0ee17262 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-background-position-expected.html @@ -61,6 +62,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-border-image.sub.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-canvas-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-canvas.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-expected-mismatch.html new file mode 100644 index 000000000000..c04006c929da --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-expected-mismatch.html @@ -0,0 +1,3 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-notref.html new file mode 100644 index 000000000000..c04006c929da --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled-notref.html @@ -0,0 +1,3 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled.html new file mode 100644 index 000000000000..36c476ee0d7d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-rendering-mixed-scaled.html @@ -0,0 +1,6 @@ + +image-rendering should apply to scaled images + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing-expected.txt index 8d87ec5ac9fb..12da34335285 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing-expected.txt @@ -61,6 +61,12 @@ PASS e.style['content'] = "image-set(url(\"example.png\") 1dpi)" should set the PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1dpi)" should set the property value PASS e.style['content'] = "image-set(url(\"example.png\") calc(1 * 96dpi))" should set the property value PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") calc(1 * 96dpi))" should set the property value +PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(1dppx * sibling-index()))" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dppx * sibling-index()))" should set the property value +PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(1dppx * sign(1em - 10px)))" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dppx * sign(1em - 10px)))" should set the property value +PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(1dppx * sign(10px)))" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dppx * sign(10px)))" should set the property value PASS e.style['background-image'] = "image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(3 * 4))" should not set the property value @@ -119,6 +125,8 @@ PASS e.style['background-image'] = "image-set(url(example.png) type('image/png') PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type('image/png') 1x)" should set the property value PASS e.style['background-image'] = "image-set(url(example.png) 1x type('image/jpeg'))" should set the property value PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x type('image/jpeg'))" should set the property value +PASS e.style['background-image'] = "image-set(url(\"x\") 1x type(\"a\\\"\"))" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(url(\"x\") 1x type(\"a\\\"\"))" should set the property value PASS e.style['background-image'] = "image-set(url(example.png) type(image/png))" should not set the property value PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type(image/png))" should not set the property value PASS e.style['background-image'] = "image-set(url(example.png) type('image/png') type('image/png'))" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing.html index 83c0d73ab954..b082da6a8f3e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/image-set/image-set-parsing.html @@ -119,6 +119,19 @@ 'image-set(url("example.png") calc(1 * 96dpi))', 'image-set(url("example.png") calc(1dppx))' ); + test_valid_value_variants( + 'background-image', + 'image-set(url("example.png") calc(1dppx * sibling-index()))', + ); + test_valid_value_variants( + 'background-image', + 'image-set(url("example.png") calc(1dppx * sign(1em - 10px)))', + ); + test_valid_value_variants( + 'background-image', + 'image-set(url("example.png") calc(1dppx * sign(10px)))', + 'image-set(url("example.png") calc(1dppx))', + ); test_invalid_value_variants( 'background-image', @@ -252,6 +265,10 @@ "image-set(url(example.png) 1x type('image/jpeg'))", 'image-set(url("example.png") 1x type("image/jpeg"))' ); + test_valid_value_variants( + 'background-image', + 'image-set(url("x") 1x type("a\\""))', + ); test_invalid_value_variants( 'background-image', diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/infinite-radial-gradient-refcrash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/infinite-radial-gradient-refcrash.html index a3a1e7fb069d..a150b619116b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/infinite-radial-gradient-refcrash.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/infinite-radial-gradient-refcrash.html @@ -2,6 +2,7 @@ CSS Images Test: repeating-radial-gradient with huge size crashes Chrome + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index-ref.html new file mode 100644 index 000000000000..7325685511a5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index-ref.html @@ -0,0 +1,11 @@ + +CSS Test Reference + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index.html new file mode 100644 index 000000000000..299b86d464ad --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-body-sibling-index.html @@ -0,0 +1,15 @@ + +CSS Images Test: Linear gradient with sibling-index() + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-expected.html new file mode 100644 index 000000000000..be13be8e260e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-ref.html new file mode 100644 index 000000000000..be13be8e260e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units.html new file mode 100644 index 000000000000..e764e62890da --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-calc-em-units.html @@ -0,0 +1,19 @@ + +CSS Images Test: Linear gradient with em in calc() + + + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square-expected.html new file mode 100644 index 000000000000..1ad3c75747e0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square-expected.html @@ -0,0 +1,28 @@ + + +Linear gradients for non-square elements reference + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square.html new file mode 100644 index 000000000000..2b4f48990f24 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-non-square.html @@ -0,0 +1,30 @@ + + +Linear gradients for non-square elements + + + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-expected.html new file mode 100644 index 000000000000..eea8518d95b9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-ref.html new file mode 100644 index 000000000000..eea8518d95b9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index.html new file mode 100644 index 000000000000..b92897e06974 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/linear-gradient-sibling-index.html @@ -0,0 +1,19 @@ + +CSS Images Test: Linear gradient with sibling-index() + + + + +
+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic-2.html index f3171bf3fb98..566f3f5b8a96 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic-2.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic-2.html @@ -1,6 +1,7 @@ Conic gradient with two position color stops + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html index 8a7331d08ff5..50ec959e221f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html @@ -2,6 +2,7 @@ Conic gradient with a two position color stop +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001-ref.html index b9f158093e76..c0de70405a62 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001-ref.html @@ -18,6 +18,7 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ image-rendering: crisp-edges; } .bigWide { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c-expected.html index b9f158093e76..c0de70405a62 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c-expected.html @@ -18,6 +18,7 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ image-rendering: crisp-edges; } .bigWide { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c.html index 0f8195157e31..4a3f2d7bdb5c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-contain-png-001c.html @@ -12,12 +12,12 @@ - - - - - - - - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001-ref.html deleted file mode 100644 index 2e91bd089387..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001-ref.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - CSS Reference: dimensionless SVG should fill content box - - - - - - - - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001.html deleted file mode 100644 index 2954ff640d5b..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-dimensionless-svg-001.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - CSS Test: object-fit on img with dimensionless SVG (no width/height/viewBox) - - - - - - - - - - - - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001-ref.html index 19a03a19e47d..d554c145a8d1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001-ref.html @@ -18,6 +18,7 @@ background-image: url("support/colors-16x8.png"); background-size: 100% 100%; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ image-rendering: crisp-edges; } .bigWide { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c-expected.html index 19a03a19e47d..d554c145a8d1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c-expected.html @@ -18,6 +18,7 @@ background-image: url("support/colors-16x8.png"); background-size: 100% 100%; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ image-rendering: crisp-edges; } .bigWide { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c.html index 0e2a3883fe2f..200e5f471161 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-fill-png-001c.html @@ -12,12 +12,12 @@ - + + +

Test passes if there is a filled green square and no red.

+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-stale-image-while-revalidating.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-stale-image-while-revalidating.html new file mode 100644 index 000000000000..3123ee83cdfd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-fit-stale-image-while-revalidating.html @@ -0,0 +1,36 @@ + + + +CSS Images: object-fit applies to stale image while revalidating + + + + + + + +

Test passes if there is a filled green square and no red.

+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001-ref.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001-ref.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c-expected.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c.html index 20ff1cb935c0..4ecf6b1dfd85 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001c.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e-expected.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e.html index cdf35a1fc7a4..55aab9450e76 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001e.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i-expected.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i.html index d3e2622b4066..9bc1d59ac4a4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001i.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o-expected.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o.html index cdf0e0b5302a..3a7ce9ccd405 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001o.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p-expected.html index 1027cfc35ca6..93f6c877f94d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-16x8.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p.html index 8b80b9c5bf3e..74824ae4ec9f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-001p.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002-ref.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002-ref.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c-expected.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c.html index 5ad030ffb601..b5cbf2ed15a8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002c.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e-expected.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e.html index 749948ae4c4b..e80bdcc6c0e1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002e.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i-expected.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i.html index 88b4a150013c..cbb184eacabf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002i.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o-expected.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o.html index 0d507900f829..b8a40602486b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002o.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p-expected.html index bd14f9cfc575..3b5ceb7c33c8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p-expected.html @@ -15,6 +15,8 @@ background-image: url("support/colors-8x16.png"); background-size: contain; background-repeat: no-repeat; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p.html index 00ace782bc37..dfbb067878b8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/object-position-png-002p.html @@ -17,6 +17,8 @@ background: lightgray; margin-right: 2px; object-fit: contain; + image-rendering: pixelated; /* for UAs that don't support crisp-edges */ + image-rendering: crisp-edges; float: left; width: 20px; height: 20px; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/out-of-range-color-stop-conic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/out-of-range-color-stop-conic.html index be0c73a3bac6..07c8f8972477 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/out-of-range-color-stop-conic.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/out-of-range-color-stop-conic.html @@ -1,8 +1,10 @@ Conic gradient with out-of-range stops + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed-expected.txt new file mode 100644 index 000000000000..d33ef4232882 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed-expected.txt @@ -0,0 +1,5 @@ + +PASS Property background-image value 'image(red)' +PASS Property background-image value 'image(rgba(0, 128, 255, 0.5))' +PASS Property background-image value 'image(transparent)' + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed.html new file mode 100644 index 000000000000..8a783ef256cd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed.html @@ -0,0 +1,17 @@ + + +CSS Images Module Level 4: computed value of image(<color>) + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid-expected.txt new file mode 100644 index 000000000000..bdaacf3903f1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid-expected.txt @@ -0,0 +1,8 @@ + +PASS e.style['background-image'] = "image()" should not set the property value +PASS e.style['background-image'] = "image(none)" should not set the property value +PASS e.style['background-image'] = "image(red, blue)" should not set the property value +PASS e.style['background-image'] = "image(notacolor)" should not set the property value +PASS e.style['background-image'] = "image(url(foo.png))" should not set the property value +PASS e.style['background-color'] = "image(red)" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid.html new file mode 100644 index 000000000000..67d2cf56ac69 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid.html @@ -0,0 +1,20 @@ + + +CSS Images Module Level 4: invalid image() values + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid-expected.txt new file mode 100644 index 000000000000..b67e2c071cea --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid-expected.txt @@ -0,0 +1,15 @@ + +PASS e.style['background-image'] = "image(red)" should set the property value +PASS e.style['background-image'] = "image(transparent)" should set the property value +PASS e.style['background-image'] = "image(rgb(0 128 255))" should set the property value +PASS e.style['background-image'] = "image(currentcolor)" should set the property value +PASS e.style['background-image'] = "image(light-dark(black, white))" should set the property value +PASS e.style['background-image'] = "image(color-mix(in srgb, red, blue))" should set the property value +PASS e.style['background-image'] = "image(rgb(from red r g b))" should set the property value +PASS e.style['background-image'] = "image(rgba(0, 0, 255, 0.5)), linear-gradient(red, blue)" should set the property value +FAIL e.style['background-image'] = "cross-fade(image(green), red)" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['border-image-source'] = "image(red)" should set the property value +PASS e.style['mask-image'] = "image(red)" should set the property value +PASS e.style['shape-outside'] = "image(red)" should set the property value +PASS e.style['list-style-image'] = "image(red)" should set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid.html new file mode 100644 index 000000000000..d31aced3b66f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid.html @@ -0,0 +1,35 @@ + + +CSS Images Module Level 4: parsing image(<color>) + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/w3c-import.log index f60b6902746b..1389a476e833 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/w3c-import.log @@ -14,11 +14,18 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/WEB_FEATURES.yml +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/conic-gradient-calc-angle-percentage-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/conic-gradient-calc-angle-percentage-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-interpolation-method-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-interpolation-method-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-interpolation-method-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-position-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-position-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/gradient-position-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-function-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-orientation-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-orientation-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-orientation-valid.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001-expected.html new file mode 100644 index 000000000000..503058910ddc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with container relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001.html new file mode 100644 index 000000000000..9663bf5133f3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-001.html @@ -0,0 +1,16 @@ + +radial-gradient() with container relative unit <position> (horizontal) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002-expected.html new file mode 100644 index 000000000000..503058910ddc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with container relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002.html new file mode 100644 index 000000000000..73083b095d6f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-002.html @@ -0,0 +1,16 @@ + +radial-gradient() with container relative unit <position> (vertical) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003-expected.html new file mode 100644 index 000000000000..503058910ddc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with container relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003.html new file mode 100644 index 000000000000..f41e23c01fa1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-003.html @@ -0,0 +1,16 @@ + +radial-gradient() with container relative unit <radial-size> (horizontal) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004-expected.html new file mode 100644 index 000000000000..503058910ddc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with container relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004.html new file mode 100644 index 000000000000..c99059561a34 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-004.html @@ -0,0 +1,16 @@ + +radial-gradient() with container relative unit <radial-size> (vertical) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-ref.html new file mode 100644 index 000000000000..503058910ddc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-container-relative-units-ref.html @@ -0,0 +1,10 @@ + +radial-gradient() with container relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001.html new file mode 100644 index 000000000000..26826110aa7f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-001.html @@ -0,0 +1,25 @@ + +radial-gradient() with line-height relative unit <position> (horizontal) + + + + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002.html new file mode 100644 index 000000000000..c90d6d874a38 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-002.html @@ -0,0 +1,25 @@ + +radial-gradient() with line-height relative unit <position> (vertical) + + + + +
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003.html new file mode 100644 index 000000000000..6e6446d33cde --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-003.html @@ -0,0 +1,34 @@ + +radial-gradient() with line-height relative unit <position> (horizontal) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004-expected.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004-expected.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004.html new file mode 100644 index 000000000000..0704337d5bb1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-004.html @@ -0,0 +1,34 @@ + +radial-gradient() with line-height relative unit <position> (vertical) + + + + +
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-ref.html new file mode 100644 index 000000000000..5785e8039106 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/radial-gradient-line-height-relative-units-ref.html @@ -0,0 +1,10 @@ + +radial-gradient() with line-height relative unit (reference) + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/linear-gradient-non-square-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/linear-gradient-non-square-ref.html new file mode 100644 index 000000000000..1ad3c75747e0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/linear-gradient-non-square-ref.html @@ -0,0 +1,28 @@ + + +Linear gradients for non-square elements reference + +
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/w3c-import.log index 3c7d1744d4e8..919df61b4f2d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/w3c-import.log @@ -17,3 +17,4 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/100x100-blue-green.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/100x100-blue.html /LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/200x200-blue-black-green-red.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/reference/linear-gradient-non-square-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/repeating-conic-gradient.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/repeating-conic-gradient.html index 9a9587f29f6b..73645c3566f0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/repeating-conic-gradient.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/repeating-conic-gradient.html @@ -1,6 +1,7 @@ Repeating conic gradient + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/checkerboard.png b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/checkerboard.png new file mode 100644 index 000000000000..61b994e22907 Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/checkerboard.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/external-images.svg b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/external-images.svg new file mode 100644 index 000000000000..ed06ecbd8772 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/external-images.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.png b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.png new file mode 100644 index 000000000000..531e767968af Binary files /dev/null and b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.png differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.py new file mode 100644 index 000000000000..26f9d4d0aa53 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.py @@ -0,0 +1,23 @@ +import os.path +import time + +from wptserve.utils import isomorphic_decode + + +ETAG = b'"object-fit-stale-image"' +IMAGE_PATH = os.path.join( + os.path.dirname(isomorphic_decode(__file__)), u"object-fit-stale-image.png") + + +def main(request, response): + response.headers.set(b"Cache-Control", b"max-age=0") + response.headers.set(b"ETag", ETAG) + response.headers.set(b"Content-Type", b"image/png") + + if request.headers.get(b"If-None-Match") == ETAG: + time.sleep(2) + response.status = (304, b"Not Modified") + return b"" + + with open(IMAGE_PATH, "rb") as image: + return image.read() diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/scripted.svg b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/scripted.svg new file mode 100644 index 000000000000..6936caad3225 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/scripted.svg @@ -0,0 +1,16 @@ + + + + + +
+ + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-green.png b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-green.png deleted file mode 100644 index 1caf25c992aa..000000000000 Binary files a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-green.png and /dev/null differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/w3c-import.log deleted file mode 100644 index 26298c9d765c..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/w3c-import.log +++ /dev/null @@ -1,18 +0,0 @@ -The tests in this directory were imported from the W3C repository. -Do NOT modify these tests directly in WebKit. -Instead, create a pull request on the WPT github: - https://github.com/web-platform-tests/wpt - -Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport - -Do NOT modify or remove this file. - ------------------------------------------------------------------------- -Properties requiring vendor prefixes: -None -Property values requiring vendor prefixes: -None ------------------------------------------------------------------------- -List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-green.png -/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/support/swatch-red.png diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/w3c-import.log index 38ef68b7fe4a..e097205c4d17 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/w3c-import.log @@ -30,6 +30,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/blue-green-red-yellow-no-size.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/c-red.css /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/cat.png +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/checkerboard.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/colors-16x8-noSize.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/colors-16x8-parDefault.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/colors-16x8.png @@ -39,10 +40,13 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/colors-8x16.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/colors-8x16.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/exif-orientation-6-ru.jpg +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/external-images.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/import-green.css /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/import-red.css /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/intrinsic-size.jpg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/intrinsic-size.png +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.png +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/object-fit-stale-image.py /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/pattern-grg-rgr-grg.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/pattern-grg-rrg-rgg.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/pattern-rgr-grg-rgr.png @@ -51,6 +55,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/ruler-h-50px.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/ruler-v-100px.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/ruler-v-50px.png +/LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/scripted.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/small-border.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/square-purple.png /LayoutTests/imported/w3c/web-platform-tests/css/css-images/support/square-teal.png diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-expected.html new file mode 100644 index 000000000000..3c1864fea417 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-expected.html @@ -0,0 +1,28 @@ + + + + + CSS Image Test: SVG used as an image does not load images - mismatch reference + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-ref.html new file mode 100644 index 000000000000..3c1864fea417 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored-ref.html @@ -0,0 +1,28 @@ + + + + + CSS Image Test: SVG used as an image does not load images - mismatch reference + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored.html new file mode 100644 index 000000000000..d8f1c23e5e69 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-images-are-ignored.html @@ -0,0 +1,32 @@ + + + + + CSS Image Test: SVG used as an image does not load images + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-expected.svg b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-expected.svg new file mode 100644 index 000000000000..2230d80393c0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-expected.svg @@ -0,0 +1,10 @@ + + + + + +
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-ref.svg b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-ref.svg new file mode 100644 index 000000000000..2230d80393c0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored-ref.svg @@ -0,0 +1,10 @@ + + + + + +
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored.html new file mode 100644 index 000000000000..1f18bba34cb8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/svg-script-is-ignored.html @@ -0,0 +1,20 @@ + + + + + CSS Image Test: SVG used as an image does not execute any script + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/tiled-conic-gradients.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/tiled-conic-gradients.html index 22f9f4b6ba75..0c0ed49fc5da 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/tiled-conic-gradients.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/tiled-conic-gradients.html @@ -1,8 +1,10 @@ Checkerboard using conic gradients + +
- <__TAG__ class="view_box_subset"> + <__TAG__ class="view_box_subset">
- <__TAG__ class="view_box_subset_with_position"> + <__TAG__ class="view_box_subset_with_position">
- <__TAG__ class="view_box_subset_with_scaling"> + <__TAG__ class="view_box_subset_with_scaling">
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/w3c-import.log index 27cc06e1d156..5b2e49cb90d8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/w3c-import.log @@ -20,3 +20,4 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/chrome-legacy-propagation-remove-body-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/firefox-bug-1715631.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/firefox-bug-1930225.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/crashtests/list-item-hidden-until-found-crash.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation-expected.txt index 8ea5acf541c6..d0e36835c717 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation-expected.txt @@ -83,6 +83,216 @@ PASS Web Animations: property from [add 5] to [add 123] at ( PASS Web Animations: property from [add 5] to [add 123] at (0.6) should be [add 123] PASS Web Animations: property from [add 5] to [add 123] at (1) should be [add 123] PASS Web Animations: property from [add 5] to [add 123] at (1.5) should be [add 123] +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 5] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo) 5] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (-0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.3) should be [reversed(foo)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [reversed(foo)] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (0) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (0) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (-0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (0) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (0.3) should be [foo 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (0.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (0.6) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (1) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo 123] to [reversed(foo) 123] at (1.5) should be [reversed(foo) 123] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (-0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (0) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (-0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (0) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (-0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (0) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (-0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (0) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (-0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (0) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (-0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (0) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (0.3) should be [foo] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [foo] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (-0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (0) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (-0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (0) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (0.3) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (0.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (0.6) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (1) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [reversed(foo)] at (1.5) should be [reversed(foo)] assert_true: 'to' value should be supported expected true got false PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [add 123] at (-0.3) should be [initial] PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [add 123] at (0) should be [initial] PASS CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [add 123] at (0.3) should be [initial] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation.html index a0e1005ef0bf..658f9feffa83 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation.html @@ -19,6 +19,36 @@ to: 'add 123' }); +test_no_interpolation({ + property: 'counter-reset', + from: 'reversed(foo) 5', + to: 'reversed(foo) 123' +}); + +test_no_interpolation({ + property: 'counter-reset', + from: 'reversed(foo)', + to: 'reversed(foo) 123' +}); + +test_no_interpolation({ + property: 'counter-reset', + from: 'foo 123', + to: 'reversed(foo) 123' +}); + +test_no_interpolation({ + property: 'counter-reset', + from: 'foo', + to: 'reversed(foo)' +}); + +test_no_interpolation({ + property: 'counter-reset', + from: 'initial', + to: 'reversed(foo)' +}); + test_no_interpolation({ property: 'counter-reset', from: 'initial', diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-expected.html new file mode 100644 index 000000000000..595b27a62884 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-expected.html @@ -0,0 +1,5 @@ + +
1A
+
2B
+
3C
+
4E
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-ref.html new file mode 100644 index 000000000000..595b27a62884 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-ref.html @@ -0,0 +1,5 @@ + +
1A
+
2B
+
3C
+
4E
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update.html new file mode 100644 index 000000000000..709dae62f8b7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update.html @@ -0,0 +1,25 @@ + +CSS Lists Test: counters updated when parent element of element with counter operation on its pseudo element is removed + + + +
+
A
+
B
+
D
+
C
+
E
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-ref.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-ref.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001.html new file mode 100644 index 000000000000..7c8289f0f8b5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001.html @@ -0,0 +1,32 @@ + + + + + CSS Lists: 'counter-increment:list-item' on LI + + + + + + + +
  1. a
  2. b
  3. c
+
  1. a
  2. b
  3. c
+
  1. a
  2. b
  3. c
+
  1. a
  2. b
  3. c
+
  1. a
  2. b
  3. c
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-expected.html new file mode 100644 index 000000000000..ad156947d665 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-expected.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. Two +
  2. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-ref.html new file mode 100644 index 000000000000..ad156947d665 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-ref.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. Two +
  2. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002.html new file mode 100644 index 000000000000..fe7b2e59a9d0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002.html @@ -0,0 +1,14 @@ + +Interaction of ol and list-item value + + + + + + +
    +
  1. Two +
    +
    +
  2. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-expected.html new file mode 100644 index 000000000000..f9ea732c363f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-expected.html @@ -0,0 +1,5 @@ + +CSS Test Reference +
    +
  1. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-ref.html new file mode 100644 index 000000000000..f9ea732c363f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-ref.html @@ -0,0 +1,5 @@ + +CSS Test Reference +
    +
  1. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003.html new file mode 100644 index 000000000000..54637bb3f2c5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003.html @@ -0,0 +1,12 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
    +
  1. Four +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-expected.html new file mode 100644 index 000000000000..143953856dc0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-expected.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. One +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-ref.html new file mode 100644 index 000000000000..143953856dc0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-ref.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. One +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004.html new file mode 100644 index 000000000000..abc0e6c76c6f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. One +
    +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-expected.html new file mode 100644 index 000000000000..cc0d053aae7f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-expected.html @@ -0,0 +1,10 @@ + +CSS Test Reference +
    +
  1. One +
      +
    1. One +
    2. Minus Two +
    +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-ref.html new file mode 100644 index 000000000000..cc0d053aae7f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-ref.html @@ -0,0 +1,10 @@ + +CSS Test Reference +
    +
  1. One +
      +
    1. One +
    2. Minus Two +
    +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005.html new file mode 100644 index 000000000000..d2fd912c9566 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005.html @@ -0,0 +1,18 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. One +
    +
      +
    1. One +
      +
    2. Minus Two +
    +
  2. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter.html deleted file mode 100644 index b9a1196cabce..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CSS Lists: 'counter-increment:list-item' on LI - - - - - - - -
  1. a
  2. b
  3. c
-
  1. a
  2. b
  3. c
-
  1. a
  2. b
  3. c
-
  1. a
  2. b
  3. c
-
  1. a
  2. b
  3. c
- - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-expected.html new file mode 100644 index 000000000000..0b34ce40bbbf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Four +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-ref.html new file mode 100644 index 000000000000..0b34ce40bbbf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Four +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010.html new file mode 100644 index 000000000000..285782d23b34 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Four +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-ref.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011.html new file mode 100644 index 000000000000..782340db3da2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012.html new file mode 100644 index 000000000000..e6e78ac3180f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-expected.html new file mode 100644 index 000000000000..d18b574d5f01 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Three +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-ref.html new file mode 100644 index 000000000000..d18b574d5f01 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Three +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013.html new file mode 100644 index 000000000000..f1a2ef8c5580 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Five +
  2. Three +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-expected.html new file mode 100644 index 000000000000..c1deed9d32e5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-expected.html @@ -0,0 +1,12 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Two +
      +
    1. Four +
    2. Two +
    3. One +
    +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-ref.html new file mode 100644 index 000000000000..c1deed9d32e5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-ref.html @@ -0,0 +1,12 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Two +
      +
    1. Four +
    2. Two +
    3. One +
    +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014.html new file mode 100644 index 000000000000..0908362dd668 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014.html @@ -0,0 +1,18 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Five +
  2. Two +
      +
    1. Four +
    2. Two +
    3. One +
    +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-expected.html new file mode 100644 index 000000000000..8f9561e1be45 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Minus One +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-ref.html new file mode 100644 index 000000000000..8f9561e1be45 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Minus One +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015.html new file mode 100644 index 000000000000..fca90e078ce5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Minus One +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-expected.html new file mode 100644 index 000000000000..018f7d53b74b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-expected.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Zero +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-ref.html new file mode 100644 index 000000000000..018f7d53b74b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-ref.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Zero +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016.html new file mode 100644 index 000000000000..0e49ff7580a9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016.html @@ -0,0 +1,14 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Five +
    +
    +
  2. Zero +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-expected.html new file mode 100644 index 000000000000..65a4af4a6bf2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-expected.html @@ -0,0 +1,5 @@ + +CSS Test Reference +
    +
  1. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-ref.html new file mode 100644 index 000000000000..65a4af4a6bf2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-ref.html @@ -0,0 +1,5 @@ + +CSS Test Reference +
    +
  1. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017.html new file mode 100644 index 000000000000..8b3a3ad1eced --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017.html @@ -0,0 +1,12 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
    +
  1. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-expected.html new file mode 100644 index 000000000000..5e90134342bf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-expected.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. One +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-ref.html new file mode 100644 index 000000000000..5e90134342bf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-ref.html @@ -0,0 +1,6 @@ + +CSS Test Reference +
    +
  1. One +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018.html new file mode 100644 index 000000000000..6478c0ebc6d3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. One +
    +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-expected.html new file mode 100644 index 000000000000..39e148fa7191 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-expected.html @@ -0,0 +1,10 @@ + +CSS Test Reference +
    +
  1. Three +
      +
    1. Four +
    2. Two +
    +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-ref.html new file mode 100644 index 000000000000..39e148fa7191 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-ref.html @@ -0,0 +1,10 @@ + +CSS Test Reference +
    +
  1. Three +
      +
    1. Four +
    2. Two +
    +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019.html new file mode 100644 index 000000000000..e26591042c5d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019.html @@ -0,0 +1,18 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Three +
    +
      +
    1. Four +
      +
    2. Two +
    +
  2. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-expected.html new file mode 100644 index 000000000000..7bde363d8df6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Four +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-ref.html new file mode 100644 index 000000000000..7bde363d8df6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Five +
  2. Four +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020.html new file mode 100644 index 000000000000..2e82e54c4146 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Five +
  2. Four +
  3. Two +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021.html new file mode 100644 index 000000000000..4bce2f8307e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-expected.html new file mode 100644 index 000000000000..40118946f37a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-expected.html @@ -0,0 +1,9 @@ + +CSS Test Reference +
    +
  1. Six +
  2. Five +
  3. Four +
  4. Two +
  5. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-ref.html new file mode 100644 index 000000000000..40118946f37a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-ref.html @@ -0,0 +1,9 @@ + +CSS Test Reference +
    +
  1. Six +
  2. Five +
  3. Four +
  4. Two +
  5. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022.html new file mode 100644 index 000000000000..eb293762d2f6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022.html @@ -0,0 +1,15 @@ + +Interaction of ol reversed and list-item value + + + + + + +
    +
  1. Six +
  2. Five +
  3. Four +
  4. Two +
  5. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023.html new file mode 100644 index 000000000000..109ff8815135 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023.html @@ -0,0 +1,13 @@ + +Interaction of ol reversed and list-item value with counter-reset: reversed(counter) + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-expected.html new file mode 100644 index 000000000000..cef9d859cd44 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. One +
  2. Two +
  3. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-ref.html new file mode 100644 index 000000000000..cef9d859cd44 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. One +
  2. Two +
  3. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024.html new file mode 100644 index 000000000000..a51cf98ed8f7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024.html @@ -0,0 +1,13 @@ + +Overriding reversed attribute of ol by counter-reset: reversed(counter) + + + + + + +
    +
  1. One +
  2. Two +
  3. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-expected.html new file mode 100644 index 000000000000..eca8777067bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Four +
  2. Five +
  3. Six +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-ref.html new file mode 100644 index 000000000000..eca8777067bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-ref.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Four +
  2. Five +
  3. Six +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025.html new file mode 100644 index 000000000000..e2d075147d15 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025.html @@ -0,0 +1,13 @@ + +Overriding reversed attribute of ol by `counter-reset: reversed(counter) value` + + + + + + +
    +
  1. Four +
  2. Five +
  3. Six +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026.html new file mode 100644 index 000000000000..03cddba5e84c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026.html @@ -0,0 +1,13 @@ + +Overriding start attribute of ol by counter-reset: reversed(counter) + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027.html new file mode 100644 index 000000000000..9147673ff3e7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027.html @@ -0,0 +1,13 @@ + +Overriding start attribute of ol by counter-reset: reversed(counter) + + + + + + +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028-expected.html new file mode 100644 index 000000000000..2d8ba7ac998c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Three +
  2. Two +
  3. One +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028.html new file mode 100644 index 000000000000..fe0cf0c47b0e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028.html @@ -0,0 +1,13 @@ + +Nested list-item with reversed(list-item) + + + + +
    +
    +
  1. Three
  2. +
  3. Two
  4. +
  5. One
  6. +
    +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029-expected.html new file mode 100644 index 000000000000..cef9d859cd44 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. One +
  2. Two +
  3. Three +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029.html new file mode 100644 index 000000000000..ac178d5046d4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029.html @@ -0,0 +1,13 @@ + +Nested list-item with reversed(list-item) + + + + +
    +
    +
  1. One
  2. +
  3. Two
  4. +
  5. Three
  6. +
    +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030-expected.html new file mode 100644 index 000000000000..eca8777067bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030-expected.html @@ -0,0 +1,7 @@ + +CSS Test Reference +
    +
  1. Four +
  2. Five +
  3. Six +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030.html new file mode 100644 index 000000000000..82c8c1f74e2e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030.html @@ -0,0 +1,13 @@ + +Nested list-item with reversed(list-item) + + + + +
    +
    +
  1. Four
  2. +
  3. Five
  4. +
  5. Six
  6. +
    +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-counter-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-counter-crash.html index fc8a38c62802..27476ff7af0e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-counter-crash.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-counter-crash.html @@ -1,5 +1,5 @@ - + +
+ +
  • unspecified
  • +
  • outside
  • +
  • initial
  • +
  • inherit
  • +
  • unset
  • +
  • revert
  • +
  • revert-layer
  • +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-expected.html new file mode 100644 index 000000000000..ef2a03da18d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-expected.html @@ -0,0 +1,33 @@ + + +CSS Reference Case + + +
    + +
      +
    • unspecified
    • +
    • outside
    • +
    • initial
    • +
    • inherit
    • +
    • unset
    • +
    • revert
    • +
    • revert-layer
    • +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-notref.html new file mode 100644 index 000000000000..8f3c3dfaa913 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-notref.html @@ -0,0 +1,28 @@ + + +CSS Mismatch Reference Case + + + +
    + +
  • unspecified
  • +
  • outside
  • +
  • initial
  • +
  • inherit
  • +
  • unset
  • +
  • revert
  • +
  • revert-layer
  • +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-ref.html new file mode 100644 index 000000000000..ef2a03da18d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-ref.html @@ -0,0 +1,33 @@ + + +CSS Reference Case + + +
    + +
      +
    • unspecified
    • +
    • outside
    • +
    • initial
    • +
    • inherit
    • +
    • unset
    • +
    • revert
    • +
    • revert-layer
    • +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001.html new file mode 100644 index 000000000000..361ca994f76e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001.html @@ -0,0 +1,29 @@ + + +CSS Test: 'list-style-position:outside' should be the initial value and should result in 'outside' marker-positioning + + + + + +
    + +
  • unspecified
  • +
  • outside
  • +
  • initial
  • +
  • inherit
  • +
  • unset
  • +
  • revert
  • +
  • revert-layer
  • +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-expected.html new file mode 100644 index 000000000000..2fe0e6437bc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-expected.html @@ -0,0 +1,47 @@ + + + +CSS Lists reference: use of `counter-*` in ::marker + + + + + +
      +
    1. one +
    2. two +
    3. set to 10 +
    4. next item +
    5. next item +
    6. reset (12:2) +
    7. next item +
    8. last item +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-ref.html new file mode 100644 index 000000000000..2fe0e6437bc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-ref.html @@ -0,0 +1,47 @@ + + + +CSS Lists reference: use of `counter-*` in ::marker + + + + + +
      +
    1. one +
    2. two +
    3. set to 10 +
    4. next item +
    5. next item +
    6. reset (12:2) +
    7. next item +
    8. last item +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter.html new file mode 100644 index 000000000000..25ae8de03aa8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter.html @@ -0,0 +1,44 @@ + + + +CSS Lists test: use of `counter-*` in ::marker + + + + + + + + + + + +
      +
    1. one +
    2. two +
    3. set to 10 +
    4. next item +
    5. next item +
    6. reset +
    7. next item +
    8. last item +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-expected.html new file mode 100644 index 000000000000..25dab0e182f3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-expected.html @@ -0,0 +1,24 @@ + + + +CSS Lists reference: use of `quotes` in ::marker + + + + + +
      +
    1. one +
    2. two +
    3. three +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-ref.html new file mode 100644 index 000000000000..25dab0e182f3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-ref.html @@ -0,0 +1,24 @@ + + + +CSS Lists reference: use of `quotes` in ::marker + + + + + +
      +
    1. one +
    2. two +
    3. three +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes.html new file mode 100644 index 000000000000..af5e03d649fb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes.html @@ -0,0 +1,33 @@ + + + +CSS Lists test: use of `quotes` in ::marker + + + + + + + + + + + +
      +
    1. one +
    2. two +
    3. three +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/WEB_FEATURES.yml new file mode 100644 index 000000000000..3f1098847105 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/WEB_FEATURES.yml @@ -0,0 +1,6 @@ +features: +- name: counters + files: + - content-invalid.html + - counter-* + - counter-reset-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid-expected.txt index 22222e4ec7ff..4e45faebd213 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid-expected.txt @@ -8,4 +8,5 @@ PASS e.style['counter-increment'] = "section calc(-2.5)" should set the property PASS e.style['counter-increment'] = "section calc(10 + (5 * sign(2cqw - 10px)))" should set the property value PASS e.style['counter-increment'] = "a 1 b 2 c 3 d 4 e 5" should set the property value PASS e.style['counter-increment'] = "a 1 b 2 c 3 a 4 b 5" should set the property value +PASS e.style['counter-increment'] = "a\\ 8 9" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid.html index 0187622339d8..557290f87005 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-valid.html @@ -20,6 +20,7 @@ test_valid_value('counter-increment', 'section calc(10 + (5 * sign(2cqw - 10px)))'); test_valid_value('counter-increment', 'a 1 b 2 c 3 d 4 e 5'); test_valid_value('counter-increment', 'a 1 b 2 c 3 a 4 b 5'); +test_valid_value('counter-increment', 'a\\ 8 9'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid-expected.txt index 36a0d31e027d..56ea440278e9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid-expected.txt @@ -14,4 +14,5 @@ PASS e.style['counter-reset'] = "section calc(-2.5)" should set the property val PASS e.style['counter-reset'] = "section calc(10 + (5 * sign(2cqw - 10px)))" should set the property value PASS e.style['counter-reset'] = "a 1 b 2 c 3 d 4 e 5" should set the property value PASS e.style['counter-reset'] = "a 1 b 2 c 3 a 4 b 5" should set the property value +PASS e.style['counter-reset'] = "a\\ 8 9" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid.html index 4e462919edbe..55c9f5e4e394 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-reset-valid.html @@ -26,6 +26,7 @@ test_valid_value('counter-reset', 'section calc(10 + (5 * sign(2cqw - 10px)))'); test_valid_value('counter-reset', 'a 1 b 2 c 3 d 4 e 5'); test_valid_value('counter-reset', 'a 1 b 2 c 3 a 4 b 5'); +test_valid_value('counter-reset', 'a\\ 8 9'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid-expected.txt index 3ced1c126d04..a810a0456c71 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid-expected.txt @@ -8,4 +8,5 @@ PASS e.style['counter-set'] = "section calc(-2.5)" should set the property value PASS e.style['counter-set'] = "section calc(10 + (5 * sign(2cqw - 10px)))" should set the property value PASS e.style['counter-set'] = "a 1 b 2 c 3 d 4 e 5" should set the property value PASS e.style['counter-set'] = "a 1 b 2 c 3 a 4 b 5" should set the property value +PASS e.style['counter-set'] = "a\\ 8 9" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid.html index f7f1c661296a..e985fcae149f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-set-valid.html @@ -20,6 +20,7 @@ test_valid_value('counter-set', 'section calc(10 + (5 * sign(2cqw - 10px)))'); test_valid_value('counter-set', 'a 1 b 2 c 3 d 4 e 5'); test_valid_value('counter-set', 'a 1 b 2 c 3 a 4 b 5'); +test_valid_value('counter-set', 'a\\ 8 9'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub-expected.txt index 76ac55e1da46..8a8a2fc50a05 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub-expected.txt @@ -2,8 +2,12 @@ PASS Property list-style-image value 'none' PASS Property list-style-image value 'url("https://web-platform.test/")' PASS Property list-style-image value 'linear-gradient(to left bottom, red , blue )' +PASS Property list-style-image value 'linear-gradient(calc(90deg - 45deg), rgb(0, 128, 0), rgb(0, 0, 255)' PASS Property list-style-image value 'radial-gradient(10px at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))' PASS Property list-style-image value 'radial-gradient(circle calc(-0.5em + 10px) at calc(-1em + 10px) calc(-2em + 10px), rgb(255, 0, 0), rgb(0, 0, 255))' PASS Property list-style-image value 'radial-gradient(ellipse calc(-0.5em + 10px) calc(0.5em + 10px) at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))' PASS Property list-style-image value 'radial-gradient(ellipse calc(0.5em + 10px) calc(-0.5em + 10px) at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))' +PASS Property list-style-image value 'radial-gradient(black 0% 0.5em, 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%' +PASS Property list-style-image value 'conic-gradient(gold calc(100% / 2), #f06 calc(360deg * 4 / 5))' +PASS Property list-style-image value 'conic-gradient(black 1turn, white' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub.html index a39b0f091297..4232bbcfbf6a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/list-style-image-computed.sub.html @@ -22,11 +22,16 @@ test_computed_value('list-style-image', 'url("https://{{host}}/")'); test_computed_value('list-style-image', 'linear-gradient(to left bottom, red , blue )', 'linear-gradient(to left bottom, rgb(255, 0, 0), rgb(0, 0, 255))'); +test_computed_value('list-style-image', 'linear-gradient(calc(90deg - 45deg), rgb(0, 128, 0), rgb(0, 0, 255)', 'linear-gradient(45deg, rgb(0, 128, 0), rgb(0, 0, 255))'); test_computed_value('list-style-image', 'radial-gradient(10px at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))'); test_computed_value('list-style-image', 'radial-gradient(circle calc(-0.5em + 10px) at calc(-1em + 10px) calc(-2em + 10px), rgb(255, 0, 0), rgb(0, 0, 255))', 'radial-gradient(0px at -30px -70px, rgb(255, 0, 0), rgb(0, 0, 255))'); test_computed_value('list-style-image', 'radial-gradient(ellipse calc(-0.5em + 10px) calc(0.5em + 10px) at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))', 'radial-gradient(0px 30px at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))'); test_computed_value('list-style-image', 'radial-gradient(ellipse calc(0.5em + 10px) calc(-0.5em + 10px) at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))', 'radial-gradient(30px 0px at 20px 30px, rgb(255, 0, 0), rgb(0, 0, 255))'); +test_computed_value('list-style-image', 'radial-gradient(black 0% 0.5em, 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%', 'radial-gradient(rgb(0, 0, 0) 0%, rgb(0, 0, 0) 20px, 25%, rgb(0, 128, 0) 30%, rgb(0, 128, 0) 60%, 75%, rgb(255, 255, 255) 80%, rgb(255, 255, 255) 100%)'); + +test_computed_value('list-style-image', 'conic-gradient(gold calc(100% / 2), #f06 calc(360deg * 4 / 5))', 'conic-gradient(rgb(255, 215, 0) 50%, rgb(255, 0, 102) 288deg)'); +test_computed_value('list-style-image', 'conic-gradient(black 1turn, white', 'conic-gradient(rgb(0, 0, 0) 360deg, rgb(255, 255, 255))'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/w3c-import.log index c592cb0ee1c2..f23704db43f4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/content-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/parsing/counter-increment-invalid.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/w3c-import.log index 82d087c62342..acaf666ffea6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/w3c-import.log @@ -85,14 +85,46 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-increment-set-display-none.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-inside-display-contents-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-inside-display-contents.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-display-none-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-display-none-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-display-none.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-list-item-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-list-item-start-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-list-item-start.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-list-item.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-multiple-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-multiple-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-multiple.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-nested-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-nested-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-nested.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-not-list-item-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-not-list-item-start-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-not-list-item-start.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-not-list-item.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-003-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-pseudo-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001a-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001a.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001b-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-001b.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-003-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-siblings-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-with-regular-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-with-regular-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-reset-reversed-with-regular.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-set-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-set-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counter-set-001.html @@ -137,6 +169,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counters-scope-004-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/counters-scope-004.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/css-lists-no-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/deep-pseudo-element-remove-update.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/details-open-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/details-open-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/details-open.html @@ -186,9 +221,21 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-insert-child-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-insert-child-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-insert-child.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-ref.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-list-item-counter-005.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-counter-reset-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-counter-reset-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-counter-reset-001.html @@ -235,6 +282,61 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-009a.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-009b-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-009b.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-010.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-011.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-012.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-013.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-014.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-015.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-016.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-017.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-018.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-019.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-020.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-021.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-022.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-023.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-024.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-025.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-026.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-027.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-028.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-029.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-value-reversed-030.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-with-height-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-with-height-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/li-with-height-001.html @@ -260,6 +362,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-definition-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-definition-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-definition.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-dynamic-padding-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-dynamic-padding-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-item-dynamic-padding.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-marker-alignment-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-marker-alignment-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-marker-alignment.html @@ -280,6 +385,11 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-image-zoom-dynamic-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-image-zoom-dynamic-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-image-zoom-dynamic.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-expected-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-notref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-position-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-type-armenian-002.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-type-armenian-003.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-style-type-decimal-line-height-expected.html @@ -322,9 +432,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-with-image-display-changed-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-with-image-display-changed-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/list-with-image-display-changed-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-counter.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-dynamic-content-change-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-dynamic-content-change-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-dynamic-content-change.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-quotes.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-webkit-text-fill-color-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-webkit-text-fill-color-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/marker-webkit-text-fill-color.html @@ -340,6 +456,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/ol-change-display-type-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/ol-change-display-type-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/ol-change-display-type.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/outside-marker-covered-by-relpos-block-link-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/outside-marker-covered-by-relpos-block-link-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-lists/outside-marker-covered-by-relpos-block-link.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/pseudo-element-remove-update-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/pseudo-element-remove-update-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-lists/pseudo-element-remove-update.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-composition-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-composition-expected.txt index d10f2b6a2dad..ed4ce4f5e98d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-composition-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-composition-expected.txt @@ -30,7 +30,7 @@ PASS Compositing: property underlying [ellipse(10px 20px at 30px 40p PASS Compositing: property underlying [ellipse(25px 75%)] from add [ellipse()] to add [ellipse(closest-side farthest-side)] at (0.25) should be [ellipse()] PASS Compositing: property underlying [ellipse(25px 75%)] from add [ellipse()] to add [ellipse(closest-side farthest-side)] at (0.75) should be [ellipse(closest-side farthest-side)] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (-0.3) should be [inset(calc(46px + -12%))] -FAIL Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0) should be [inset(calc(40px + 0%))] assert_equals: expected "inset ( calc ( 0 % + 40px ) ) " but got "inset ( 40px ) " +PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0) should be [inset(calc(40px + 0%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0.3) should be [inset(calc(34px + 12%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0.6) should be [inset(calc(28px + 24%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (1) should be [inset(calc(20px + 40%))] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-interpolation-xywh-rect-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-interpolation-xywh-rect-expected.txt index dca40c15c220..db361cfc2cdd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-interpolation-xywh-rect-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/clip-path-interpolation-xywh-rect-expected.txt @@ -240,97 +240,97 @@ PASS Web Animations: property from [rect(auto auto auto auto)] to [r PASS Web Animations: property from [rect(auto auto auto auto)] to [rect(80% 20% 20% 80%)] at (1) should be [inset(80%)] PASS Web Animations: property from [rect(auto auto auto auto)] to [rect(80% 20% 20% 80%)] at (2) should be [inset(160%)] PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Transitions: property from neutral to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Transitions with transition: all: property from neutral to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS Web Animations: property from neutral to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions: property from neutral to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions with transition: all: property from neutral to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Animations: property from neutral to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS Web Animations: property from neutral to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Transitions: property from [inherit] to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Transitions with transition: all: property from [inherit] to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS CSS Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (-1) should be [inset(-30px calc(-80% + 90px) calc(0% + 70px) calc(-20% + 20px)] -FAIL Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px 10px calc ( 0 % + 10px ) ) " +PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.125) should be [inset(15px 10% calc(0% + 2.5px) calc(2.5% + 8.75px))] PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (0.875) should be [inset(45px calc(70% - 60px) calc(0% - 42.5px) calc(17.5% + 1.25px))] PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (1) should be [inset(50px calc(80% - 70px) calc(0% - 50px) 20%)] PASS Web Animations: property from [inherit] to [xywh(20% 50px 70px 100%)] at (2) should be [inset(90px calc(160% - 150px) calc(0% - 110px) calc(40% - 10px))] PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions: property from [inherit] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions with transition: all: property from [inherit] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS Web Animations: property from [inherit] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/mask-image-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/mask-image-interpolation-expected.txt index d825446cc10c..699f2ba3995c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/mask-image-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/animations/mask-image-interpolation-expected.txt @@ -323,16 +323,16 @@ PASS Web Animations: property from [url(../resources/stripes-20.png PASS Web Animations: property from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] PASS Web Animations: property from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] PASS Web Animations: property from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] -FAIL CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " -FAIL CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " -FAIL CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " +PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] PASS CSS Transitions with transition-behavior:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] -FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " -FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " -FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_equals: expected "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " but got "url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) , url ( http : / / web - platform.test : 8800 / ... / blue - 20.png ) " +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/hit-test/clip-path-element-objectboundingbox-002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/hit-test/clip-path-element-objectboundingbox-002-expected.txt index 604d31e5c761..fd147f2132ed 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/hit-test/clip-path-element-objectboundingbox-002-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/hit-test/clip-path-element-objectboundingbox-002-expected.txt @@ -1,5 +1,3 @@ -FAIL Hit-test of clip-path nested objectBoundingBox assert_equals: 150,150 expected Element node
    but got Element node
    - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid-expected.txt index ed767c8e69d0..8698e0d27abf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid-expected.txt @@ -13,13 +13,13 @@ PASS e.style['clip-path'] = "circle()" should set the property value PASS e.style['clip-path'] = "circle(1px)" should set the property value PASS e.style['clip-path'] = "circle(closest-side)" should set the property value PASS e.style['clip-path'] = "circle(at 10% 20%)" should set the property value -FAIL e.style['clip-path'] = "circle(farthest-side at center top)" should set the property value assert_equals: serialization should be canonical expected "circle(farthest-side at 50% 0%)" but got "circle(farthest-side at center top)" -FAIL e.style['clip-path'] = "circle(4% at top right)" should set the property value assert_equals: serialization should be canonical expected "circle(4% at 100% 0%)" but got "circle(4% at right top)" +PASS e.style['clip-path'] = "circle(farthest-side at center top)" should set the property value +PASS e.style['clip-path'] = "circle(4% at top right)" should set the property value PASS e.style['clip-path'] = "ellipse()" should set the property value PASS e.style['clip-path'] = "ellipse(1px closest-side)" should set the property value PASS e.style['clip-path'] = "ellipse(at 10% 20%)" should set the property value PASS e.style['clip-path'] = "ellipse(closest-side closest-side at 10% 20%)" should set the property value -FAIL e.style['clip-path'] = "ellipse(farthest-side 4% at bottom left)" should set the property value assert_equals: serialization should be canonical expected "ellipse(farthest-side 4% at 0% 100%)" but got "ellipse(farthest-side 4% at left bottom)" +PASS e.style['clip-path'] = "ellipse(farthest-side 4% at bottom left)" should set the property value PASS e.style['clip-path'] = "polygon(1% 2%)" should set the property value PASS e.style['clip-path'] = "polygon(nonzero, 1px 2px, 3em 4em)" should set the property value PASS e.style['clip-path'] = "polygon(evenodd, 1px 2px, 3em 4em, 5pt 6%)" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid.html index 84555fd2d165..03472a3593df 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-valid.html @@ -29,14 +29,14 @@ test_valid_value("clip-path", "circle(1px)", "circle(1px)"); test_valid_value("clip-path", "circle(closest-side)", "circle()"); test_valid_value("clip-path", "circle(at 10% 20%)"); -test_valid_value("clip-path", "circle(farthest-side at center top)", "circle(farthest-side at 50% 0%)"); -test_valid_value("clip-path", "circle(4% at top right)", "circle(4% at 100% 0%)"); +test_valid_value("clip-path", "circle(farthest-side at center top)"); +test_valid_value("clip-path", "circle(4% at top right)", "circle(4% at right top)"); test_valid_value("clip-path", "ellipse()"); test_valid_value("clip-path", "ellipse(1px closest-side)"); test_valid_value("clip-path", "ellipse(at 10% 20%)"); test_valid_value("clip-path", "ellipse(closest-side closest-side at 10% 20%)", "ellipse(at 10% 20%)"); -test_valid_value("clip-path", "ellipse(farthest-side 4% at bottom left)", "ellipse(farthest-side 4% at 0% 100%)"); +test_valid_value("clip-path", "ellipse(farthest-side 4% at bottom left)", "ellipse(farthest-side 4% at left bottom)"); test_valid_value("clip-path", "polygon(1% 2%)"); test_valid_value("clip-path", "polygon(nonzero, 1px 2px, 3em 4em)", "polygon(1px 2px, 3em 4em)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed-expected.txt index 4d9b9b59a7c3..9b7fcc2ac7b8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed-expected.txt @@ -10,7 +10,9 @@ PASS Property mask-size value 'cover' PASS Property mask-size value 'calc(10px + 0.5em) calc(10px - 0.5em)' PASS Property mask-size value 'calc(10px - 0.5em) calc(10px + 0.5em)' PASS Property mask-size value 'auto 1px, 2% 3%, contain' -PASS Property mask-size value 'auto' multiple values -PASS Property mask-size value 'auto, 100%' multiple values -PASS Property mask-size value '100%' multiple values +PASS Property mask-size value 'auto' multiple base values +PASS Property mask-size value 'auto, auto' multiple base values +PASS Property mask-size value 'auto, auto, auto' multiple base values +PASS Property mask-size value 'auto, 100%' multiple base values +PASS Property mask-size value '100%' multiple base values diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed.html index 4c1a14c59ca9..4b41c84115ec 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/mask-size-computed.html @@ -28,12 +28,14 @@ test_computed_value("mask-size", "cover"); test_computed_value("mask-size", "calc(10px + 0.5em) calc(10px - 0.5em)", "30px 0px"); test_computed_value("mask-size", "calc(10px - 0.5em) calc(10px + 0.5em)", "0px 30px"); -test_computed_value("mask-size", "auto 1px, 2% 3%, contain", "auto 1px"); +test_computed_value("mask-size", "auto 1px, 2% 3%, contain"); document.getElementById("target").style['mask-image'] = "none, none"; -test_computed_value("mask-size", "auto", "auto, auto", "multiple values"); -test_computed_value("mask-size", "auto, 100%", "auto, 100% auto", "multiple values"); -test_computed_value("mask-size", "100%", "100% auto, 100% auto", "multiple values"); +test_computed_value("mask-size", "auto", "auto", "multiple base values"); +test_computed_value("mask-size", "auto, auto", "auto, auto", "multiple base values"); +test_computed_value("mask-size", "auto, auto, auto", "auto, auto, auto", "multiple base values"); +test_computed_value("mask-size", "auto, 100%", "auto, 100% auto", "multiple base values"); +test_computed_value("mask-size", "100%", "100% auto", "multiple base values"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..11f6fc5bf031 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-expected.html @@ -0,0 +1,43 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..11f6fc5bf031 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant-ref.html @@ -0,0 +1,43 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..72cd68c62dbc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-column-container-with-scrollable-descendant.html @@ -0,0 +1,45 @@ + + + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..3ddabae4e3d0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-expected.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..3ddabae4e3d0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant-ref.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant.html new file mode 100644 index 000000000000..d739c2fa5406 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-multiple-items-with-scrollable-descendant.html @@ -0,0 +1,43 @@ + + + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..357c3fc5d7ee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-expected.html @@ -0,0 +1,42 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..357c3fc5d7ee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant-ref.html @@ -0,0 +1,42 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..33cf2659c3ce --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-container-with-scrollable-descendant.html @@ -0,0 +1,44 @@ + + + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..0ba979cf3d40 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-expected.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..0ba979cf3d40 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant-ref.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..666f532bcc0e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-nested-container-with-scrollable-descendant.html @@ -0,0 +1,43 @@ + + + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..319a35a5c560 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant.html new file mode 100644 index 000000000000..cdf157d9ecd5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/flex-orthogonal-writing-mode-with-scrollable-descendant.html @@ -0,0 +1,34 @@ + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..f825b55eb421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-expected.html @@ -0,0 +1,42 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..f825b55eb421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant-ref.html @@ -0,0 +1,42 @@ + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..e36655d4e07f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-container-with-scrollable-descendant.html @@ -0,0 +1,44 @@ + + + + + + + + +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..94ddaabad784 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-expected.html @@ -0,0 +1,46 @@ + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..94ddaabad784 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant-ref.html @@ -0,0 +1,46 @@ + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..45e8aa61c551 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-nested-container-with-scrollable-descendant.html @@ -0,0 +1,48 @@ + + + + + + + + +
    +
    +
    +
    +
    PASS if always-on scrollbar does not overlap the blue box below
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..319a35a5c560 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant.html new file mode 100644 index 000000000000..89304be07f42 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/grid-orthogonal-writing-mode-with-scrollable-descendant.html @@ -0,0 +1,34 @@ + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-expected.html new file mode 100644 index 000000000000..62843c74b9f9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-expected.html @@ -0,0 +1,27 @@ + + + + + + +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-ref.html new file mode 100644 index 000000000000..62843c74b9f9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl-ref.html @@ -0,0 +1,27 @@ + + + + + + +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl.html new file mode 100644 index 000000000000..e27fabda0699 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-width-container-with-scrollable-descendant-vertical-rl.html @@ -0,0 +1,29 @@ + + + + + + + + +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-expected.html new file mode 100644 index 000000000000..e00cfdd3ff14 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-expected.html @@ -0,0 +1,17 @@ + + +CSS Reference + + +

    Test passes if the green-on-yellow region in each line matches the reference.

    +
    Test
    +
    Test
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-ref.html new file mode 100644 index 000000000000..e00cfdd3ff14 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative-ref.html @@ -0,0 +1,17 @@ + + +CSS Reference + + +

    Test passes if the green-on-yellow region in each line matches the reference.

    +
    Test
    +
    Test
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative.html new file mode 100644 index 000000000000..8a71aa37d9fa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-c0.tentative.html @@ -0,0 +1,24 @@ + + + + + CSS Test: ::first-letter with leading C0 control character (tentative) + + + + + + +

    Test passes if the green-on-yellow region in each line matches the reference.

    +
    Test
    +
    Test
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic-expected.html new file mode 100644 index 000000000000..958d32ca7a9b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic-expected.html @@ -0,0 +1,18 @@ + + + + + CSS Reference: ::first-letter Dutch 'ij' digraph + + + +

    Test passes if both "I" and "J" are green:

    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic.html new file mode 100644 index 000000000000..41cb1c351862 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-document-lang-dynamic.html @@ -0,0 +1,29 @@ + + + + + CSS Test: ::first-letter Dutch 'ij' digraph reacts to dynamic lang change on the document element + + + + + + + +

    Test passes if both "I" and "J" are green:

    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic-expected.html new file mode 100644 index 000000000000..9306a1b6af91 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic-expected.html @@ -0,0 +1,27 @@ + + + + + CSS Reference: ::first-letter Dutch 'ij' digraph + + + +

    Test passes if both "I" and "J" are green in the first three examples, and only "I" is green in the last:

    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic.html new file mode 100644 index 000000000000..8edcebb34b52 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-digraph-dynamic.html @@ -0,0 +1,41 @@ + + + + + CSS Test: ::first-letter Dutch 'ij' digraph reacts to dynamic lang changes + + + + + + + +

    Test passes if both "I" and "J" are green in the first three examples, and only "I" is green in the last:

    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-expected.html new file mode 100644 index 000000000000..d8322dca25e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-expected.html @@ -0,0 +1,25 @@ + + +CSS Reference + + +

    Test passes if the green-on-yellow text in each line matches the reference.

    +
    (T)est
    +
    “T”est
    +
    _T_est
    +
    –Test
    +
    T(rail
    +
    T–rail
    +
    « T »est
    +
    𐄀T𐄀est
    +
    T .est
    +
    T. est
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-ref.html new file mode 100644 index 000000000000..d8322dca25e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation-ref.html @@ -0,0 +1,25 @@ + + +CSS Reference + + +

    Test passes if the green-on-yellow text in each line matches the reference.

    +
    (T)est
    +
    “T”est
    +
    _T_est
    +
    –Test
    +
    T(rail
    +
    T–rail
    +
    « T »est
    +
    𐄀T𐄀est
    +
    T .est
    +
    T. est
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation.html new file mode 100644 index 000000000000..7052c3a56c04 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/first-letter-trailing-punctuation.html @@ -0,0 +1,32 @@ + + + + + CSS Test: ::first-letter punctuation surrounding the first letter + + + + + + +

    Test passes if the green-on-yellow text in each line matches the reference.

    +
    (T)est
    +
    “T”est
    +
    _T_est
    +
    –Test
    +
    T(rail
    +
    T–rail
    +
    « T »est
    +
    𐄀T𐄀est
    +
    T .est
    +
    T. est
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-document-lang-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-document-lang-dynamic-ref.html new file mode 100644 index 000000000000..958d32ca7a9b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-document-lang-dynamic-ref.html @@ -0,0 +1,18 @@ + + + + + CSS Reference: ::first-letter Dutch 'ij' digraph + + + +

    Test passes if both "I" and "J" are green:

    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-dynamic-ref.html new file mode 100644 index 000000000000..9306a1b6af91 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-pseudo/reference/first-letter-digraph-dynamic-ref.html @@ -0,0 +1,27 @@ + + + + + CSS Reference: ::first-letter Dutch 'ij' digraph + + + +

    Test passes if both "I" and "J" are green in the first three examples, and only "I" is green in the last:

    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    +
    +

    ijsselmeer

    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant-expected.txt new file mode 100644 index 000000000000..c22f491cb58b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant-expected.txt @@ -0,0 +1,3 @@ + +PASS Ancestor :hover invalidates a descendant slotted into a shadow tree + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant.html new file mode 100644 index 000000000000..d0e3b257305c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-scoping/hover-invalidates-slotted-descendant.html @@ -0,0 +1,50 @@ + + +:hover on a slotted ancestor invalidates a slotted descendant across the shadow scope boundary + + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-composition-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-composition-expected.txt index 95c912377bc0..9f20e1f152f1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-composition-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-composition-expected.txt @@ -30,7 +30,7 @@ PASS Compositing: property underlying [ellipse(10px 20px at 30px PASS Compositing: property underlying [ellipse(25px 75%)] from add [ellipse()] to add [ellipse(closest-side farthest-side)] at (0.25) should be [ellipse()] PASS Compositing: property underlying [ellipse(25px 75%)] from add [ellipse()] to add [ellipse(closest-side farthest-side)] at (0.75) should be [ellipse(closest-side farthest-side)] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (-0.3) should be [inset(calc(46px + -12%))] -FAIL Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0) should be [inset(calc(40px + 0%))] assert_equals: expected "inset ( calc ( 0 % + 40px ) ) " but got "inset ( 40px ) " +PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0) should be [inset(calc(40px + 0%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0.3) should be [inset(calc(34px + 12%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (0.6) should be [inset(calc(28px + 24%))] PASS Compositing: property underlying [inset(20px)] from add [inset(20px)] to add [inset(40%)] at (1) should be [inset(calc(20px + 40%))] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation-expected.txt index 858c2ef9ddd0..31ece52fecdb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation-expected.txt @@ -269,6 +269,234 @@ PASS Web Animations: property from [inset(100%)] to [inset(120%) PASS Web Animations: property from [inset(100%)] to [inset(120%)] at (0.6) should be [inset(112%)] PASS Web Animations: property from [inset(100%)] to [inset(120%)] at (1) should be [inset(120%)] PASS Web Animations: property from [inset(100%)] to [inset(120%)] at (1.5) should be [inset(130%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [inset(10% 20% 30% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [rect(10% 80% 70% 40%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [inset(50% 20% 30% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [rect(50% 80% 70% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0) should be [inset(10% 20% 30% 40%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (0.5) should be [inset(30% 20% 30% 30%)] +PASS Web Animations: property from [xywh(40% 10% 40% 60%)] to [xywh(20% 50% 60% 20%)] at (1) should be [inset(50% 20% 30% 20%)] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [inset(10% 20% 30% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [rect(10% 80% 70% 40%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [inset(50% 20% 30% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [rect(50% 80% 70% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS CSS Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0) should be [inset(10% 20% 30% 40%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (0.5) should be [inset(30% 20% 30% 30%) border-box] +PASS Web Animations: property from [xywh(40% 10% 40% 60%) border-box] to [xywh(20% 50% 60% 20%) border-box] at (1) should be [inset(50% 20% 30% 20%) border-box] +PASS CSS Transitions: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0) should be [inset(10% calc(100% - 100px) 50% 0px round 20px)] +PASS CSS Transitions: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0.5) should be [inset(15% calc(75% - 50px) calc(75% - 100px) 10px round 10px)] +PASS CSS Transitions: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (1) should be [inset(20% 50% calc(100% - 200px) 20px)] +PASS CSS Transitions with transition: all: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0) should be [inset(10% calc(100% - 100px) 50% 0px round 20px)] +PASS CSS Transitions with transition: all: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0.5) should be [inset(15% calc(75% - 50px) calc(75% - 100px) 10px round 10px)] +PASS CSS Transitions with transition: all: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (1) should be [inset(20% 50% calc(100% - 200px) 20px)] +PASS CSS Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0) should be [inset(10% calc(100% - 100px) 50% 0px round 20px)] +PASS CSS Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0.5) should be [inset(15% calc(75% - 50px) calc(75% - 100px) 10px round 10px)] +PASS CSS Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (1) should be [inset(20% 50% calc(100% - 200px) 20px)] +PASS Web Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0) should be [inset(10% calc(100% - 100px) 50% 0px round 20px)] +PASS Web Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (0.5) should be [inset(15% calc(75% - 50px) calc(75% - 100px) 10px round 10px)] +PASS Web Animations: property from [xywh(0px 10% 100px 40% round 20px)] to [rect(20% 50% 200px 20px)] at (1) should be [inset(20% 50% calc(100% - 200px) 20px)] PASS CSS Transitions with transition-behavior:allow-discrete: property from [none] to [ellipse(100% 100% at 0% 0%)] at (-0.3) should be [none] PASS CSS Transitions with transition-behavior:allow-discrete: property from [none] to [ellipse(100% 100% at 0% 0%)] at (0) should be [none] PASS CSS Transitions with transition-behavior:allow-discrete: property from [none] to [ellipse(100% 100% at 0% 0%)] at (0.3) should be [none] @@ -323,4 +551,184 @@ PASS CSS Animations: property from [circle(25% at right 5% botto PASS Web Animations: property from [circle(25% at right 5% bottom 15px)] to [circle(45% at right 25% bottom 35px)] at (0.25) should be [circle(30% at 90% calc(-20px + 100%))] PASS Web Animations: property from [circle(25% at right 5% bottom 15px)] to [circle(45% at right 25% bottom 35px)] at (0.5) should be [circle(35% at 85% calc(-25px + 100%))] PASS Web Animations: property from [circle(25% at right 5% bottom 15px)] to [circle(45% at right 25% bottom 35px)] at (0.75) should be [circle(40% at 80% calc(-30px + 100%))] +PASS CSS Transitions: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0) should be [circle(20% at 10% 10%) border-box] +PASS CSS Transitions: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0.5) should be [circle(30% at 20% 20%) border-box] +PASS CSS Transitions: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (1) should be [circle(40% at 30% 30%) border-box] +PASS CSS Transitions with transition: all: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0) should be [circle(20% at 10% 10%) border-box] +PASS CSS Transitions with transition: all: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0.5) should be [circle(30% at 20% 20%) border-box] +PASS CSS Transitions with transition: all: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (1) should be [circle(40% at 30% 30%) border-box] +PASS CSS Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0) should be [circle(20% at 10% 10%) border-box] +PASS CSS Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0.5) should be [circle(30% at 20% 20%) border-box] +PASS CSS Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (1) should be [circle(40% at 30% 30%) border-box] +PASS Web Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0) should be [circle(20% at 10% 10%) border-box] +PASS Web Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (0.5) should be [circle(30% at 20% 20%) border-box] +PASS Web Animations: property from [circle(20% at 10% 10%) border-box] to [circle(40% at 30% 30%) border-box] at (1) should be [circle(40% at 30% 30%) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS CSS Transitions: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS CSS Transitions with transition: all: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(10px) border-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(10px) border-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(10px) border-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS CSS Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (-0.3) should be [inset(10px) border-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0) should be [inset(10px) border-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.3) should be [inset(10px) border-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.5) should be [inset(30px) padding-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (0.6) should be [inset(30px) padding-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1) should be [inset(30px) padding-box] +PASS Web Animations: property from [inset(10px) border-box] to [inset(30px) padding-box] at (1.5) should be [inset(30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(10px)] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(10px)] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(10px)] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(10px)] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(10px)] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(10px)] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS CSS Transitions: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS CSS Transitions with transition: all: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(10px)] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(10px)] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(10px)] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS CSS Animations: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (-0.3) should be [inset(10px)] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (0) should be [inset(10px)] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.3) should be [inset(10px)] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.5) should be [inset(30px) border-box] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (0.6) should be [inset(30px) border-box] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (1) should be [inset(30px) border-box] +PASS Web Animations: property from [inset(10px)] to [inset(30px) border-box] at (1.5) should be [inset(30px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition: all: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (-0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0) should be [rect(10px 90px 90px 10px) border-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.3) should be [rect(10px 90px 90px 10px) border-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (0.6) should be [rect(30px 70px 70px 30px) padding-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1) should be [rect(30px 70px 70px 30px) padding-box] +PASS Web Animations: property from [rect(10px 90px 90px 10px) border-box] to [rect(30px 70px 70px 30px) padding-box] at (1.5) should be [rect(30px 70px 70px 30px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-behavior:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Transitions with transition: all: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS CSS Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (-0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0) should be [xywh(10px 10px 80px 80px) padding-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.3) should be [xywh(10px 10px 80px 80px) padding-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.5) should be [xywh(30px 30px 40px 40px) content-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (0.6) should be [xywh(30px 30px 40px 40px) content-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1) should be [xywh(30px 30px 40px 40px) content-box] +PASS Web Animations: property from [xywh(10px 10px 80px 80px) padding-box] to [xywh(30px 30px 40px 40px) content-box] at (1.5) should be [xywh(30px 30px 40px 40px) content-box] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation.html index 3380acdba00d..ae9eedb0ca28 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation.html @@ -118,6 +118,50 @@ {at: 1.5, expect: 'inset(130%)'}, ]); +// All functions (inset, rect, xywh) compute to the +// equivalent inset() and interpolate identically. Exercise every +// from/to combination of the three syntaxes, with and without a +// matching . A and B below describe the same rectangle in +// all three forms (per side: A = top 10%, right 20%, bottom 30%, +// left 40%; B = top 50%, right 20%, bottom 30%, left 20%). +for (const box of ['', ' border-box']) { + const A = { + inset: 'inset(10% 20% 30% 40%)' + box, + rect: 'rect(10% 80% 70% 40%)' + box, + xywh: 'xywh(40% 10% 40% 60%)' + box, + }; + const B = { + inset: 'inset(50% 20% 30% 20%)' + box, + rect: 'rect(50% 80% 70% 20%)' + box, + xywh: 'xywh(20% 50% 60% 20%)' + box, + }; + const expectations = [ + {at: 0, expect: 'inset(10% 20% 30% 40%)' + box}, + {at: 0.5, expect: 'inset(30% 20% 30% 30%)' + box}, + {at: 1, expect: 'inset(50% 20% 30% 20%)' + box}, + ]; + for (const fromForm of ['inset', 'rect', 'xywh']) { + for (const toForm of ['inset', 'rect', 'xywh']) { + test_interpolation({ + property: 'shape-outside', + from: A[fromForm], + to: B[toForm], + }, expectations); + } + } +} + +// Mixed forms with a round radius (not covered by the loop above). +test_interpolation({ + property: 'shape-outside', + from: 'xywh(0px 10% 100px 40% round 20px)', + to: 'rect(20% 50% 200px 20px)', +}, [ + {at: 0, expect: 'inset(10% calc(100% - 100px) 50% 0px round 20px)'}, + {at: 0.5, expect: 'inset(15% calc(75% - 50px) calc(75% - 100px) 10px round 10px)'}, + {at: 1, expect: 'inset(20% 50% calc(100% - 200px) 20px)'}, +]); + test_no_interpolation({ property: 'shape-outside', from: 'none', @@ -134,4 +178,40 @@ {at: 0.5, expect: 'circle(35% at 85% calc(-25px + 100%))'}, {at: 0.75, expect: 'circle(40% at 80% calc(-30px + 100%))'}, ]); + +// Other shapes also interpolate when both endpoints carry the same . +test_interpolation({ + property: 'shape-outside', + from: 'circle(20% at 10% 10%) border-box', + to: 'circle(40% at 30% 30%) border-box', +}, [ + {at: 0, expect: 'circle(20% at 10% 10%) border-box'}, + {at: 0.5, expect: 'circle(30% at 20% 20%) border-box'}, + {at: 1, expect: 'circle(40% at 30% 30%) border-box'}, +]); + +// Mismatched or missing is discrete. +test_no_interpolation({ + property: 'shape-outside', + from: 'inset(10px) border-box', + to: 'inset(30px) padding-box', +}); + +test_no_interpolation({ + property: 'shape-outside', + from: 'inset(10px)', + to: 'inset(30px) border-box', +}); + +test_no_interpolation({ + property: 'shape-outside', + from: 'rect(10px 90px 90px 10px) border-box', + to: 'rect(30px 70px 70px 30px) padding-box', +}); + +test_no_interpolation({ + property: 'shape-outside', + from: 'xywh(10px 10px 80px 80px) padding-box', + to: 'xywh(30px 30px 40px 40px) content-box', +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation-expected.txt new file mode 100644 index 000000000000..bdc067858000 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation-expected.txt @@ -0,0 +1,480 @@ + +FAIL CSS Transitions: property from neutral to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M -2 -2 L 8 8 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 30 30 L 40 40 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 70 70 L 80 80 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M -2 -2 L 8 8 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 30 30 L 40 40 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 70 70 L 80 80 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M -2 -2 L 8 8 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 30 30 L 40 40 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 70 70 L 80 80 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M -2 -2 L 8 8 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 30 30 L 40 40 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 70 70 L 80 80 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (0.6) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (1) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [path("M 50 50 L 60 60 Z")] at (1.5) should be [path("M 50 50 L 60 60 Z")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [path("M 10 140 H 270")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [path("M 10 140 H 270")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [path("M 10 140 H 270")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [path("M 10 140 H 270")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (0.6) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 L 20 20 Z")] at (1.5) should be [path("M 10 10 L 20 20 Z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (-0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.3) should be [path("M 10 10 L 20 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (0.6) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20")] to [path("M 10 10 H 20")] at (1.5) should be [path("M 10 10 H 20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.125) should be [path("M 45 70 H 95")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.875) should be [path("M 15 130 H 245")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.125) should be [path("M 45 70 H 95")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.875) should be [path("M 15 130 H 245")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.125) should be [path("M 45 70 H 95")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.875) should be [path("M 15 130 H 245")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (-1) should be [path("M 90 -20 H -130")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.125) should be [path("M 45 70 H 95")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (0.875) should be [path("M 15 130 H 245")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270")] at (2) should be [path("M -30 220 H 470")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0) should be [path("M 50 60 V 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0.5) should be [path("M 30 100 V 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (1) should be [path("M 10 140 V 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0) should be [path("M 50 60 V 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0.5) should be [path("M 30 100 V 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (1) should be [path("M 10 140 V 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0) should be [path("M 50 60 V 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0.5) should be [path("M 30 100 V 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (1) should be [path("M 10 140 V 270")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0) should be [path("M 50 60 V 70")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (0.5) should be [path("M 30 100 V 170")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 V 70")] to [path("M 10 140 V 270")] at (1) should be [path("M 10 140 V 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0) should be [path("M 12 34 C 5 5 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0.5) should be [path("M 16 30 C 9 9 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (1) should be [path("M 20 26 C 13 13 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0) should be [path("M 12 34 C 5 5 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0.5) should be [path("M 16 30 C 9 9 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (1) should be [path("M 20 26 C 13 13 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0) should be [path("M 12 34 C 5 5 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0.5) should be [path("M 16 30 C 9 9 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (1) should be [path("M 20 26 C 13 13 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0) should be [path("M 12 34 C 5 5 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (0.5) should be [path("M 16 30 C 9 9 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 C 5 5 45 67 89 123")] to [path("M 20 26 C 13 13 61 51 113 99")] at (1) should be [path("M 20 26 C 13 13 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0) should be [path("M 12 34 S 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0.5) should be [path("M 16 30 S 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (1) should be [path("M 20 26 S 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0) should be [path("M 12 34 S 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0.5) should be [path("M 16 30 S 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (1) should be [path("M 20 26 S 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0) should be [path("M 12 34 S 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0.5) should be [path("M 16 30 S 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (1) should be [path("M 20 26 S 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0) should be [path("M 12 34 S 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (0.5) should be [path("M 16 30 S 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 S 45 67 89 123")] to [path("M 20 26 S 61 51 113 99")] at (1) should be [path("M 20 26 S 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0) should be [path("M 12 34 Q 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0.5) should be [path("M 16 30 Q 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (1) should be [path("M 20 26 Q 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0) should be [path("M 12 34 Q 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0.5) should be [path("M 16 30 Q 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (1) should be [path("M 20 26 Q 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0) should be [path("M 12 34 Q 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0.5) should be [path("M 16 30 Q 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (1) should be [path("M 20 26 Q 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0) should be [path("M 12 34 Q 45 67 89 123")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (0.5) should be [path("M 16 30 Q 53 59 101 111")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 Q 45 67 89 123")] to [path("M 20 26 Q 61 51 113 99")] at (1) should be [path("M 20 26 Q 61 51 113 99")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0) should be [path("M 12 34 T 45 67")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0.5) should be [path("M 16 30 T 53 59")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (1) should be [path("M 20 26 T 61 51")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0) should be [path("M 12 34 T 45 67")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0.5) should be [path("M 16 30 T 53 59")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (1) should be [path("M 20 26 T 61 51")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0) should be [path("M 12 34 T 45 67")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0.5) should be [path("M 16 30 T 53 59")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (1) should be [path("M 20 26 T 61 51")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0) should be [path("M 12 34 T 45 67")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (0.5) should be [path("M 16 30 T 53 59")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 12 34 T 45 67")] to [path("M 20 26 T 61 51")] at (1) should be [path("M 20 26 T 61 51")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0) should be [path("M 5 5 A 10 20 0 0 0 15 -15")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0.5) should be [path("M 10 10 A 15 25 0 0 0 10 -20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (1) should be [path("M 15 15 A 20 30 0 0 0 5 -25")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0) should be [path("M 5 5 A 10 20 0 0 0 15 -15")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0.5) should be [path("M 10 10 A 15 25 0 0 0 10 -20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (1) should be [path("M 15 15 A 20 30 0 0 0 5 -25")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0) should be [path("M 5 5 A 10 20 0 0 0 15 -15")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0.5) should be [path("M 10 10 A 15 25 0 0 0 10 -20")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (1) should be [path("M 15 15 A 20 30 0 0 0 5 -25")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0) should be [path("M 5 5 A 10 20 0 0 0 15 -15")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (0.5) should be [path("M 10 10 A 15 25 0 0 0 10 -20")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 A 10 20 0 0 0 15 -15")] to [path("M 15 15 A 20 30 0 0 0 5 -25")] at (1) should be [path("M 15 15 A 20 30 0 0 0 5 -25")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("m 50 60 h 20")] to [path("m 10 140 h 260")] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0) should be [path("M 50 60 H 70") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0.5) should be [path("M 30 100 H 170") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (1) should be [path("M 10 140 H 270") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0) should be [path("M 50 60 H 70") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0.5) should be [path("M 30 100 H 170") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (1) should be [path("M 10 140 H 270") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0) should be [path("M 50 60 H 70") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0.5) should be [path("M 30 100 H 170") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (1) should be [path("M 10 140 H 270") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0) should be [path("M 50 60 H 70") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (0.5) should be [path("M 30 100 H 170") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") padding-box] to [path("M 10 140 H 270") padding-box] at (1) should be [path("M 10 140 H 270") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0) should be [path("M 50 60 H 70")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (0.5) should be [path("M 30 100 H 170")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70")] to [path("M 10 140 H 270") margin-box] at (1) should be [path("M 10 140 H 270")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0) should be [path("M 50 60 H 70") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0.5) should be [path("M 30 100 H 170") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (1) should be [path("M 10 140 H 270") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0) should be [path("M 50 60 H 70") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0.5) should be [path("M 30 100 H 170") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (1) should be [path("M 10 140 H 270") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0) should be [path("M 50 60 H 70") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0.5) should be [path("M 30 100 H 170") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (1) should be [path("M 10 140 H 270") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0) should be [path("M 50 60 H 70") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (0.5) should be [path("M 30 100 H 170") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 50 60 H 70") border-box] to [path("M 10 140 H 270") border-box] at (1) should be [path("M 10 140 H 270") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.3) should be [path("M 10 10 L 20 20 Z") border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (0.6) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") border-box] to [path("M 50 50 L 60 60 Z") padding-box] at (1.5) should be [path("M 50 50 L 60 60 Z") padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (-0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.3) should be [path("M 10 10 L 20 20 Z") content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (0.6) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 10 10 L 20 20 Z") content-box] to [path("M 50 50 L 60 60 Z") margin-box] at (1.5) should be [path("M 50 50 L 60 60 Z") margin-box] assert_true: 'from' value should be supported expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation.html new file mode 100644 index 000000000000..bd4797ac1981 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation.html @@ -0,0 +1,211 @@ + + +shape-outside: path() interpolation + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation-expected.txt new file mode 100644 index 000000000000..25db24256c1d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation-expected.txt @@ -0,0 +1,548 @@ + +FAIL CSS Transitions: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (-0.3) should be [shape(from 8px 5px, line to 7px 7%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0.6) should be [shape(from -1px 5px, line to 16px 16%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1) should be [shape(from -5px 5px, line to 20px 20%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1.5) should be [shape(from -10px 5px, line to 25px 25%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (-0.3) should be [shape(from 8px 5px, line to 7px 7%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0.6) should be [shape(from -1px 5px, line to 16px 16%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1) should be [shape(from -5px 5px, line to 20px 20%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1.5) should be [shape(from -10px 5px, line to 25px 25%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (-0.3) should be [shape(from 8px 5px, line to 7px 7%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0.6) should be [shape(from -1px 5px, line to 16px 16%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1) should be [shape(from -5px 5px, line to 20px 20%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1.5) should be [shape(from -10px 5px, line to 25px 25%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (-0.3) should be [shape(from 8px 5px, line to 7px 7%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (0.6) should be [shape(from -1px 5px, line to 16px 16%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1) should be [shape(from -5px 5px, line to 20px 20%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from neutral to [shape(from -5px 5px, line to 20px 20%)] at (1.5) should be [shape(from -10px 5px, line to 25px 25%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (-0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.3) should be [initial] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (0.6) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [initial] to [shape(from 5px 5px, line to 10px 10%)] at (1.5) should be [shape(from 5px 5px, line to 10px 10%)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (-0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (0) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.3) should be [unset] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [unset] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (-0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (0) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (0.3) should be [none] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [none] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (-0.3) should be [shape(from calc(-4.5% - 6.5px) 2px, move to 0.5% 4.3px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0) should be [shape(from calc(0% - 5px) 5px, move to 5% 1px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0.5) should be [shape(from calc(7.5% - 2.5px) 10px, move to 12.5% -4.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1) should be [shape(from 15% 15px, move to 20% -10px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1.5) should be [shape(from calc(22.5% + 2.5px) 20px, move to 27.5% -15.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (-0.3) should be [shape(from calc(-4.5% - 6.5px) 2px, move to 0.5% 4.3px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0) should be [shape(from calc(0% - 5px) 5px, move to 5% 1px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0.5) should be [shape(from calc(7.5% - 2.5px) 10px, move to 12.5% -4.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1) should be [shape(from 15% 15px, move to 20% -10px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1.5) should be [shape(from calc(22.5% + 2.5px) 20px, move to 27.5% -15.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (-0.3) should be [shape(from calc(-4.5% - 6.5px) 2px, move to 0.5% 4.3px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0) should be [shape(from calc(0% - 5px) 5px, move to 5% 1px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0.5) should be [shape(from calc(7.5% - 2.5px) 10px, move to 12.5% -4.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1) should be [shape(from 15% 15px, move to 20% -10px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1.5) should be [shape(from calc(22.5% + 2.5px) 20px, move to 27.5% -15.5px)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (-0.3) should be [shape(from calc(-4.5% - 6.5px) 2px, move to 0.5% 4.3px)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0) should be [shape(from calc(0% - 5px) 5px, move to 5% 1px)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (0.5) should be [shape(from calc(7.5% - 2.5px) 10px, move to 12.5% -4.5px)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1) should be [shape(from 15% 15px, move to 20% -10px)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property from [inherit] to [shape(from 15% 15px, move to 20% -10px)] at (1.5) should be [shape(from calc(22.5% + 2.5px) 20px, move to 27.5% -15.5px)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (-0.3) should be [shape(from 2% 2px, hline to -1%, vline to -2px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0) should be [shape(from 5% 5px, hline to 5%, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0.5) should be [shape(from 10% 10px, hline to 15%, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1) should be [shape(from 15% 15px, hline to 25%, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1.5) should be [shape(from 20% 20px, hline to 35%, vline to -20px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (-0.3) should be [shape(from 2% 2px, hline to -1%, vline to -2px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0) should be [shape(from 5% 5px, hline to 5%, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0.5) should be [shape(from 10% 10px, hline to 15%, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1) should be [shape(from 15% 15px, hline to 25%, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1.5) should be [shape(from 20% 20px, hline to 35%, vline to -20px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (-0.3) should be [shape(from 2% 2px, hline to -1%, vline to -2px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0) should be [shape(from 5% 5px, hline to 5%, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0.5) should be [shape(from 10% 10px, hline to 15%, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1) should be [shape(from 15% 15px, hline to 25%, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1.5) should be [shape(from 20% 20px, hline to 35%, vline to -20px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (-0.3) should be [shape(from 2% 2px, hline to -1%, vline to -2px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0) should be [shape(from 5% 5px, hline to 5%, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (0.5) should be [shape(from 10% 10px, hline to 15%, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1) should be [shape(from 15% 15px, hline to 25%, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, hline to 5%, vline to -5px, close)] to [shape(from 15% 15px, hline to 25%, vline to -15px, close)] at (1.5) should be [shape(from 20% 20px, hline to 35%, vline to -20px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve to 15% 5px with 5% 70px, curve to 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve to 15% 5px with 5% 70px, curve to 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve to 15% 5px with 5% 70px, curve to 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve to 15% 5px with 5% 70px, curve to 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve to 10% 10px with 0% 80px, curve to 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve to 20% 0px with 10% 60px, curve to 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0) should be [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0.5) should be [shape(from 10% 10px, smooth to 15% 5px with 5% 70px, smooth to 25% 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (1) should be [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0) should be [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0.5) should be [shape(from 10% 10px, smooth to 15% 5px with 5% 70px, smooth to 25% 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (1) should be [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0) should be [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0.5) should be [shape(from 10% 10px, smooth to 15% 5px with 5% 70px, smooth to 25% 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (1) should be [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0) should be [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (0.5) should be [shape(from 10% 10px, smooth to 15% 5px with 5% 70px, smooth to 25% 25px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, smooth to 10% 10px with 0% 80px, smooth to 30% 20px)] to [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] at (1) should be [shape(from 15% 15px, smooth to 20% 0px with 10% 60px, smooth to 20% 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0) should be [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0.5) should be [shape(from 10% 10px, arc to 10% -20px of 15px 25px ccw small, arc by 20% -10px of 25px 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (1) should be [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px rotate 270deg cw small, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0) should be [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0.5) should be [shape(from 10% 10px, arc to 10% -20px of 15px 25px ccw small, arc by 20% -10px of 25px 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (1) should be [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px rotate 270deg cw small, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0) should be [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0.5) should be [shape(from 10% 10px, arc to 10% -20px of 15px 25px ccw small, arc by 20% -10px of 25px 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (1) should be [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px rotate 270deg cw small, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0) should be [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (0.5) should be [shape(from 10% 10px, arc to 10% -20px of 15px 25px ccw small, arc by 20% -10px of 25px 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)] to [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)] at (1) should be [shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px rotate 270deg cw small, arc to 25% 20px of 10px 5px cw small)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve by 15% 5px with 5% 70px, curve by 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve by 15% 5px with 5% 70px, curve by 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve by 15% 5px with 5% 70px, curve by 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0) should be [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (0.5) should be [shape(from 10% 10px, curve by 15% 5px with 5% 70px, curve by 25% 25px with 25% 45px / 10% 85px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5% 5px, curve by 10% 10px with 0% 80px, curve by 30% 20px with 20% 50px / 25% 70px)] to [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] at (1) should be [shape(from 15% 15px, curve by 20% 0px with 10% 60px, curve by 20% 30px with 30% 40px / -5% 100px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (-0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.3) should be [shape(from 5px 5px, line to 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (0.6) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10px)] to [shape(from 5px 5px, line by 10px 10px)] at (1.5) should be [shape(from 5px 5px, line by 10px 10px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close)] to [path("M 15 15 H 25 V -15 Z")] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0) should be [shape(from 5px 5px, smooth by 10px 10px with 0px 80px, smooth by 30px 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0.5) should be [shape(from 10px 10px, smooth by 15px 5px with 5px 70px, smooth by 25px 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (1) should be [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0) should be [shape(from 5px 5px, smooth by 10px 10px with 0px 80px, smooth by 30px 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0.5) should be [shape(from 10px 10px, smooth by 15px 5px with 5px 70px, smooth by 25px 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (1) should be [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0) should be [shape(from 5px 5px, smooth by 10px 10px with 0px 80px, smooth by 30px 20px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0.5) should be [shape(from 10px 10px, smooth by 15px 5px with 5px 70px, smooth by 25px 25px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (1) should be [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0) should be [shape(from 5px 5px, smooth by 10px 10px with 0px 80px, smooth by 30px 20px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (0.5) should be [shape(from 10px 10px, smooth by 15px 5px with 5px 70px, smooth by 25px 25px)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M 5 5 s 0 80 10 10 t 30 20")] to [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] at (1) should be [shape(from 15px 15px, smooth by 20px 0px with 10px 60px, smooth by 20px 30px)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (-0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.3) should be [shape(from 10px 10px, move to 10% 10%)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (0.6) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 10px 10px, move to 10% 10%)] to [path("M10 10 z")] at (1.5) should be [path("M10 10 z")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (-0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.3) should be [path("M10 10 M10 10")] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (0.6) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [path("M10 10 M10 10")] to [shape(from 10px 10px, close)] at (1.5) should be [shape(from 10px 10px, close)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from 0px 5px, line to 15px 15%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from 0px 5px, line to 15px 15%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from 0px 5px, line to 15px 15%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from 0px 5px, line to 15px 15%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) padding-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) border-box] to [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0) should be [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (0.5) should be [shape(from 10px 10px, hline to 15px, vline to -10px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, hline to 5px, vline to -5px, close) margin-box] to [path("M 15 15 H 25 V -15 Z") margin-box] at (1) should be [shape(from 15px 15px, hline to 25px, vline to -15px, close) margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) border-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (0.6) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) border-box] to [shape(from -5px 5px, line to 20px 20%) padding-box] at (1.5) should be [shape(from -5px 5px, line to 20px 20%) padding-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-behavior:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (-0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.3) should be [shape(from 5px 5px, line to 10px 10%) content-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (0.6) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property from [shape(from 5px 5px, line to 10px 10%) content-box] to [path("M 5 5 L 10 10") margin-box] at (1.5) should be [path("M 5 5 L 10 10") margin-box] assert_true: 'from' value should be supported expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation.html new file mode 100644 index 000000000000..7e6715ed477b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation.html @@ -0,0 +1,218 @@ + + +shape-outside: shape() interpolation + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/w3c-import.log index d8f28b7ea419..000d1a246048 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/w3c-import.log @@ -20,3 +20,5 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-margin-interpolation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-path-interpolation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/animation/shape-outside-shape-interpolation.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization-expected.txt index 1b2f556c4a25..75e1d9fa2fc6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization-expected.txt @@ -1,29 +1,29 @@ -FAIL Serialization of basic shapes assert_equals: circle(at left bottom) expected "circle(at 0% 100%)" but got "circle(at left bottom)" -FAIL Serialization of basic shapes 1 assert_equals: circle(at bottom left) expected "circle(at 0% 100%)" but got "circle(at left bottom)" -FAIL Serialization of basic shapes 2 assert_equals: circle(at right calc(10% + 5px)) expected "circle(at 100% calc(10% + 5px))" but got "circle(at right calc(10% + 5px))" -FAIL Serialization of basic shapes 3 assert_equals: ellipse(at left bottom) expected "ellipse(at 0% 100%)" but got "ellipse(at left bottom)" -FAIL Serialization of basic shapes 4 assert_equals: ellipse(at bottom left) expected "ellipse(at 0% 100%)" but got "ellipse(at left bottom)" -FAIL Serialization of basic shapes 5 assert_equals: ellipse(at right calc(10% + 5px)) expected "ellipse(at 100% calc(10% + 5px))" but got "ellipse(at right calc(10% + 5px))" +PASS Serialization of basic shapes +PASS Serialization of basic shapes 1 +PASS Serialization of basic shapes 2 +PASS Serialization of basic shapes 3 +PASS Serialization of basic shapes 4 +PASS Serialization of basic shapes 5 PASS Serialization of basic shapes 6 PASS Serialization of basic shapes 7 PASS Serialization of basic shapes 8 PASS Serialization of basic shapes 9 PASS Serialization of basic shapes 10 PASS Serialization of basic shapes 11 -FAIL Serialization of basic shapes 12 assert_equals: circle(at top 0% right 5px) expected "circle(at calc(100% - 5px) 0%)" but got "circle(at right 5px top 0%)" -FAIL Serialization of basic shapes 13 assert_equals: ellipse(at top 0% right 10px) expected "ellipse(at calc(100% - 10px) 0%)" but got "ellipse(at right 10px top 0%)" -FAIL Serialization of basic shapes 14 assert_equals: circle(closest-side at center) expected "circle(at 50% 50%)" but got "circle(at center center)" -FAIL Serialization of basic shapes 15 assert_equals: ellipse(closest-side closest-side at center) expected "ellipse(at 50% 50%)" but got "ellipse(at center center)" -FAIL Serialization of basic shapes 16 assert_equals: circle(farthest-side at center) expected "circle(farthest-side at 50% 50%)" but got "circle(farthest-side at center center)" -FAIL Serialization of basic shapes 17 assert_equals: circle(10px at center) expected "circle(10px at 50% 50%)" but got "circle(10px at center center)" -FAIL Serialization of basic shapes 18 assert_equals: ellipse(farthest-side 10px at center) expected "ellipse(farthest-side 10px at 50% 50%)" but got "ellipse(farthest-side 10px at center center)" +PASS Serialization of basic shapes 12 +PASS Serialization of basic shapes 13 +PASS Serialization of basic shapes 14 +PASS Serialization of basic shapes 15 +PASS Serialization of basic shapes 16 +PASS Serialization of basic shapes 17 +PASS Serialization of basic shapes 18 PASS Serialization of basic shapes 19 PASS Serialization of basic shapes 20 -FAIL Serialization of basic shapes 21 assert_equals: circle(at right 5px bottom 10px) expected "circle(at calc(100% - 5px) calc(100% - 10px))" but got "circle(at right 5px bottom 10px)" -FAIL Serialization of basic shapes 22 assert_equals: ellipse(at right 5px bottom 10px) expected "ellipse(at calc(100% - 5px) calc(100% - 10px))" but got "ellipse(at right 5px bottom 10px)" -FAIL Serialization of basic shapes 23 assert_equals: circle(at right 5% top 0px) expected "circle(at calc(95%) 0px)" but got "circle(at right 5% top 0px)" -FAIL Serialization of basic shapes 24 assert_equals: ellipse(at right 5% top 0px) expected "ellipse(at calc(95%) 0px)" but got "ellipse(at right 5% top 0px)" -FAIL Serialization of basic shapes 25 assert_equals: circle(at right calc(10% + 5px) bottom calc(10% + 5px)) expected "circle(at calc(90% - 5px) calc(90% - 5px))" but got "circle(at right calc(10% + 5px) bottom calc(10% + 5px))" -FAIL Serialization of basic shapes 26 assert_equals: ellipse(at right calc(10% + 5px) bottom calc(10% + 5px)) expected "ellipse(at calc(90% - 5px) calc(90% - 5px))" but got "ellipse(at right calc(10% + 5px) bottom calc(10% + 5px))" +PASS Serialization of basic shapes 21 +PASS Serialization of basic shapes 22 +PASS Serialization of basic shapes 23 +PASS Serialization of basic shapes 24 +PASS Serialization of basic shapes 25 +PASS Serialization of basic shapes 26 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization.html index 0b7a7bb3ccdb..9078bf3d0f70 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/basic-shape-circle-ellipse-serialization.html @@ -14,15 +14,14 @@ }); } -// Keywords get replaced by percentages in 2-value form -checkEquals("circle(at left bottom)", "circle(at 0% 100%)"); -checkEquals("circle(at bottom left)", "circle(at 0% 100%)"); +checkEquals("circle(at left bottom)", "circle(at left bottom)"); +checkEquals("circle(at bottom left)", "circle(at left bottom)"); checkEquals("circle(at right calc(10% + 5px))", - "circle(at 100% calc(10% + 5px))"); -checkEquals("ellipse(at left bottom)", "ellipse(at 0% 100%)"); -checkEquals("ellipse(at bottom left)", "ellipse(at 0% 100%)"); + "circle(at right calc(10% + 5px))"); +checkEquals("ellipse(at left bottom)", "ellipse(at left bottom)"); +checkEquals("ellipse(at bottom left)", "ellipse(at left bottom)"); checkEquals("ellipse(at right calc(10% + 5px))", - "ellipse(at 100% calc(10% + 5px))"); + "ellipse(at right calc(10% + 5px))"); // Only 2 or 4 value form allowed checkEquals("circle()", "circle()"); @@ -35,21 +34,21 @@ "ellipse(closest-side farthest-side)"); -checkEquals("circle(at top 0% right 5px)", "circle(at calc(100% - 5px) 0%)"); -checkEquals("ellipse(at top 0% right 10px)", "ellipse(at calc(100% - 10px) 0%)"); +checkEquals("circle(at top 0% right 5px)", "circle(at right 5px top 0%)"); +checkEquals("ellipse(at top 0% right 10px)", "ellipse(at right 10px top 0%)"); // Remove defaults like closest-side checkEquals("circle(closest-side at center)", - "circle(at 50% 50%)"); + "circle(at center center)"); checkEquals("ellipse(closest-side closest-side at center)", - "ellipse(at 50% 50%)"); + "ellipse(at center center)"); // don't remove non defaults checkEquals("circle(farthest-side at center)", - "circle(farthest-side at 50% 50%)"); + "circle(farthest-side at center center)"); checkEquals("circle(10px at center)", - "circle(10px at 50% 50%)"); + "circle(10px at center center)"); checkEquals("ellipse(farthest-side 10px at center)", - "ellipse(farthest-side 10px at 50% 50%)"); + "ellipse(farthest-side 10px at center center)"); // Ellipse can have 0 radii or two, not one. We cannot // eliminate a single closest-side if the other is different checkEquals("ellipse(closest-side farthest-side at 50% 50%)", @@ -57,19 +56,17 @@ checkEquals("ellipse(closest-side 10% at 50% 50%)", "ellipse(closest-side 10% at 50% 50%)"); - // Transform to . + // Preserve 4-value positions as-is. checkEquals("circle(at right 5px bottom 10px)", - "circle(at calc(100% - 5px) calc(100% - 10px))"); + "circle(at right 5px bottom 10px)"); checkEquals("ellipse(at right 5px bottom 10px)", - "ellipse(at calc(100% - 5px) calc(100% - 10px))"); + "ellipse(at right 5px bottom 10px)"); -// Don't convert zero lengths to 0% -checkEquals("circle(at right 5% top 0px)", "circle(at calc(95%) 0px)"); -checkEquals("ellipse(at right 5% top 0px)", "ellipse(at calc(95%) 0px)"); +checkEquals("circle(at right 5% top 0px)", "circle(at right 5% top 0px)"); +checkEquals("ellipse(at right 5% top 0px)", "ellipse(at right 5% top 0px)"); -// Transform calcs checkEquals("circle(at right calc(10% + 5px) bottom calc(10% + 5px))", - "circle(at calc(90% - 5px) calc(90% - 5px))"); + "circle(at right calc(10% + 5px) bottom calc(10% + 5px))"); checkEquals("ellipse(at right calc(10% + 5px) bottom calc(10% + 5px))", - "ellipse(at calc(90% - 5px) calc(90% - 5px))"); + "ellipse(at right calc(10% + 5px) bottom calc(10% + 5px))"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt index 673c7bc613d5..6882229b745f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt @@ -14,4 +14,17 @@ PASS Property shape-outside value 'ellipse(calc(10px - 0.5em) calc(10px + 0.5em) PASS Property shape-outside value 'polygon(evenodd, -10px -20px, -30px -40px, -50px -60px) margin-box' PASS Property shape-outside value 'polygon(10% 20%, 30% 40%, 50% 60%) content-box' PASS Property shape-outside value 'polygon(calc(10px - 0.5em) 20%, 30% 40%, 50% calc(10px - 0.5em))' +FAIL Property shape-outside value 'path('M 10 10 h 80 v 80 h -80 Z')' assert_true: 'path('M 10 10 h 80 v 80 h -80 Z')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path('M10,10h80v80h-80z')' assert_true: 'path('M10,10h80v80h-80z')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50z')' assert_true: 'path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50z')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path(nonzero, 'M10,10h80v80h-80z')' assert_true: 'path(nonzero, 'M10,10h80v80h-80z')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path('M0,0L100,0L100,100Z')' assert_true: 'path('M0,0L100,0L100,100Z')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path('M0,0C30,60,70,60,100,0')' assert_true: 'path('M0,0C30,60,70,60,100,0')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path('M0,0Q50,100,100,0')' assert_true: 'path('M0,0Q50,100,100,0')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'path('M0,0A25,25,0,0,1,50,0')' assert_true: 'path('M0,0A25,25,0,0,1,50,0')' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'shape(from 20px 40px, line to 20px 30px)' assert_true: 'shape(from 20px 40px, line to 20px 30px)' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'shape(from 0 0, line to 100% 100%)' assert_true: 'shape(from 0 0, line to 100% 100%)' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'shape(from 20px 40px, smooth to center 20%)' assert_true: 'shape(from 20px 40px, smooth to center 20%)' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'shape(from 20px 40px, line to 100px 40px, line to 100px 100px, close)' assert_true: 'shape(from 20px 40px, line to 100px 40px, line to 100px 100px, close)' is a supported value for shape-outside. expected true got false +FAIL Property shape-outside value 'shape(from 1em 2em, line to 3em 1em)' assert_true: 'shape(from 1em 2em, line to 3em 1em)' is a supported value for shape-outside. expected true got false diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed.html index b56c19e9e560..c40082d3e93e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed.html @@ -38,6 +38,21 @@ test_computed_value("shape-outside", "polygon(evenodd, -10px -20px, -30px -40px, -50px -60px) margin-box", "polygon(evenodd, -10px -20px, -30px -40px, -50px -60px)"); test_computed_value("shape-outside", "polygon(10% 20%, 30% 40%, 50% 60%) content-box"); test_computed_value("shape-outside", "polygon(calc(10px - 0.5em) 20%, 30% 40%, 50% calc(10px - 0.5em))", "polygon(-10px 20%, 30% 40%, 50% -10px)"); + +test_computed_value("shape-outside", "path('M 10 10 h 80 v 80 h -80 Z')", 'path("M 10 10 H 90 V 90 H 10 Z")'); +test_computed_value("shape-outside", "path('M10,10h80v80h-80z')", 'path("M 10 10 H 90 V 90 H 10 Z")'); +test_computed_value("shape-outside", "path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50z')", 'path(evenodd, "M 10 10 H 90 V 90 H 10 Z M 25 25 H 75 V 75 H 25 Z")'); +test_computed_value("shape-outside", "path(nonzero, 'M10,10h80v80h-80z')", 'path("M 10 10 H 90 V 90 H 10 Z")'); +test_computed_value("shape-outside", "path('M0,0L100,0L100,100Z')", 'path("M 0 0 L 100 0 L 100 100 Z")'); +test_computed_value("shape-outside", "path('M0,0C30,60,70,60,100,0')", 'path("M 0 0 C 30 60 70 60 100 0")'); +test_computed_value("shape-outside", "path('M0,0Q50,100,100,0')", 'path("M 0 0 Q 50 100 100 0")'); +test_computed_value("shape-outside", "path('M0,0A25,25,0,0,1,50,0')", 'path("M 0 0 A 25 25 0 0 1 50 0")'); + +test_computed_value("shape-outside", "shape(from 20px 40px, line to 20px 30px)"); +test_computed_value("shape-outside", "shape(from 0 0, line to 100% 100%)", "shape(from 0px 0px, line to 100% 100%)"); +test_computed_value("shape-outside", "shape(from 20px 40px, smooth to center 20%)", "shape(from 20px 40px, smooth to 50% 20%)"); +test_computed_value("shape-outside", "shape(from 20px 40px, line to 100px 40px, line to 100px 100px, close)"); +test_computed_value("shape-outside", "shape(from 1em 2em, line to 3em 1em)", "shape(from 40px 80px, line to 120px 40px)"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid-expected.txt new file mode 100644 index 000000000000..99d6677ad7af --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid-expected.txt @@ -0,0 +1,9 @@ + +PASS e.style['shape-outside'] = "path()" should not set the property value +PASS e.style['shape-outside'] = "path('')" should not set the property value +PASS e.style['shape-outside'] = "path(evenodd)" should not set the property value +PASS e.style['shape-outside'] = "path(evenodd, 'not-a-path')" should not set the property value +PASS e.style['shape-outside'] = "path(badfillrule, 'M10,10')" should not set the property value +PASS e.style['shape-outside'] = "path(10, 20)" should not set the property value +PASS e.style['shape-outside'] = "path('M10,10', evenodd)" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid.html new file mode 100644 index 000000000000..6273a8cccb14 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid.html @@ -0,0 +1,18 @@ + +CSS Shapes Module Level 1: parsing shape-outside with invalid path() values + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid-expected.txt new file mode 100644 index 000000000000..a9cb8fee49b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid-expected.txt @@ -0,0 +1,11 @@ + +FAIL e.style['shape-outside'] = "path('M 10 10 h 80 v 80 h -80 Z')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path('M10,10h80v80h-80z')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50z')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path(nonzero, 'M10,10h80v80h-80z')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path('M0,0L100,0L100,100Z')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path('M0,0C30,60,70,60,100,0')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path('M0,0Q50,100,100,0')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path('M0,0A25,25,0,0,1,50,0')" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50')" should set the property value assert_not_equals: property should be set got disallowed value "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid.html new file mode 100644 index 000000000000..268369c5410a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid.html @@ -0,0 +1,20 @@ + +CSS Shapes Module Level 1: parsing shape-outside with valid path() values + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid-expected.txt new file mode 100644 index 000000000000..f12378ef541c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid-expected.txt @@ -0,0 +1,11 @@ + +PASS e.style['shape-outside'] = "shape(from 20px 40px line to 20px 30px)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px line to 20px 30px,)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px, 40px, line to 20px, 30px)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, move to 20px 30px, hline to top)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, move to 20px 30px, vline to left)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, curve to 20px 20px, using 10px 30px)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, curve to 20px 20px with 10px 30px 12px 32px)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, arc by 20px 20px of 10% 20% small large)" should not set the property value +PASS e.style['shape-outside'] = "shape(from 20px 40px, arc by 20px 20px of 10% 20% cw ccw)" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid.html new file mode 100644 index 000000000000..9353111149f1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid.html @@ -0,0 +1,20 @@ + +CSS Shapes Module Level 2: parsing shape-outside with invalid shape() values + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid-expected.txt new file mode 100644 index 000000000000..fef97c430686 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid-expected.txt @@ -0,0 +1,14 @@ + +FAIL e.style['shape-outside'] = "shape(from 20px 40px, line to 20px 30px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 0 0, line to 100% 100%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, move to 20px 30px, line by 20px 30px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, move to 20px 30px, hline to 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, move to 20px 30px, vline to 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, curve to 20px 20px with 10px 30px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, curve to 10% 20% with 10px 30px / 12px 32px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, smooth to center 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, arc by 20px 20px of 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, arc by 20px 20px of 10% 20% cw large)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, arc by 20px 20px of 10% 20% cw rotate 12deg)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['shape-outside'] = "shape(from 20px 40px, line to 100px 40px, line to 100px 100px, close)" should set the property value assert_not_equals: property should be set got disallowed value "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid.html new file mode 100644 index 000000000000..0ecb7f641643 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid.html @@ -0,0 +1,23 @@ + +CSS Shapes Module Level 2: parsing shape-outside with valid shape() values + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position-expected.txt index e96802ccdb87..5932687ade85 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position-expected.txt @@ -1,22 +1,22 @@ -FAIL e.style['shape-outside'] = "circle(at 10%)" should set the property value assert_equals: serialization should be canonical expected "circle(at 10% 50%)" but got "circle(at 10% center)" +PASS e.style['shape-outside'] = "circle(at 10%)" should set the property value PASS e.style['shape-outside'] = "circle(at 20% 30px)" should set the property value -FAIL e.style['shape-outside'] = "circle(at 30px center)" should set the property value assert_equals: serialization should be canonical expected "circle(at 30px 50%)" but got "circle(at 30px center)" -FAIL e.style['shape-outside'] = "circle(at 40px top)" should set the property value assert_equals: serialization should be canonical expected "circle(at 40px 0%)" but got "circle(at 40px top)" -FAIL e.style['shape-outside'] = "circle(at bottom 10% right 20%)" should set the property value assert_equals: serialization should be canonical expected "circle(at calc(80%) calc(90%))" but got "circle(at right 20% bottom 10%)" -FAIL e.style['shape-outside'] = "circle(at bottom right)" should set the property value assert_equals: serialization should be canonical expected "circle(at 100% 100%)" but got "circle(at right bottom)" -FAIL e.style['shape-outside'] = "circle(at center)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 50%)" but got "circle(at center center)" -FAIL e.style['shape-outside'] = "circle(at center 50px)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 50px)" but got "circle(at center 50px)" -FAIL e.style['shape-outside'] = "circle(at center bottom)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 100%)" but got "circle(at center bottom)" -FAIL e.style['shape-outside'] = "circle(at center center)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 50%)" but got "circle(at center center)" -FAIL e.style['shape-outside'] = "circle(at center left)" should set the property value assert_equals: serialization should be canonical expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL e.style['shape-outside'] = "circle(at left)" should set the property value assert_equals: serialization should be canonical expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL e.style['shape-outside'] = "circle(at left bottom)" should set the property value assert_equals: serialization should be canonical expected "circle(at 0% 100%)" but got "circle(at left bottom)" -FAIL e.style['shape-outside'] = "circle(at left center)" should set the property value assert_equals: serialization should be canonical expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL e.style['shape-outside'] = "circle(at right 40%)" should set the property value assert_equals: serialization should be canonical expected "circle(at 100% 40%)" but got "circle(at right 40%)" -FAIL e.style['shape-outside'] = "circle(at right 30% top 60px)" should set the property value assert_equals: serialization should be canonical expected "circle(at calc(70%) 60px)" but got "circle(at right 30% top 60px)" -FAIL e.style['shape-outside'] = "circle(at top)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 0%)" but got "circle(at center top)" -FAIL e.style['shape-outside'] = "circle(at top center)" should set the property value assert_equals: serialization should be canonical expected "circle(at 50% 0%)" but got "circle(at center top)" -FAIL e.style['shape-outside'] = "circle(at top 0% right calc(10% * sign(1em - 1px)))" should set the property value assert_equals: serialization should be canonical expected "circle(at calc(100% - (10% * sign(1em - 1px))) 0%)" but got "circle(at right calc(10% * sign(1em - 1px)) top 0%)" -FAIL e.style['shape-outside'] = "circle(at top 0% right calc(10% * sibling-index()))" should set the property value assert_equals: serialization should be canonical expected "circle(at calc(100% - (10% * sibling-index())) 0%)" but got "circle(at right calc(10% * sibling-index()) top 0%)" +PASS e.style['shape-outside'] = "circle(at 30px center)" should set the property value +PASS e.style['shape-outside'] = "circle(at 40px top)" should set the property value +PASS e.style['shape-outside'] = "circle(at bottom 10% right 20%)" should set the property value +PASS e.style['shape-outside'] = "circle(at bottom right)" should set the property value +PASS e.style['shape-outside'] = "circle(at center)" should set the property value +PASS e.style['shape-outside'] = "circle(at center 50px)" should set the property value +PASS e.style['shape-outside'] = "circle(at center bottom)" should set the property value +PASS e.style['shape-outside'] = "circle(at center center)" should set the property value +PASS e.style['shape-outside'] = "circle(at center left)" should set the property value +PASS e.style['shape-outside'] = "circle(at left)" should set the property value +PASS e.style['shape-outside'] = "circle(at left bottom)" should set the property value +PASS e.style['shape-outside'] = "circle(at left center)" should set the property value +PASS e.style['shape-outside'] = "circle(at right 40%)" should set the property value +PASS e.style['shape-outside'] = "circle(at right 30% top 60px)" should set the property value +PASS e.style['shape-outside'] = "circle(at top)" should set the property value +PASS e.style['shape-outside'] = "circle(at top center)" should set the property value +PASS e.style['shape-outside'] = "circle(at top 0% right calc(10% * sign(1em - 1px)))" should set the property value +PASS e.style['shape-outside'] = "circle(at top 0% right calc(10% * sibling-index()))" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position.html index 5a23d4f59866..25dcad612e8f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position.html @@ -13,26 +13,26 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/w3c-import.log index a655c383ef50..703a6f9e679a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/w3c-import.log @@ -23,4 +23,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-margin-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-invalid-position.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-path-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-shape-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-valid-position.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/WEB_FEATURES.yml index c9bd67566900..e9492e27120f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/WEB_FEATURES.yml @@ -3,6 +3,16 @@ features: files: - '*' - '!path-function-*' + - '!shape-function-*' + - '!rect-function-*' + - '!xywh-function-*' - name: path-shape files: - 'path-function-*' +- name: shape-function + files: + - shape-function-* +- name: rect-xywh + files: + - rect-function-* + - xywh-function-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision-expected.txt new file mode 100644 index 000000000000..850dc3df2948 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision-expected.txt @@ -0,0 +1,3 @@ + +PASS Test that path() with different wind rules does not collide in the Matched Properties Cache + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision.html new file mode 100644 index 000000000000..4ffd83a33103 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision.html @@ -0,0 +1,36 @@ + + + + +CSS Shapes Module Level 1: path() function cache collision + + + + + + + + +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-expected.html new file mode 100644 index 000000000000..063f1efc676b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-expected.html @@ -0,0 +1,44 @@ + +CSS Shapes: polygon() rounding clamping reference + +

    The test passes if all five shapes match their references.

    +
    +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-ref.html new file mode 100644 index 000000000000..063f1efc676b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-ref.html @@ -0,0 +1,44 @@ + +CSS Shapes: polygon() rounding clamping reference + +

    The test passes if all five shapes match their references.

    +
    +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp.html new file mode 100644 index 000000000000..1c7620c8bb96 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp.html @@ -0,0 +1,49 @@ + +CSS Shapes: polygon() rounding clamping + + + + + + +

    The test passes if all five shapes match their references.

    +
    +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/w3c-import.log index 1e115d4b99ef..cf3c7510f5b3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/w3c-import.log @@ -24,11 +24,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/inset-function-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/inset-function-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/inset-function-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed-collision.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/path-function-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-rounding-clamp.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/polygon-function-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/rect-function-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-functions/rect-function-invalid.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect-expected.html new file mode 100644 index 000000000000..2b0fabbda7a4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect-expected.html @@ -0,0 +1,22 @@ + + +Reference for retrying floats and pushing them partway down the float area + + + + +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect.html new file mode 100644 index 000000000000..c7e229e58400 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect.html @@ -0,0 +1,35 @@ + + +Retry inline floats until they fit -- rect + + + + + + +
    +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh-expected.html new file mode 100644 index 000000000000..2b0fabbda7a4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh-expected.html @@ -0,0 +1,22 @@ + + +Reference for retrying floats and pushing them partway down the float area + + + + +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh.html new file mode 100644 index 000000000000..e0c303e26cca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh.html @@ -0,0 +1,35 @@ + + +Retry inline floats until they fit -- xywh + + + + + + +
    +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/w3c-import.log index 01e50abd5bb1..efa2540444f1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/w3c-import.log @@ -22,5 +22,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-inset.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-polygon-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-polygon.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-rect.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-retry-push-xywh.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-should-push-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/assorted/float-should-push.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-000-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-000-ref.html index a5752dc1be89..7e6fb57678c5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-000-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/reference/shape-image-000-ref.html @@ -25,7 +25,7 @@ The test passes if you see a solid green square. There should be no red.

    - +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-000-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-000-expected.html index 240b258c89fe..7e6fb57678c5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-000-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-000-expected.html @@ -25,7 +25,7 @@ The test passes if you see a solid green square. There should be no red.

    - +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004-expected.html index 240b258c89fe..7e6fb57678c5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004-expected.html @@ -25,7 +25,7 @@ The test passes if you see a solid green square. There should be no red.

    - +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004.html index 117f3a8e2cc8..5871d82bfd7f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-004.html @@ -23,7 +23,7 @@ } #image { float: left; - shape-outside: url("support/left-half-rectangle-50.png"); + shape-outside: url("/images/left-half-rectangle-50.png"); shape-image-threshold: 0.6; } @@ -33,7 +33,7 @@ The test passes if you see a solid green square. There should be no red.

    - + X X
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-011.html index a1286f07bc8e..3c8a38e3065b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-011.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-011.html @@ -39,7 +39,7 @@ float: left; width: 100px; height: 100px; - shape-outside: url("support/left-half-rectangle-50.svg"); + shape-outside: url("/images/left-half-rectangle-50.svg"); shape-margin: 10px; shape-image-threshold: 0.55; } @@ -66,7 +66,7 @@ The test passes if the green rectangle on the right is completely between the two blue lines. There should be no red.

    - +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-018.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-018.html index d94a2a9d9243..1493884d94e2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-018.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-018.html @@ -1,5 +1,5 @@ - + CSS Test: right float, url(jpg), real image + shape-margin (%) @@ -44,5 +44,13 @@ X
    X
    X
    X
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-029-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-029-expected.html index 240b258c89fe..7e6fb57678c5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-029-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/shape-image-029-expected.html @@ -25,7 +25,7 @@ The test passes if you see a solid green square. There should be no red.

    - +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.png b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.png deleted file mode 100644 index c64fd71dc19d..000000000000 Binary files a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.png and /dev/null differ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.svg b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.svg deleted file mode 100644 index d0109053eb9a..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/w3c-import.log index 33290a2f6465..e936c576f5e8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/w3c-import.log @@ -17,8 +17,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/animated.gif /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-20.png /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-20.svg -/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.png -/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-50.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-70.png /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle-70.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/shape-image/support/left-half-rectangle.jpg diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-000-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-000-ref.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-000-ref.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-002-ref.html new file mode 100644 index 000000000000..60ce5c4d0421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-002-ref.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-003-ref.html new file mode 100644 index 000000000000..73c3a6fac149 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-003-ref.html @@ -0,0 +1,26 @@ + +CSS Reference File + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/w3c-import.log new file mode 100644 index 000000000000..306e4e9d1546 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/w3c-import.log @@ -0,0 +1,19 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-000-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/reference/shape-outside-path-003-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000-expected.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000.html new file mode 100644 index 000000000000..a78201f6cd34 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000.html @@ -0,0 +1,32 @@ + +CSS Test: left float, path, args in px units + + + + + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001-expected.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001.html new file mode 100644 index 000000000000..ad624d3b96c5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001.html @@ -0,0 +1,32 @@ + +CSS Test: left float, path with fill-rule evenodd + + + + + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002-expected.html new file mode 100644 index 000000000000..60ce5c4d0421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002.html new file mode 100644 index 000000000000..c57b7242b758 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002.html @@ -0,0 +1,32 @@ + +CSS Test: right float, path in px units + + + + + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003-expected.html new file mode 100644 index 000000000000..73c3a6fac149 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003-expected.html @@ -0,0 +1,26 @@ + +CSS Reference File + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003.html new file mode 100644 index 000000000000..d95d7f4b93d0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003.html @@ -0,0 +1,35 @@ + +CSS Test: left float, path() with curve commands approximating a circle + + + + + + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/w3c-import.log new file mode 100644 index 000000000000..66083e92eef4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/w3c-import.log @@ -0,0 +1,24 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-000.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/path/shape-outside-path-003.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-000-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-000-ref.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-000-ref.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-002-ref.html new file mode 100644 index 000000000000..60ce5c4d0421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-002-ref.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-003-ref.html new file mode 100644 index 000000000000..73c3a6fac149 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-003-ref.html @@ -0,0 +1,26 @@ + +CSS Reference File + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/w3c-import.log new file mode 100644 index 000000000000..064c1fd0702a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/w3c-import.log @@ -0,0 +1,19 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-000-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/reference/shape-outside-shape-003-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000-expected.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000.html new file mode 100644 index 000000000000..ebe61bc3843e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000.html @@ -0,0 +1,33 @@ + +CSS Test: left float, shape() with line commands + + + + + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001-expected.html new file mode 100644 index 000000000000..e951c622b231 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001.html new file mode 100644 index 000000000000..a2ace09d32a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001.html @@ -0,0 +1,32 @@ + +CSS Test: left float, shape() with percentage units + + + + + + + +

    The test passes if the green text lines up on the right.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002-expected.html new file mode 100644 index 000000000000..60ce5c4d0421 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002-expected.html @@ -0,0 +1,25 @@ + +CSS Reference File + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002.html new file mode 100644 index 000000000000..6654b1aa40f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002.html @@ -0,0 +1,32 @@ + +CSS Test: right float, shape() with line commands + + + + + + + +

    The test passes if the green text lines up on the left.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003-expected.html new file mode 100644 index 000000000000..73c3a6fac149 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003-expected.html @@ -0,0 +1,26 @@ + +CSS Reference File + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003.html new file mode 100644 index 000000000000..82228ea3df07 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003.html @@ -0,0 +1,35 @@ + +CSS Test: left float, shape() with curve commands approximating a circle + + + + + + + + +

    The test passes if there is no red.

    +
    +
    + XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/w3c-import.log new file mode 100644 index 000000000000..3106254273be --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/w3c-import.log @@ -0,0 +1,24 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-000.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/supported-shapes/shape/shape-outside-shape-003.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-002-expected.txt index 2354e075f1eb..4668486f7c13 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-002-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-002-expected.txt @@ -1,72 +1,72 @@ -FAIL circle(at 50%) serializes as circle(at 50% 50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at 50% center)" -FAIL circle(at 50px) serializes as circle(at 50px 50%) - inline assert_equals: expected "circle(at 50px 50%)" but got "circle(at 50px center)" +PASS circle(at 50%) serializes as circle(at 50% center) - inline +PASS circle(at 50px) serializes as circle(at 50px center) - inline PASS circle(at 50% 50%) serializes as circle(at 50% 50%) - inline PASS circle(at 50% 50px) serializes as circle(at 50% 50px) - inline PASS circle(at 50px 50%) serializes as circle(at 50px 50%) - inline PASS circle(at 50px 50px) serializes as circle(at 50px 50px) - inline -FAIL circle(at left) serializes as circle(at 0% 50%) - inline assert_equals: expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL circle(at top) serializes as circle(at 50% 0%) - inline assert_equals: expected "circle(at 50% 0%)" but got "circle(at center top)" -FAIL circle(at right) serializes as circle(at 100% 50%) - inline assert_equals: expected "circle(at 100% 50%)" but got "circle(at right center)" -FAIL circle(at bottom) serializes as circle(at 50% 100%) - inline assert_equals: expected "circle(at 50% 100%)" but got "circle(at center bottom)" -FAIL circle(at center) serializes as circle(at 50% 50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at center center)" -FAIL circle(at left top) serializes as circle(at 0% 0%) - inline assert_equals: expected "circle(at 0% 0%)" but got "circle(at left top)" -FAIL circle(at left bottom) serializes as circle(at 0% 100%) - inline assert_equals: expected "circle(at 0% 100%)" but got "circle(at left bottom)" -FAIL circle(at left center) serializes as circle(at 0% 50%) - inline assert_equals: expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL circle(at top left) serializes as circle(at 0% 0%) - inline assert_equals: expected "circle(at 0% 0%)" but got "circle(at left top)" -FAIL circle(at top right) serializes as circle(at 100% 0%) - inline assert_equals: expected "circle(at 100% 0%)" but got "circle(at right top)" -FAIL circle(at top center) serializes as circle(at 50% 0%) - inline assert_equals: expected "circle(at 50% 0%)" but got "circle(at center top)" -FAIL circle(at right top) serializes as circle(at 100% 0%) - inline assert_equals: expected "circle(at 100% 0%)" but got "circle(at right top)" -FAIL circle(at right bottom) serializes as circle(at 100% 100%) - inline assert_equals: expected "circle(at 100% 100%)" but got "circle(at right bottom)" -FAIL circle(at right center) serializes as circle(at 100% 50%) - inline assert_equals: expected "circle(at 100% 50%)" but got "circle(at right center)" -FAIL circle(at bottom left) serializes as circle(at 0% 100%) - inline assert_equals: expected "circle(at 0% 100%)" but got "circle(at left bottom)" -FAIL circle(at bottom right) serializes as circle(at 100% 100%) - inline assert_equals: expected "circle(at 100% 100%)" but got "circle(at right bottom)" -FAIL circle(at bottom center) serializes as circle(at 50% 100%) - inline assert_equals: expected "circle(at 50% 100%)" but got "circle(at center bottom)" -FAIL circle(at center top) serializes as circle(at 50% 0%) - inline assert_equals: expected "circle(at 50% 0%)" but got "circle(at center top)" -FAIL circle(at center left) serializes as circle(at 0% 50%) - inline assert_equals: expected "circle(at 0% 50%)" but got "circle(at left center)" -FAIL circle(at center right) serializes as circle(at 100% 50%) - inline assert_equals: expected "circle(at 100% 50%)" but got "circle(at right center)" -FAIL circle(at center bottom) serializes as circle(at 50% 100%) - inline assert_equals: expected "circle(at 50% 100%)" but got "circle(at center bottom)" -FAIL circle(at center center) serializes as circle(at 50% 50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at center center)" -FAIL circle(at left 50%) serializes as circle(at 0% 50%) - inline assert_equals: expected "circle(at 0% 50%)" but got "circle(at left 50%)" -FAIL circle(at left 50px) serializes as circle(at 0% 50px) - inline assert_equals: expected "circle(at 0% 50px)" but got "circle(at left 50px)" -FAIL circle(at 50% top) serializes as circle(at 50% 0%) - inline assert_equals: expected "circle(at 50% 0%)" but got "circle(at 50% top)" -FAIL circle(at 50px top) serializes as circle(at 50px 0%) - inline assert_equals: expected "circle(at 50px 0%)" but got "circle(at 50px top)" -FAIL circle(at right 80%) serializes as circle(at 100% 80%) - inline assert_equals: expected "circle(at 100% 80%)" but got "circle(at right 80%)" -FAIL circle(at right 80px) serializes as circle(at 100% 80px) - inline assert_equals: expected "circle(at 100% 80px)" but got "circle(at right 80px)" -FAIL circle(at 70% bottom) serializes as circle(at 70% 100%) - inline assert_equals: expected "circle(at 70% 100%)" but got "circle(at 70% bottom)" -FAIL circle(at 70px bottom) serializes as circle(at 70px 100%) - inline assert_equals: expected "circle(at 70px 100%)" but got "circle(at 70px bottom)" -FAIL circle(at center 60%) serializes as circle(at 50% 60%) - inline assert_equals: expected "circle(at 50% 60%)" but got "circle(at center 60%)" -FAIL circle(at center 60px) serializes as circle(at 50% 60px) - inline assert_equals: expected "circle(at 50% 60px)" but got "circle(at center 60px)" -FAIL circle(at 60% center) serializes as circle(at 60% 50%) - inline assert_equals: expected "circle(at 60% 50%)" but got "circle(at 60% center)" -FAIL circle(at 60px center) serializes as circle(at 60px 50%) - inline assert_equals: expected "circle(at 60px 50%)" but got "circle(at 60px center)" -FAIL circle(at left 50% top 50%) serializes as circle(at 50% 50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at left 50% top 50%)" -FAIL circle(at left 50% top 50px) serializes as circle(at 50% 50px) - inline assert_equals: expected "circle(at 50% 50px)" but got "circle(at left 50% top 50px)" -FAIL circle(at left 50% bottom 70%) serializes as circle(at 50% calc(30%)) - inline assert_equals: expected "circle(at 50% calc(30%))" but got "circle(at left 50% bottom 70%)" -FAIL circle(at left 50% bottom 70px) serializes as circle(at 50% calc(100% - 70px)) - inline assert_equals: expected "circle(at 50% calc(100% - 70px))" but got "circle(at left 50% bottom 70px)" -FAIL circle(at left 50px top 50%) serializes as circle(at 50px 50%) - inline assert_equals: expected "circle(at 50px 50%)" but got "circle(at left 50px top 50%)" -FAIL circle(at left 50px top 50px) serializes as circle(at 50px 50px) - inline assert_equals: expected "circle(at 50px 50px)" but got "circle(at left 50px top 50px)" -FAIL circle(at left 50px bottom 70%) serializes as circle(at 50px calc(30%)) - inline assert_equals: expected "circle(at 50px calc(30%))" but got "circle(at left 50px bottom 70%)" -FAIL circle(at top 50% left 50%) serializes as circle(at 50% 50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at left 50% top 50%)" -FAIL circle(at top 50% left 50px) serializes as circle(at 50px 50%) - inline assert_equals: expected "circle(at 50px 50%)" but got "circle(at left 50px top 50%)" -FAIL circle(at top 50% right 80%) serializes as circle(at calc(20%) 50%) - inline assert_equals: expected "circle(at calc(20%) 50%)" but got "circle(at right 80% top 50%)" -FAIL circle(at top 50% right 80px) serializes as circle(at calc(100% - 80px) 50%) - inline assert_equals: expected "circle(at calc(100% - 80px) 50%)" but got "circle(at right 80px top 50%)" -FAIL circle(at top 50px left 50%) serializes as circle(at 50% 50px) - inline assert_equals: expected "circle(at 50% 50px)" but got "circle(at left 50% top 50px)" -FAIL circle(at top 50px left 50px) serializes as circle(at 50px 50px) - inline assert_equals: expected "circle(at 50px 50px)" but got "circle(at left 50px top 50px)" -FAIL circle(at top 50px right 80%) serializes as circle(at calc(20%) 50px) - inline assert_equals: expected "circle(at calc(20%) 50px)" but got "circle(at right 80% top 50px)" -FAIL circle(at bottom 70% left 50%) serializes as circle(at 50% calc(30%)) - inline assert_equals: expected "circle(at 50% calc(30%))" but got "circle(at left 50% bottom 70%)" -FAIL circle(at bottom 70% left 50px) serializes as circle(at 50px calc(30%)) - inline assert_equals: expected "circle(at 50px calc(30%))" but got "circle(at left 50px bottom 70%)" -FAIL circle(at bottom 70% right 80%) serializes as circle(at calc(20%) calc(30%)) - inline assert_equals: expected "circle(at calc(20%) calc(30%))" but got "circle(at right 80% bottom 70%)" -FAIL circle(at bottom 70% right 80px) serializes as circle(at calc(100% - 80px) calc(30%)) - inline assert_equals: expected "circle(at calc(100% - 80px) calc(30%))" but got "circle(at right 80px bottom 70%)" -FAIL circle(at bottom 70px left 50%) serializes as circle(at 50% calc(100% - 70px)) - inline assert_equals: expected "circle(at 50% calc(100% - 70px))" but got "circle(at left 50% bottom 70px)" -FAIL circle(at bottom 70px right 50%) serializes as circle(at calc(50%) calc(100% - 70px)) - inline assert_equals: expected "circle(at calc(50%) calc(100% - 70px))" but got "circle(at right 50% bottom 70px)" -FAIL circle(at bottom 70px right 80px) serializes as circle(at calc(100% - 80px) calc(100% - 70px)) - inline assert_equals: expected "circle(at calc(100% - 80px) calc(100% - 70px))" but got "circle(at right 80px bottom 70px)" -FAIL circle(at right 80% top 50%) serializes as circle(at calc(20%) 50%) - inline assert_equals: expected "circle(at calc(20%) 50%)" but got "circle(at right 80% top 50%)" -FAIL circle(at right 80% top 50px) serializes as circle(at calc(20%) 50px) - inline assert_equals: expected "circle(at calc(20%) 50px)" but got "circle(at right 80% top 50px)" -FAIL circle(at right 80% bottom 70%) serializes as circle(at calc(20%) calc(30%)) - inline assert_equals: expected "circle(at calc(20%) calc(30%))" but got "circle(at right 80% bottom 70%)" -FAIL circle(at right 80% bottom 70px) serializes as circle(at calc(20%) calc(100% - 70px)) - inline assert_equals: expected "circle(at calc(20%) calc(100% - 70px))" but got "circle(at right 80% bottom 70px)" -FAIL circle(at right 80px top 50%) serializes as circle(at calc(100% - 80px) 50%) - inline assert_equals: expected "circle(at calc(100% - 80px) 50%)" but got "circle(at right 80px top 50%)" -FAIL circle(at right 80px bottom 70%) serializes as circle(at calc(100% - 80px) calc(30%)) - inline assert_equals: expected "circle(at calc(100% - 80px) calc(30%))" but got "circle(at right 80px bottom 70%)" -FAIL circle(at right 80px bottom 70px) serializes as circle(at calc(100% - 80px) calc(100% - 70px)) - inline assert_equals: expected "circle(at calc(100% - 80px) calc(100% - 70px))" but got "circle(at right 80px bottom 70px)" +PASS circle(at left) serializes as circle(at left center) - inline +PASS circle(at top) serializes as circle(at center top) - inline +PASS circle(at right) serializes as circle(at right center) - inline +PASS circle(at bottom) serializes as circle(at center bottom) - inline +PASS circle(at center) serializes as circle(at center center) - inline +PASS circle(at left top) serializes as circle(at left top) - inline +PASS circle(at left bottom) serializes as circle(at left bottom) - inline +PASS circle(at left center) serializes as circle(at left center) - inline +PASS circle(at top left) serializes as circle(at left top) - inline +PASS circle(at top right) serializes as circle(at right top) - inline +PASS circle(at top center) serializes as circle(at center top) - inline +PASS circle(at right top) serializes as circle(at right top) - inline +PASS circle(at right bottom) serializes as circle(at right bottom) - inline +PASS circle(at right center) serializes as circle(at right center) - inline +PASS circle(at bottom left) serializes as circle(at left bottom) - inline +PASS circle(at bottom right) serializes as circle(at right bottom) - inline +PASS circle(at bottom center) serializes as circle(at center bottom) - inline +PASS circle(at center top) serializes as circle(at center top) - inline +PASS circle(at center left) serializes as circle(at left center) - inline +PASS circle(at center right) serializes as circle(at right center) - inline +PASS circle(at center bottom) serializes as circle(at center bottom) - inline +PASS circle(at center center) serializes as circle(at center center) - inline +PASS circle(at left 50%) serializes as circle(at left 50%) - inline +PASS circle(at left 50px) serializes as circle(at left 50px) - inline +PASS circle(at 50% top) serializes as circle(at 50% top) - inline +PASS circle(at 50px top) serializes as circle(at 50px top) - inline +PASS circle(at right 80%) serializes as circle(at right 80%) - inline +PASS circle(at right 80px) serializes as circle(at right 80px) - inline +PASS circle(at 70% bottom) serializes as circle(at 70% bottom) - inline +PASS circle(at 70px bottom) serializes as circle(at 70px bottom) - inline +PASS circle(at center 60%) serializes as circle(at center 60%) - inline +PASS circle(at center 60px) serializes as circle(at center 60px) - inline +PASS circle(at 60% center) serializes as circle(at 60% center) - inline +PASS circle(at 60px center) serializes as circle(at 60px center) - inline +PASS circle(at left 50% top 50%) serializes as circle(at left 50% top 50%) - inline +PASS circle(at left 50% top 50px) serializes as circle(at left 50% top 50px) - inline +PASS circle(at left 50% bottom 70%) serializes as circle(at left 50% bottom 70%) - inline +PASS circle(at left 50% bottom 70px) serializes as circle(at left 50% bottom 70px) - inline +PASS circle(at left 50px top 50%) serializes as circle(at left 50px top 50%) - inline +PASS circle(at left 50px top 50px) serializes as circle(at left 50px top 50px) - inline +PASS circle(at left 50px bottom 70%) serializes as circle(at left 50px bottom 70%) - inline +PASS circle(at top 50% left 50%) serializes as circle(at left 50% top 50%) - inline +PASS circle(at top 50% left 50px) serializes as circle(at left 50px top 50%) - inline +PASS circle(at top 50% right 80%) serializes as circle(at right 80% top 50%) - inline +PASS circle(at top 50% right 80px) serializes as circle(at right 80px top 50%) - inline +PASS circle(at top 50px left 50%) serializes as circle(at left 50% top 50px) - inline +PASS circle(at top 50px left 50px) serializes as circle(at left 50px top 50px) - inline +PASS circle(at top 50px right 80%) serializes as circle(at right 80% top 50px) - inline +PASS circle(at bottom 70% left 50%) serializes as circle(at left 50% bottom 70%) - inline +PASS circle(at bottom 70% left 50px) serializes as circle(at left 50px bottom 70%) - inline +PASS circle(at bottom 70% right 80%) serializes as circle(at right 80% bottom 70%) - inline +PASS circle(at bottom 70% right 80px) serializes as circle(at right 80px bottom 70%) - inline +PASS circle(at bottom 70px left 50%) serializes as circle(at left 50% bottom 70px) - inline +PASS circle(at bottom 70px right 50%) serializes as circle(at right 50% bottom 70px) - inline +PASS circle(at bottom 70px right 80px) serializes as circle(at right 80px bottom 70px) - inline +PASS circle(at right 80% top 50%) serializes as circle(at right 80% top 50%) - inline +PASS circle(at right 80% top 50px) serializes as circle(at right 80% top 50px) - inline +PASS circle(at right 80% bottom 70%) serializes as circle(at right 80% bottom 70%) - inline +PASS circle(at right 80% bottom 70px) serializes as circle(at right 80% bottom 70px) - inline +PASS circle(at right 80px top 50%) serializes as circle(at right 80px top 50%) - inline +PASS circle(at right 80px bottom 70%) serializes as circle(at right 80px bottom 70%) - inline +PASS circle(at right 80px bottom 70px) serializes as circle(at right 80px bottom 70px) - inline PASS circle(at 50%) serializes as circle(at 50% 50%) - computed PASS circle(at 50px) serializes as circle(at 50px 50%) - computed PASS circle(at 50% 50%) serializes as circle(at 50% 50%) - computed diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-004-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-004-expected.txt index 59cd543903d0..02b51d7ed77f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-004-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-004-expected.txt @@ -1,394 +1,394 @@ -FAIL test unit (inline): cm - circle(at 50cm) assert_equals: expected "circle(at 50cm 50%)" but got "circle(at 50cm center)" +PASS test unit (inline): cm - circle(at 50cm) PASS test unit (inline): cm - circle(at 50% 50cm) PASS test unit (inline): cm - circle(at 50cm 50%) PASS test unit (inline): cm - circle(at 50cm 50cm) -FAIL test unit (inline): cm - circle(at left 50cm) assert_equals: expected "circle(at 0% 50cm)" but got "circle(at left 50cm)" -FAIL test unit (inline): cm - circle(at 50cm top) assert_equals: expected "circle(at 50cm 0%)" but got "circle(at 50cm top)" -FAIL test unit (inline): cm - circle(at right 80cm) assert_equals: expected "circle(at 100% 80cm)" but got "circle(at right 80cm)" -FAIL test unit (inline): cm - circle(at 70cm bottom) assert_equals: expected "circle(at 70cm 100%)" but got "circle(at 70cm bottom)" -FAIL test unit (inline): cm - circle(at center 60cm) assert_equals: expected "circle(at 50% 60cm)" but got "circle(at center 60cm)" -FAIL test unit (inline): cm - circle(at 60cm center) assert_equals: expected "circle(at 60cm 50%)" but got "circle(at 60cm center)" -FAIL test unit (inline): cm - circle(at left 50% top 50cm) assert_equals: expected "circle(at 50% 50cm)" but got "circle(at left 50% top 50cm)" -FAIL test unit (inline): cm - circle(at left 50% bottom 70cm) assert_equals: expected "circle(at 50% calc(100% - 2645.67px))" but got "circle(at left 50% bottom 70cm)" -FAIL test unit (inline): cm - circle(at left 50cm top 50%) assert_equals: expected "circle(at 50cm 50%)" but got "circle(at left 50cm top 50%)" -FAIL test unit (inline): cm - circle(at left 50cm top 50cm) assert_equals: expected "circle(at 50cm 50cm)" but got "circle(at left 50cm top 50cm)" -FAIL test unit (inline): cm - circle(at left 50cm bottom 70%) assert_equals: expected "circle(at 50cm calc(30%))" but got "circle(at left 50cm bottom 70%)" -FAIL test unit (inline): cm - circle(at top 50% left 50cm) assert_equals: expected "circle(at 50cm 50%)" but got "circle(at left 50cm top 50%)" -FAIL test unit (inline): cm - circle(at top 50% right 80cm) assert_equals: expected "circle(at calc(100% - 3023.62px) 50%)" but got "circle(at right 80cm top 50%)" -FAIL test unit (inline): cm - circle(at top 50cm left 50%) assert_equals: expected "circle(at 50% 50cm)" but got "circle(at left 50% top 50cm)" -FAIL test unit (inline): cm - circle(at top 50cm left 50cm) assert_equals: expected "circle(at 50cm 50cm)" but got "circle(at left 50cm top 50cm)" -FAIL test unit (inline): cm - circle(at top 50cm right 80%) assert_equals: expected "circle(at calc(20%) 50cm)" but got "circle(at right 80% top 50cm)" -FAIL test unit (inline): cm - circle(at bottom 70% left 50cm) assert_equals: expected "circle(at 50cm calc(30%))" but got "circle(at left 50cm bottom 70%)" -FAIL test unit (inline): cm - circle(at bottom 70% right 80cm) assert_equals: expected "circle(at calc(100% - 3023.62px) calc(30%))" but got "circle(at right 80cm bottom 70%)" -FAIL test unit (inline): cm - circle(at bottom 70cm left 50%) assert_equals: expected "circle(at 50% calc(100% - 2645.67px))" but got "circle(at left 50% bottom 70cm)" -FAIL test unit (inline): cm - circle(at bottom 70cm right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 2645.67px))" but got "circle(at right 50% bottom 70cm)" -FAIL test unit (inline): cm - circle(at bottom 70cm right 80cm) assert_equals: expected "circle(at calc(100% - 3023.62px) calc(100% - 2645.67px))" but got "circle(at right 80cm bottom 70cm)" -FAIL test unit (inline): cm - circle(at right 80% top 50cm) assert_equals: expected "circle(at calc(20%) 50cm)" but got "circle(at right 80% top 50cm)" -FAIL test unit (inline): cm - circle(at right 80% bottom 70cm) assert_equals: expected "circle(at calc(20%) calc(100% - 2645.67px))" but got "circle(at right 80% bottom 70cm)" -FAIL test unit (inline): cm - circle(at right 80cm top 50%) assert_equals: expected "circle(at calc(100% - 3023.62px) 50%)" but got "circle(at right 80cm top 50%)" -FAIL test unit (inline): cm - circle(at right 80cm bottom 70%) assert_equals: expected "circle(at calc(100% - 3023.62px) calc(30%))" but got "circle(at right 80cm bottom 70%)" -FAIL test unit (inline): cm - circle(at right 80cm bottom 70cm) assert_equals: expected "circle(at calc(100% - 3023.62px) calc(100% - 2645.67px))" but got "circle(at right 80cm bottom 70cm)" -FAIL test unit (inline): mm - circle(at 50mm) assert_equals: expected "circle(at 50mm 50%)" but got "circle(at 50mm center)" +PASS test unit (inline): cm - circle(at left 50cm) +PASS test unit (inline): cm - circle(at 50cm top) +PASS test unit (inline): cm - circle(at right 80cm) +PASS test unit (inline): cm - circle(at 70cm bottom) +PASS test unit (inline): cm - circle(at center 60cm) +PASS test unit (inline): cm - circle(at 60cm center) +PASS test unit (inline): cm - circle(at left 50% top 50cm) +PASS test unit (inline): cm - circle(at left 50% bottom 70cm) +PASS test unit (inline): cm - circle(at left 50cm top 50%) +PASS test unit (inline): cm - circle(at left 50cm top 50cm) +PASS test unit (inline): cm - circle(at left 50cm bottom 70%) +PASS test unit (inline): cm - circle(at top 50% left 50cm) +PASS test unit (inline): cm - circle(at top 50% right 80cm) +PASS test unit (inline): cm - circle(at top 50cm left 50%) +PASS test unit (inline): cm - circle(at top 50cm left 50cm) +PASS test unit (inline): cm - circle(at top 50cm right 80%) +PASS test unit (inline): cm - circle(at bottom 70% left 50cm) +PASS test unit (inline): cm - circle(at bottom 70% right 80cm) +PASS test unit (inline): cm - circle(at bottom 70cm left 50%) +PASS test unit (inline): cm - circle(at bottom 70cm right 50%) +PASS test unit (inline): cm - circle(at bottom 70cm right 80cm) +PASS test unit (inline): cm - circle(at right 80% top 50cm) +PASS test unit (inline): cm - circle(at right 80% bottom 70cm) +PASS test unit (inline): cm - circle(at right 80cm top 50%) +PASS test unit (inline): cm - circle(at right 80cm bottom 70%) +PASS test unit (inline): cm - circle(at right 80cm bottom 70cm) +PASS test unit (inline): mm - circle(at 50mm) PASS test unit (inline): mm - circle(at 50% 50mm) PASS test unit (inline): mm - circle(at 50mm 50%) PASS test unit (inline): mm - circle(at 50mm 50mm) -FAIL test unit (inline): mm - circle(at left 50mm) assert_equals: expected "circle(at 0% 50mm)" but got "circle(at left 50mm)" -FAIL test unit (inline): mm - circle(at 50mm top) assert_equals: expected "circle(at 50mm 0%)" but got "circle(at 50mm top)" -FAIL test unit (inline): mm - circle(at right 80mm) assert_equals: expected "circle(at 100% 80mm)" but got "circle(at right 80mm)" -FAIL test unit (inline): mm - circle(at 70mm bottom) assert_equals: expected "circle(at 70mm 100%)" but got "circle(at 70mm bottom)" -FAIL test unit (inline): mm - circle(at center 60mm) assert_equals: expected "circle(at 50% 60mm)" but got "circle(at center 60mm)" -FAIL test unit (inline): mm - circle(at 60mm center) assert_equals: expected "circle(at 60mm 50%)" but got "circle(at 60mm center)" -FAIL test unit (inline): mm - circle(at left 50% top 50mm) assert_equals: expected "circle(at 50% 50mm)" but got "circle(at left 50% top 50mm)" -FAIL test unit (inline): mm - circle(at left 50% bottom 70mm) assert_equals: expected "circle(at 50% calc(100% - 264.567px))" but got "circle(at left 50% bottom 70mm)" -FAIL test unit (inline): mm - circle(at left 50mm top 50%) assert_equals: expected "circle(at 50mm 50%)" but got "circle(at left 50mm top 50%)" -FAIL test unit (inline): mm - circle(at left 50mm top 50mm) assert_equals: expected "circle(at 50mm 50mm)" but got "circle(at left 50mm top 50mm)" -FAIL test unit (inline): mm - circle(at left 50mm bottom 70%) assert_equals: expected "circle(at 50mm calc(30%))" but got "circle(at left 50mm bottom 70%)" -FAIL test unit (inline): mm - circle(at top 50% left 50mm) assert_equals: expected "circle(at 50mm 50%)" but got "circle(at left 50mm top 50%)" -FAIL test unit (inline): mm - circle(at top 50% right 80mm) assert_equals: expected "circle(at calc(100% - 302.362px) 50%)" but got "circle(at right 80mm top 50%)" -FAIL test unit (inline): mm - circle(at top 50mm left 50%) assert_equals: expected "circle(at 50% 50mm)" but got "circle(at left 50% top 50mm)" -FAIL test unit (inline): mm - circle(at top 50mm left 50mm) assert_equals: expected "circle(at 50mm 50mm)" but got "circle(at left 50mm top 50mm)" -FAIL test unit (inline): mm - circle(at top 50mm right 80%) assert_equals: expected "circle(at calc(20%) 50mm)" but got "circle(at right 80% top 50mm)" -FAIL test unit (inline): mm - circle(at bottom 70% left 50mm) assert_equals: expected "circle(at 50mm calc(30%))" but got "circle(at left 50mm bottom 70%)" -FAIL test unit (inline): mm - circle(at bottom 70% right 80mm) assert_equals: expected "circle(at calc(100% - 302.362px) calc(30%))" but got "circle(at right 80mm bottom 70%)" -FAIL test unit (inline): mm - circle(at bottom 70mm left 50%) assert_equals: expected "circle(at 50% calc(100% - 264.567px))" but got "circle(at left 50% bottom 70mm)" -FAIL test unit (inline): mm - circle(at bottom 70mm right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 264.567px))" but got "circle(at right 50% bottom 70mm)" -FAIL test unit (inline): mm - circle(at bottom 70mm right 80mm) assert_equals: expected "circle(at calc(100% - 302.362px) calc(100% - 264.567px))" but got "circle(at right 80mm bottom 70mm)" -FAIL test unit (inline): mm - circle(at right 80% top 50mm) assert_equals: expected "circle(at calc(20%) 50mm)" but got "circle(at right 80% top 50mm)" -FAIL test unit (inline): mm - circle(at right 80% bottom 70mm) assert_equals: expected "circle(at calc(20%) calc(100% - 264.567px))" but got "circle(at right 80% bottom 70mm)" -FAIL test unit (inline): mm - circle(at right 80mm top 50%) assert_equals: expected "circle(at calc(100% - 302.362px) 50%)" but got "circle(at right 80mm top 50%)" -FAIL test unit (inline): mm - circle(at right 80mm bottom 70%) assert_equals: expected "circle(at calc(100% - 302.362px) calc(30%))" but got "circle(at right 80mm bottom 70%)" -FAIL test unit (inline): mm - circle(at right 80mm bottom 70mm) assert_equals: expected "circle(at calc(100% - 302.362px) calc(100% - 264.567px))" but got "circle(at right 80mm bottom 70mm)" -FAIL test unit (inline): in - circle(at 50in) assert_equals: expected "circle(at 50in 50%)" but got "circle(at 50in center)" +PASS test unit (inline): mm - circle(at left 50mm) +PASS test unit (inline): mm - circle(at 50mm top) +PASS test unit (inline): mm - circle(at right 80mm) +PASS test unit (inline): mm - circle(at 70mm bottom) +PASS test unit (inline): mm - circle(at center 60mm) +PASS test unit (inline): mm - circle(at 60mm center) +PASS test unit (inline): mm - circle(at left 50% top 50mm) +PASS test unit (inline): mm - circle(at left 50% bottom 70mm) +PASS test unit (inline): mm - circle(at left 50mm top 50%) +PASS test unit (inline): mm - circle(at left 50mm top 50mm) +PASS test unit (inline): mm - circle(at left 50mm bottom 70%) +PASS test unit (inline): mm - circle(at top 50% left 50mm) +PASS test unit (inline): mm - circle(at top 50% right 80mm) +PASS test unit (inline): mm - circle(at top 50mm left 50%) +PASS test unit (inline): mm - circle(at top 50mm left 50mm) +PASS test unit (inline): mm - circle(at top 50mm right 80%) +PASS test unit (inline): mm - circle(at bottom 70% left 50mm) +PASS test unit (inline): mm - circle(at bottom 70% right 80mm) +PASS test unit (inline): mm - circle(at bottom 70mm left 50%) +PASS test unit (inline): mm - circle(at bottom 70mm right 50%) +PASS test unit (inline): mm - circle(at bottom 70mm right 80mm) +PASS test unit (inline): mm - circle(at right 80% top 50mm) +PASS test unit (inline): mm - circle(at right 80% bottom 70mm) +PASS test unit (inline): mm - circle(at right 80mm top 50%) +PASS test unit (inline): mm - circle(at right 80mm bottom 70%) +PASS test unit (inline): mm - circle(at right 80mm bottom 70mm) +PASS test unit (inline): in - circle(at 50in) PASS test unit (inline): in - circle(at 50% 50in) PASS test unit (inline): in - circle(at 50in 50%) PASS test unit (inline): in - circle(at 50in 50in) -FAIL test unit (inline): in - circle(at left 50in) assert_equals: expected "circle(at 0% 50in)" but got "circle(at left 50in)" -FAIL test unit (inline): in - circle(at 50in top) assert_equals: expected "circle(at 50in 0%)" but got "circle(at 50in top)" -FAIL test unit (inline): in - circle(at right 80in) assert_equals: expected "circle(at 100% 80in)" but got "circle(at right 80in)" -FAIL test unit (inline): in - circle(at 70in bottom) assert_equals: expected "circle(at 70in 100%)" but got "circle(at 70in bottom)" -FAIL test unit (inline): in - circle(at center 60in) assert_equals: expected "circle(at 50% 60in)" but got "circle(at center 60in)" -FAIL test unit (inline): in - circle(at 60in center) assert_equals: expected "circle(at 60in 50%)" but got "circle(at 60in center)" -FAIL test unit (inline): in - circle(at left 50% top 50in) assert_equals: expected "circle(at 50% 50in)" but got "circle(at left 50% top 50in)" -FAIL test unit (inline): in - circle(at left 50% bottom 70in) assert_equals: expected "circle(at 50% calc(100% - 6720px))" but got "circle(at left 50% bottom 70in)" -FAIL test unit (inline): in - circle(at left 50in top 50%) assert_equals: expected "circle(at 50in 50%)" but got "circle(at left 50in top 50%)" -FAIL test unit (inline): in - circle(at left 50in top 50in) assert_equals: expected "circle(at 50in 50in)" but got "circle(at left 50in top 50in)" -FAIL test unit (inline): in - circle(at left 50in bottom 70%) assert_equals: expected "circle(at 50in calc(30%))" but got "circle(at left 50in bottom 70%)" -FAIL test unit (inline): in - circle(at top 50% left 50in) assert_equals: expected "circle(at 50in 50%)" but got "circle(at left 50in top 50%)" -FAIL test unit (inline): in - circle(at top 50% right 80in) assert_equals: expected "circle(at calc(100% - 7680px) 50%)" but got "circle(at right 80in top 50%)" -FAIL test unit (inline): in - circle(at top 50in left 50%) assert_equals: expected "circle(at 50% 50in)" but got "circle(at left 50% top 50in)" -FAIL test unit (inline): in - circle(at top 50in left 50in) assert_equals: expected "circle(at 50in 50in)" but got "circle(at left 50in top 50in)" -FAIL test unit (inline): in - circle(at top 50in right 80%) assert_equals: expected "circle(at calc(20%) 50in)" but got "circle(at right 80% top 50in)" -FAIL test unit (inline): in - circle(at bottom 70% left 50in) assert_equals: expected "circle(at 50in calc(30%))" but got "circle(at left 50in bottom 70%)" -FAIL test unit (inline): in - circle(at bottom 70% right 80in) assert_equals: expected "circle(at calc(100% - 7680px) calc(30%))" but got "circle(at right 80in bottom 70%)" -FAIL test unit (inline): in - circle(at bottom 70in left 50%) assert_equals: expected "circle(at 50% calc(100% - 6720px))" but got "circle(at left 50% bottom 70in)" -FAIL test unit (inline): in - circle(at bottom 70in right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 6720px))" but got "circle(at right 50% bottom 70in)" -FAIL test unit (inline): in - circle(at bottom 70in right 80in) assert_equals: expected "circle(at calc(100% - 7680px) calc(100% - 6720px))" but got "circle(at right 80in bottom 70in)" -FAIL test unit (inline): in - circle(at right 80% top 50in) assert_equals: expected "circle(at calc(20%) 50in)" but got "circle(at right 80% top 50in)" -FAIL test unit (inline): in - circle(at right 80% bottom 70in) assert_equals: expected "circle(at calc(20%) calc(100% - 6720px))" but got "circle(at right 80% bottom 70in)" -FAIL test unit (inline): in - circle(at right 80in top 50%) assert_equals: expected "circle(at calc(100% - 7680px) 50%)" but got "circle(at right 80in top 50%)" -FAIL test unit (inline): in - circle(at right 80in bottom 70%) assert_equals: expected "circle(at calc(100% - 7680px) calc(30%))" but got "circle(at right 80in bottom 70%)" -FAIL test unit (inline): in - circle(at right 80in bottom 70in) assert_equals: expected "circle(at calc(100% - 7680px) calc(100% - 6720px))" but got "circle(at right 80in bottom 70in)" -FAIL test unit (inline): pt - circle(at 50pt) assert_equals: expected "circle(at 50pt 50%)" but got "circle(at 50pt center)" +PASS test unit (inline): in - circle(at left 50in) +PASS test unit (inline): in - circle(at 50in top) +PASS test unit (inline): in - circle(at right 80in) +PASS test unit (inline): in - circle(at 70in bottom) +PASS test unit (inline): in - circle(at center 60in) +PASS test unit (inline): in - circle(at 60in center) +PASS test unit (inline): in - circle(at left 50% top 50in) +PASS test unit (inline): in - circle(at left 50% bottom 70in) +PASS test unit (inline): in - circle(at left 50in top 50%) +PASS test unit (inline): in - circle(at left 50in top 50in) +PASS test unit (inline): in - circle(at left 50in bottom 70%) +PASS test unit (inline): in - circle(at top 50% left 50in) +PASS test unit (inline): in - circle(at top 50% right 80in) +PASS test unit (inline): in - circle(at top 50in left 50%) +PASS test unit (inline): in - circle(at top 50in left 50in) +PASS test unit (inline): in - circle(at top 50in right 80%) +PASS test unit (inline): in - circle(at bottom 70% left 50in) +PASS test unit (inline): in - circle(at bottom 70% right 80in) +PASS test unit (inline): in - circle(at bottom 70in left 50%) +PASS test unit (inline): in - circle(at bottom 70in right 50%) +PASS test unit (inline): in - circle(at bottom 70in right 80in) +PASS test unit (inline): in - circle(at right 80% top 50in) +PASS test unit (inline): in - circle(at right 80% bottom 70in) +PASS test unit (inline): in - circle(at right 80in top 50%) +PASS test unit (inline): in - circle(at right 80in bottom 70%) +PASS test unit (inline): in - circle(at right 80in bottom 70in) +PASS test unit (inline): pt - circle(at 50pt) PASS test unit (inline): pt - circle(at 50% 50pt) PASS test unit (inline): pt - circle(at 50pt 50%) PASS test unit (inline): pt - circle(at 50pt 50pt) -FAIL test unit (inline): pt - circle(at left 50pt) assert_equals: expected "circle(at 0% 50pt)" but got "circle(at left 50pt)" -FAIL test unit (inline): pt - circle(at 50pt top) assert_equals: expected "circle(at 50pt 0%)" but got "circle(at 50pt top)" -FAIL test unit (inline): pt - circle(at right 80pt) assert_equals: expected "circle(at 100% 80pt)" but got "circle(at right 80pt)" -FAIL test unit (inline): pt - circle(at 70pt bottom) assert_equals: expected "circle(at 70pt 100%)" but got "circle(at 70pt bottom)" -FAIL test unit (inline): pt - circle(at center 60pt) assert_equals: expected "circle(at 50% 60pt)" but got "circle(at center 60pt)" -FAIL test unit (inline): pt - circle(at 60pt center) assert_equals: expected "circle(at 60pt 50%)" but got "circle(at 60pt center)" -FAIL test unit (inline): pt - circle(at left 50% top 50pt) assert_equals: expected "circle(at 50% 50pt)" but got "circle(at left 50% top 50pt)" -FAIL test unit (inline): pt - circle(at left 50% bottom 70pt) assert_equals: expected "circle(at 50% calc(100% - 93.3333px))" but got "circle(at left 50% bottom 70pt)" -FAIL test unit (inline): pt - circle(at left 50pt top 50%) assert_equals: expected "circle(at 50pt 50%)" but got "circle(at left 50pt top 50%)" -FAIL test unit (inline): pt - circle(at left 50pt top 50pt) assert_equals: expected "circle(at 50pt 50pt)" but got "circle(at left 50pt top 50pt)" -FAIL test unit (inline): pt - circle(at left 50pt bottom 70%) assert_equals: expected "circle(at 50pt calc(30%))" but got "circle(at left 50pt bottom 70%)" -FAIL test unit (inline): pt - circle(at top 50% left 50pt) assert_equals: expected "circle(at 50pt 50%)" but got "circle(at left 50pt top 50%)" -FAIL test unit (inline): pt - circle(at top 50% right 80pt) assert_equals: expected "circle(at calc(100% - 106.667px) 50%)" but got "circle(at right 80pt top 50%)" -FAIL test unit (inline): pt - circle(at top 50pt left 50%) assert_equals: expected "circle(at 50% 50pt)" but got "circle(at left 50% top 50pt)" -FAIL test unit (inline): pt - circle(at top 50pt left 50pt) assert_equals: expected "circle(at 50pt 50pt)" but got "circle(at left 50pt top 50pt)" -FAIL test unit (inline): pt - circle(at top 50pt right 80%) assert_equals: expected "circle(at calc(20%) 50pt)" but got "circle(at right 80% top 50pt)" -FAIL test unit (inline): pt - circle(at bottom 70% left 50pt) assert_equals: expected "circle(at 50pt calc(30%))" but got "circle(at left 50pt bottom 70%)" -FAIL test unit (inline): pt - circle(at bottom 70% right 80pt) assert_equals: expected "circle(at calc(100% - 106.667px) calc(30%))" but got "circle(at right 80pt bottom 70%)" -FAIL test unit (inline): pt - circle(at bottom 70pt left 50%) assert_equals: expected "circle(at 50% calc(100% - 93.3333px))" but got "circle(at left 50% bottom 70pt)" -FAIL test unit (inline): pt - circle(at bottom 70pt right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 93.3333px))" but got "circle(at right 50% bottom 70pt)" -FAIL test unit (inline): pt - circle(at bottom 70pt right 80pt) assert_equals: expected "circle(at calc(100% - 106.667px) calc(100% - 93.3333px))" but got "circle(at right 80pt bottom 70pt)" -FAIL test unit (inline): pt - circle(at right 80% top 50pt) assert_equals: expected "circle(at calc(20%) 50pt)" but got "circle(at right 80% top 50pt)" -FAIL test unit (inline): pt - circle(at right 80% bottom 70pt) assert_equals: expected "circle(at calc(20%) calc(100% - 93.3333px))" but got "circle(at right 80% bottom 70pt)" -FAIL test unit (inline): pt - circle(at right 80pt top 50%) assert_equals: expected "circle(at calc(100% - 106.667px) 50%)" but got "circle(at right 80pt top 50%)" -FAIL test unit (inline): pt - circle(at right 80pt bottom 70%) assert_equals: expected "circle(at calc(100% - 106.667px) calc(30%))" but got "circle(at right 80pt bottom 70%)" -FAIL test unit (inline): pt - circle(at right 80pt bottom 70pt) assert_equals: expected "circle(at calc(100% - 106.667px) calc(100% - 93.3333px))" but got "circle(at right 80pt bottom 70pt)" -FAIL test unit (inline): pc - circle(at 50pc) assert_equals: expected "circle(at 50pc 50%)" but got "circle(at 50pc center)" +PASS test unit (inline): pt - circle(at left 50pt) +PASS test unit (inline): pt - circle(at 50pt top) +PASS test unit (inline): pt - circle(at right 80pt) +PASS test unit (inline): pt - circle(at 70pt bottom) +PASS test unit (inline): pt - circle(at center 60pt) +PASS test unit (inline): pt - circle(at 60pt center) +PASS test unit (inline): pt - circle(at left 50% top 50pt) +PASS test unit (inline): pt - circle(at left 50% bottom 70pt) +PASS test unit (inline): pt - circle(at left 50pt top 50%) +PASS test unit (inline): pt - circle(at left 50pt top 50pt) +PASS test unit (inline): pt - circle(at left 50pt bottom 70%) +PASS test unit (inline): pt - circle(at top 50% left 50pt) +PASS test unit (inline): pt - circle(at top 50% right 80pt) +PASS test unit (inline): pt - circle(at top 50pt left 50%) +PASS test unit (inline): pt - circle(at top 50pt left 50pt) +PASS test unit (inline): pt - circle(at top 50pt right 80%) +PASS test unit (inline): pt - circle(at bottom 70% left 50pt) +PASS test unit (inline): pt - circle(at bottom 70% right 80pt) +PASS test unit (inline): pt - circle(at bottom 70pt left 50%) +PASS test unit (inline): pt - circle(at bottom 70pt right 50%) +PASS test unit (inline): pt - circle(at bottom 70pt right 80pt) +PASS test unit (inline): pt - circle(at right 80% top 50pt) +PASS test unit (inline): pt - circle(at right 80% bottom 70pt) +PASS test unit (inline): pt - circle(at right 80pt top 50%) +PASS test unit (inline): pt - circle(at right 80pt bottom 70%) +PASS test unit (inline): pt - circle(at right 80pt bottom 70pt) +PASS test unit (inline): pc - circle(at 50pc) PASS test unit (inline): pc - circle(at 50% 50pc) PASS test unit (inline): pc - circle(at 50pc 50%) PASS test unit (inline): pc - circle(at 50pc 50pc) -FAIL test unit (inline): pc - circle(at left 50pc) assert_equals: expected "circle(at 0% 50pc)" but got "circle(at left 50pc)" -FAIL test unit (inline): pc - circle(at 50pc top) assert_equals: expected "circle(at 50pc 0%)" but got "circle(at 50pc top)" -FAIL test unit (inline): pc - circle(at right 80pc) assert_equals: expected "circle(at 100% 80pc)" but got "circle(at right 80pc)" -FAIL test unit (inline): pc - circle(at 70pc bottom) assert_equals: expected "circle(at 70pc 100%)" but got "circle(at 70pc bottom)" -FAIL test unit (inline): pc - circle(at center 60pc) assert_equals: expected "circle(at 50% 60pc)" but got "circle(at center 60pc)" -FAIL test unit (inline): pc - circle(at 60pc center) assert_equals: expected "circle(at 60pc 50%)" but got "circle(at 60pc center)" -FAIL test unit (inline): pc - circle(at left 50% top 50pc) assert_equals: expected "circle(at 50% 50pc)" but got "circle(at left 50% top 50pc)" -FAIL test unit (inline): pc - circle(at left 50% bottom 70pc) assert_equals: expected "circle(at 50% calc(100% - 1120px))" but got "circle(at left 50% bottom 70pc)" -FAIL test unit (inline): pc - circle(at left 50pc top 50%) assert_equals: expected "circle(at 50pc 50%)" but got "circle(at left 50pc top 50%)" -FAIL test unit (inline): pc - circle(at left 50pc top 50pc) assert_equals: expected "circle(at 50pc 50pc)" but got "circle(at left 50pc top 50pc)" -FAIL test unit (inline): pc - circle(at left 50pc bottom 70%) assert_equals: expected "circle(at 50pc calc(30%))" but got "circle(at left 50pc bottom 70%)" -FAIL test unit (inline): pc - circle(at top 50% left 50pc) assert_equals: expected "circle(at 50pc 50%)" but got "circle(at left 50pc top 50%)" -FAIL test unit (inline): pc - circle(at top 50% right 80pc) assert_equals: expected "circle(at calc(100% - 1280px) 50%)" but got "circle(at right 80pc top 50%)" -FAIL test unit (inline): pc - circle(at top 50pc left 50%) assert_equals: expected "circle(at 50% 50pc)" but got "circle(at left 50% top 50pc)" -FAIL test unit (inline): pc - circle(at top 50pc left 50pc) assert_equals: expected "circle(at 50pc 50pc)" but got "circle(at left 50pc top 50pc)" -FAIL test unit (inline): pc - circle(at top 50pc right 80%) assert_equals: expected "circle(at calc(20%) 50pc)" but got "circle(at right 80% top 50pc)" -FAIL test unit (inline): pc - circle(at bottom 70% left 50pc) assert_equals: expected "circle(at 50pc calc(30%))" but got "circle(at left 50pc bottom 70%)" -FAIL test unit (inline): pc - circle(at bottom 70% right 80pc) assert_equals: expected "circle(at calc(100% - 1280px) calc(30%))" but got "circle(at right 80pc bottom 70%)" -FAIL test unit (inline): pc - circle(at bottom 70pc left 50%) assert_equals: expected "circle(at 50% calc(100% - 1120px))" but got "circle(at left 50% bottom 70pc)" -FAIL test unit (inline): pc - circle(at bottom 70pc right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 1120px))" but got "circle(at right 50% bottom 70pc)" -FAIL test unit (inline): pc - circle(at bottom 70pc right 80pc) assert_equals: expected "circle(at calc(100% - 1280px) calc(100% - 1120px))" but got "circle(at right 80pc bottom 70pc)" -FAIL test unit (inline): pc - circle(at right 80% top 50pc) assert_equals: expected "circle(at calc(20%) 50pc)" but got "circle(at right 80% top 50pc)" -FAIL test unit (inline): pc - circle(at right 80% bottom 70pc) assert_equals: expected "circle(at calc(20%) calc(100% - 1120px))" but got "circle(at right 80% bottom 70pc)" -FAIL test unit (inline): pc - circle(at right 80pc top 50%) assert_equals: expected "circle(at calc(100% - 1280px) 50%)" but got "circle(at right 80pc top 50%)" -FAIL test unit (inline): pc - circle(at right 80pc bottom 70%) assert_equals: expected "circle(at calc(100% - 1280px) calc(30%))" but got "circle(at right 80pc bottom 70%)" -FAIL test unit (inline): pc - circle(at right 80pc bottom 70pc) assert_equals: expected "circle(at calc(100% - 1280px) calc(100% - 1120px))" but got "circle(at right 80pc bottom 70pc)" -FAIL test unit (inline): em - circle(at 50em) assert_equals: expected "circle(at 50em 50%)" but got "circle(at 50em center)" +PASS test unit (inline): pc - circle(at left 50pc) +PASS test unit (inline): pc - circle(at 50pc top) +PASS test unit (inline): pc - circle(at right 80pc) +PASS test unit (inline): pc - circle(at 70pc bottom) +PASS test unit (inline): pc - circle(at center 60pc) +PASS test unit (inline): pc - circle(at 60pc center) +PASS test unit (inline): pc - circle(at left 50% top 50pc) +PASS test unit (inline): pc - circle(at left 50% bottom 70pc) +PASS test unit (inline): pc - circle(at left 50pc top 50%) +PASS test unit (inline): pc - circle(at left 50pc top 50pc) +PASS test unit (inline): pc - circle(at left 50pc bottom 70%) +PASS test unit (inline): pc - circle(at top 50% left 50pc) +PASS test unit (inline): pc - circle(at top 50% right 80pc) +PASS test unit (inline): pc - circle(at top 50pc left 50%) +PASS test unit (inline): pc - circle(at top 50pc left 50pc) +PASS test unit (inline): pc - circle(at top 50pc right 80%) +PASS test unit (inline): pc - circle(at bottom 70% left 50pc) +PASS test unit (inline): pc - circle(at bottom 70% right 80pc) +PASS test unit (inline): pc - circle(at bottom 70pc left 50%) +PASS test unit (inline): pc - circle(at bottom 70pc right 50%) +PASS test unit (inline): pc - circle(at bottom 70pc right 80pc) +PASS test unit (inline): pc - circle(at right 80% top 50pc) +PASS test unit (inline): pc - circle(at right 80% bottom 70pc) +PASS test unit (inline): pc - circle(at right 80pc top 50%) +PASS test unit (inline): pc - circle(at right 80pc bottom 70%) +PASS test unit (inline): pc - circle(at right 80pc bottom 70pc) +PASS test unit (inline): em - circle(at 50em) PASS test unit (inline): em - circle(at 50% 50em) PASS test unit (inline): em - circle(at 50em 50%) PASS test unit (inline): em - circle(at 50em 50em) -FAIL test unit (inline): em - circle(at left 50em) assert_equals: expected "circle(at 0% 50em)" but got "circle(at left 50em)" -FAIL test unit (inline): em - circle(at 50em top) assert_equals: expected "circle(at 50em 0%)" but got "circle(at 50em top)" -FAIL test unit (inline): em - circle(at right 80em) assert_equals: expected "circle(at 100% 80em)" but got "circle(at right 80em)" -FAIL test unit (inline): em - circle(at 70em bottom) assert_equals: expected "circle(at 70em 100%)" but got "circle(at 70em bottom)" -FAIL test unit (inline): em - circle(at center 60em) assert_equals: expected "circle(at 50% 60em)" but got "circle(at center 60em)" -FAIL test unit (inline): em - circle(at 60em center) assert_equals: expected "circle(at 60em 50%)" but got "circle(at 60em center)" -FAIL test unit (inline): em - circle(at left 50% top 50em) assert_equals: expected "circle(at 50% 50em)" but got "circle(at left 50% top 50em)" -FAIL test unit (inline): em - circle(at left 50% bottom 70em) assert_equals: expected "circle(at 50% calc(100% - 70em))" but got "circle(at left 50% bottom 70em)" -FAIL test unit (inline): em - circle(at left 50em top 50%) assert_equals: expected "circle(at 50em 50%)" but got "circle(at left 50em top 50%)" -FAIL test unit (inline): em - circle(at left 50em top 50em) assert_equals: expected "circle(at 50em 50em)" but got "circle(at left 50em top 50em)" -FAIL test unit (inline): em - circle(at left 50em bottom 70%) assert_equals: expected "circle(at 50em calc(30%))" but got "circle(at left 50em bottom 70%)" -FAIL test unit (inline): em - circle(at top 50% left 50em) assert_equals: expected "circle(at 50em 50%)" but got "circle(at left 50em top 50%)" -FAIL test unit (inline): em - circle(at top 50% right 80em) assert_equals: expected "circle(at calc(100% - 80em) 50%)" but got "circle(at right 80em top 50%)" -FAIL test unit (inline): em - circle(at top 50em left 50%) assert_equals: expected "circle(at 50% 50em)" but got "circle(at left 50% top 50em)" -FAIL test unit (inline): em - circle(at top 50em left 50em) assert_equals: expected "circle(at 50em 50em)" but got "circle(at left 50em top 50em)" -FAIL test unit (inline): em - circle(at top 50em right 80%) assert_equals: expected "circle(at calc(20%) 50em)" but got "circle(at right 80% top 50em)" -FAIL test unit (inline): em - circle(at bottom 70% left 50em) assert_equals: expected "circle(at 50em calc(30%))" but got "circle(at left 50em bottom 70%)" -FAIL test unit (inline): em - circle(at bottom 70% right 80em) assert_equals: expected "circle(at calc(100% - 80em) calc(30%))" but got "circle(at right 80em bottom 70%)" -FAIL test unit (inline): em - circle(at bottom 70em left 50%) assert_equals: expected "circle(at 50% calc(100% - 70em))" but got "circle(at left 50% bottom 70em)" -FAIL test unit (inline): em - circle(at bottom 70em right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70em))" but got "circle(at right 50% bottom 70em)" -FAIL test unit (inline): em - circle(at bottom 70em right 80em) assert_equals: expected "circle(at calc(100% - 80em) calc(100% - 70em))" but got "circle(at right 80em bottom 70em)" -FAIL test unit (inline): em - circle(at right 80% top 50em) assert_equals: expected "circle(at calc(20%) 50em)" but got "circle(at right 80% top 50em)" -FAIL test unit (inline): em - circle(at right 80% bottom 70em) assert_equals: expected "circle(at calc(20%) calc(100% - 70em))" but got "circle(at right 80% bottom 70em)" -FAIL test unit (inline): em - circle(at right 80em top 50%) assert_equals: expected "circle(at calc(100% - 80em) 50%)" but got "circle(at right 80em top 50%)" -FAIL test unit (inline): em - circle(at right 80em bottom 70%) assert_equals: expected "circle(at calc(100% - 80em) calc(30%))" but got "circle(at right 80em bottom 70%)" -FAIL test unit (inline): em - circle(at right 80em bottom 70em) assert_equals: expected "circle(at calc(100% - 80em) calc(100% - 70em))" but got "circle(at right 80em bottom 70em)" -FAIL test unit (inline): ex - circle(at 50ex) assert_equals: expected "circle(at 50ex 50%)" but got "circle(at 50ex center)" +PASS test unit (inline): em - circle(at left 50em) +PASS test unit (inline): em - circle(at 50em top) +PASS test unit (inline): em - circle(at right 80em) +PASS test unit (inline): em - circle(at 70em bottom) +PASS test unit (inline): em - circle(at center 60em) +PASS test unit (inline): em - circle(at 60em center) +PASS test unit (inline): em - circle(at left 50% top 50em) +PASS test unit (inline): em - circle(at left 50% bottom 70em) +PASS test unit (inline): em - circle(at left 50em top 50%) +PASS test unit (inline): em - circle(at left 50em top 50em) +PASS test unit (inline): em - circle(at left 50em bottom 70%) +PASS test unit (inline): em - circle(at top 50% left 50em) +PASS test unit (inline): em - circle(at top 50% right 80em) +PASS test unit (inline): em - circle(at top 50em left 50%) +PASS test unit (inline): em - circle(at top 50em left 50em) +PASS test unit (inline): em - circle(at top 50em right 80%) +PASS test unit (inline): em - circle(at bottom 70% left 50em) +PASS test unit (inline): em - circle(at bottom 70% right 80em) +PASS test unit (inline): em - circle(at bottom 70em left 50%) +PASS test unit (inline): em - circle(at bottom 70em right 50%) +PASS test unit (inline): em - circle(at bottom 70em right 80em) +PASS test unit (inline): em - circle(at right 80% top 50em) +PASS test unit (inline): em - circle(at right 80% bottom 70em) +PASS test unit (inline): em - circle(at right 80em top 50%) +PASS test unit (inline): em - circle(at right 80em bottom 70%) +PASS test unit (inline): em - circle(at right 80em bottom 70em) +PASS test unit (inline): ex - circle(at 50ex) PASS test unit (inline): ex - circle(at 50% 50ex) PASS test unit (inline): ex - circle(at 50ex 50%) PASS test unit (inline): ex - circle(at 50ex 50ex) -FAIL test unit (inline): ex - circle(at left 50ex) assert_equals: expected "circle(at 0% 50ex)" but got "circle(at left 50ex)" -FAIL test unit (inline): ex - circle(at 50ex top) assert_equals: expected "circle(at 50ex 0%)" but got "circle(at 50ex top)" -FAIL test unit (inline): ex - circle(at right 80ex) assert_equals: expected "circle(at 100% 80ex)" but got "circle(at right 80ex)" -FAIL test unit (inline): ex - circle(at 70ex bottom) assert_equals: expected "circle(at 70ex 100%)" but got "circle(at 70ex bottom)" -FAIL test unit (inline): ex - circle(at center 60ex) assert_equals: expected "circle(at 50% 60ex)" but got "circle(at center 60ex)" -FAIL test unit (inline): ex - circle(at 60ex center) assert_equals: expected "circle(at 60ex 50%)" but got "circle(at 60ex center)" -FAIL test unit (inline): ex - circle(at left 50% top 50ex) assert_equals: expected "circle(at 50% 50ex)" but got "circle(at left 50% top 50ex)" -FAIL test unit (inline): ex - circle(at left 50% bottom 70ex) assert_equals: expected "circle(at 50% calc(100% - 70ex))" but got "circle(at left 50% bottom 70ex)" -FAIL test unit (inline): ex - circle(at left 50ex top 50%) assert_equals: expected "circle(at 50ex 50%)" but got "circle(at left 50ex top 50%)" -FAIL test unit (inline): ex - circle(at left 50ex top 50ex) assert_equals: expected "circle(at 50ex 50ex)" but got "circle(at left 50ex top 50ex)" -FAIL test unit (inline): ex - circle(at left 50ex bottom 70%) assert_equals: expected "circle(at 50ex calc(30%))" but got "circle(at left 50ex bottom 70%)" -FAIL test unit (inline): ex - circle(at top 50% left 50ex) assert_equals: expected "circle(at 50ex 50%)" but got "circle(at left 50ex top 50%)" -FAIL test unit (inline): ex - circle(at top 50% right 80ex) assert_equals: expected "circle(at calc(100% - 80ex) 50%)" but got "circle(at right 80ex top 50%)" -FAIL test unit (inline): ex - circle(at top 50ex left 50%) assert_equals: expected "circle(at 50% 50ex)" but got "circle(at left 50% top 50ex)" -FAIL test unit (inline): ex - circle(at top 50ex left 50ex) assert_equals: expected "circle(at 50ex 50ex)" but got "circle(at left 50ex top 50ex)" -FAIL test unit (inline): ex - circle(at top 50ex right 80%) assert_equals: expected "circle(at calc(20%) 50ex)" but got "circle(at right 80% top 50ex)" -FAIL test unit (inline): ex - circle(at bottom 70% left 50ex) assert_equals: expected "circle(at 50ex calc(30%))" but got "circle(at left 50ex bottom 70%)" -FAIL test unit (inline): ex - circle(at bottom 70% right 80ex) assert_equals: expected "circle(at calc(100% - 80ex) calc(30%))" but got "circle(at right 80ex bottom 70%)" -FAIL test unit (inline): ex - circle(at bottom 70ex left 50%) assert_equals: expected "circle(at 50% calc(100% - 70ex))" but got "circle(at left 50% bottom 70ex)" -FAIL test unit (inline): ex - circle(at bottom 70ex right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70ex))" but got "circle(at right 50% bottom 70ex)" -FAIL test unit (inline): ex - circle(at bottom 70ex right 80ex) assert_equals: expected "circle(at calc(100% - 80ex) calc(100% - 70ex))" but got "circle(at right 80ex bottom 70ex)" -FAIL test unit (inline): ex - circle(at right 80% top 50ex) assert_equals: expected "circle(at calc(20%) 50ex)" but got "circle(at right 80% top 50ex)" -FAIL test unit (inline): ex - circle(at right 80% bottom 70ex) assert_equals: expected "circle(at calc(20%) calc(100% - 70ex))" but got "circle(at right 80% bottom 70ex)" -FAIL test unit (inline): ex - circle(at right 80ex top 50%) assert_equals: expected "circle(at calc(100% - 80ex) 50%)" but got "circle(at right 80ex top 50%)" -FAIL test unit (inline): ex - circle(at right 80ex bottom 70%) assert_equals: expected "circle(at calc(100% - 80ex) calc(30%))" but got "circle(at right 80ex bottom 70%)" -FAIL test unit (inline): ex - circle(at right 80ex bottom 70ex) assert_equals: expected "circle(at calc(100% - 80ex) calc(100% - 70ex))" but got "circle(at right 80ex bottom 70ex)" -FAIL test unit (inline): ch - circle(at 50ch) assert_equals: expected "circle(at 50ch 50%)" but got "circle(at 50ch center)" +PASS test unit (inline): ex - circle(at left 50ex) +PASS test unit (inline): ex - circle(at 50ex top) +PASS test unit (inline): ex - circle(at right 80ex) +PASS test unit (inline): ex - circle(at 70ex bottom) +PASS test unit (inline): ex - circle(at center 60ex) +PASS test unit (inline): ex - circle(at 60ex center) +PASS test unit (inline): ex - circle(at left 50% top 50ex) +PASS test unit (inline): ex - circle(at left 50% bottom 70ex) +PASS test unit (inline): ex - circle(at left 50ex top 50%) +PASS test unit (inline): ex - circle(at left 50ex top 50ex) +PASS test unit (inline): ex - circle(at left 50ex bottom 70%) +PASS test unit (inline): ex - circle(at top 50% left 50ex) +PASS test unit (inline): ex - circle(at top 50% right 80ex) +PASS test unit (inline): ex - circle(at top 50ex left 50%) +PASS test unit (inline): ex - circle(at top 50ex left 50ex) +PASS test unit (inline): ex - circle(at top 50ex right 80%) +PASS test unit (inline): ex - circle(at bottom 70% left 50ex) +PASS test unit (inline): ex - circle(at bottom 70% right 80ex) +PASS test unit (inline): ex - circle(at bottom 70ex left 50%) +PASS test unit (inline): ex - circle(at bottom 70ex right 50%) +PASS test unit (inline): ex - circle(at bottom 70ex right 80ex) +PASS test unit (inline): ex - circle(at right 80% top 50ex) +PASS test unit (inline): ex - circle(at right 80% bottom 70ex) +PASS test unit (inline): ex - circle(at right 80ex top 50%) +PASS test unit (inline): ex - circle(at right 80ex bottom 70%) +PASS test unit (inline): ex - circle(at right 80ex bottom 70ex) +PASS test unit (inline): ch - circle(at 50ch) PASS test unit (inline): ch - circle(at 50% 50ch) PASS test unit (inline): ch - circle(at 50ch 50%) PASS test unit (inline): ch - circle(at 50ch 50ch) -FAIL test unit (inline): ch - circle(at left 50ch) assert_equals: expected "circle(at 0% 50ch)" but got "circle(at left 50ch)" -FAIL test unit (inline): ch - circle(at 50ch top) assert_equals: expected "circle(at 50ch 0%)" but got "circle(at 50ch top)" -FAIL test unit (inline): ch - circle(at right 80ch) assert_equals: expected "circle(at 100% 80ch)" but got "circle(at right 80ch)" -FAIL test unit (inline): ch - circle(at 70ch bottom) assert_equals: expected "circle(at 70ch 100%)" but got "circle(at 70ch bottom)" -FAIL test unit (inline): ch - circle(at center 60ch) assert_equals: expected "circle(at 50% 60ch)" but got "circle(at center 60ch)" -FAIL test unit (inline): ch - circle(at 60ch center) assert_equals: expected "circle(at 60ch 50%)" but got "circle(at 60ch center)" -FAIL test unit (inline): ch - circle(at left 50% top 50ch) assert_equals: expected "circle(at 50% 50ch)" but got "circle(at left 50% top 50ch)" -FAIL test unit (inline): ch - circle(at left 50% bottom 70ch) assert_equals: expected "circle(at 50% calc(100% - 70ch))" but got "circle(at left 50% bottom 70ch)" -FAIL test unit (inline): ch - circle(at left 50ch top 50%) assert_equals: expected "circle(at 50ch 50%)" but got "circle(at left 50ch top 50%)" -FAIL test unit (inline): ch - circle(at left 50ch top 50ch) assert_equals: expected "circle(at 50ch 50ch)" but got "circle(at left 50ch top 50ch)" -FAIL test unit (inline): ch - circle(at left 50ch bottom 70%) assert_equals: expected "circle(at 50ch calc(30%))" but got "circle(at left 50ch bottom 70%)" -FAIL test unit (inline): ch - circle(at top 50% left 50ch) assert_equals: expected "circle(at 50ch 50%)" but got "circle(at left 50ch top 50%)" -FAIL test unit (inline): ch - circle(at top 50% right 80ch) assert_equals: expected "circle(at calc(100% - 80ch) 50%)" but got "circle(at right 80ch top 50%)" -FAIL test unit (inline): ch - circle(at top 50ch left 50%) assert_equals: expected "circle(at 50% 50ch)" but got "circle(at left 50% top 50ch)" -FAIL test unit (inline): ch - circle(at top 50ch left 50ch) assert_equals: expected "circle(at 50ch 50ch)" but got "circle(at left 50ch top 50ch)" -FAIL test unit (inline): ch - circle(at top 50ch right 80%) assert_equals: expected "circle(at calc(20%) 50ch)" but got "circle(at right 80% top 50ch)" -FAIL test unit (inline): ch - circle(at bottom 70% left 50ch) assert_equals: expected "circle(at 50ch calc(30%))" but got "circle(at left 50ch bottom 70%)" -FAIL test unit (inline): ch - circle(at bottom 70% right 80ch) assert_equals: expected "circle(at calc(100% - 80ch) calc(30%))" but got "circle(at right 80ch bottom 70%)" -FAIL test unit (inline): ch - circle(at bottom 70ch left 50%) assert_equals: expected "circle(at 50% calc(100% - 70ch))" but got "circle(at left 50% bottom 70ch)" -FAIL test unit (inline): ch - circle(at bottom 70ch right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70ch))" but got "circle(at right 50% bottom 70ch)" -FAIL test unit (inline): ch - circle(at bottom 70ch right 80ch) assert_equals: expected "circle(at calc(100% - 80ch) calc(100% - 70ch))" but got "circle(at right 80ch bottom 70ch)" -FAIL test unit (inline): ch - circle(at right 80% top 50ch) assert_equals: expected "circle(at calc(20%) 50ch)" but got "circle(at right 80% top 50ch)" -FAIL test unit (inline): ch - circle(at right 80% bottom 70ch) assert_equals: expected "circle(at calc(20%) calc(100% - 70ch))" but got "circle(at right 80% bottom 70ch)" -FAIL test unit (inline): ch - circle(at right 80ch top 50%) assert_equals: expected "circle(at calc(100% - 80ch) 50%)" but got "circle(at right 80ch top 50%)" -FAIL test unit (inline): ch - circle(at right 80ch bottom 70%) assert_equals: expected "circle(at calc(100% - 80ch) calc(30%))" but got "circle(at right 80ch bottom 70%)" -FAIL test unit (inline): ch - circle(at right 80ch bottom 70ch) assert_equals: expected "circle(at calc(100% - 80ch) calc(100% - 70ch))" but got "circle(at right 80ch bottom 70ch)" -FAIL test unit (inline): rem - circle(at 50rem) assert_equals: expected "circle(at 50rem 50%)" but got "circle(at 50rem center)" +PASS test unit (inline): ch - circle(at left 50ch) +PASS test unit (inline): ch - circle(at 50ch top) +PASS test unit (inline): ch - circle(at right 80ch) +PASS test unit (inline): ch - circle(at 70ch bottom) +PASS test unit (inline): ch - circle(at center 60ch) +PASS test unit (inline): ch - circle(at 60ch center) +PASS test unit (inline): ch - circle(at left 50% top 50ch) +PASS test unit (inline): ch - circle(at left 50% bottom 70ch) +PASS test unit (inline): ch - circle(at left 50ch top 50%) +PASS test unit (inline): ch - circle(at left 50ch top 50ch) +PASS test unit (inline): ch - circle(at left 50ch bottom 70%) +PASS test unit (inline): ch - circle(at top 50% left 50ch) +PASS test unit (inline): ch - circle(at top 50% right 80ch) +PASS test unit (inline): ch - circle(at top 50ch left 50%) +PASS test unit (inline): ch - circle(at top 50ch left 50ch) +PASS test unit (inline): ch - circle(at top 50ch right 80%) +PASS test unit (inline): ch - circle(at bottom 70% left 50ch) +PASS test unit (inline): ch - circle(at bottom 70% right 80ch) +PASS test unit (inline): ch - circle(at bottom 70ch left 50%) +PASS test unit (inline): ch - circle(at bottom 70ch right 50%) +PASS test unit (inline): ch - circle(at bottom 70ch right 80ch) +PASS test unit (inline): ch - circle(at right 80% top 50ch) +PASS test unit (inline): ch - circle(at right 80% bottom 70ch) +PASS test unit (inline): ch - circle(at right 80ch top 50%) +PASS test unit (inline): ch - circle(at right 80ch bottom 70%) +PASS test unit (inline): ch - circle(at right 80ch bottom 70ch) +PASS test unit (inline): rem - circle(at 50rem) PASS test unit (inline): rem - circle(at 50% 50rem) PASS test unit (inline): rem - circle(at 50rem 50%) PASS test unit (inline): rem - circle(at 50rem 50rem) -FAIL test unit (inline): rem - circle(at left 50rem) assert_equals: expected "circle(at 0% 50rem)" but got "circle(at left 50rem)" -FAIL test unit (inline): rem - circle(at 50rem top) assert_equals: expected "circle(at 50rem 0%)" but got "circle(at 50rem top)" -FAIL test unit (inline): rem - circle(at right 80rem) assert_equals: expected "circle(at 100% 80rem)" but got "circle(at right 80rem)" -FAIL test unit (inline): rem - circle(at 70rem bottom) assert_equals: expected "circle(at 70rem 100%)" but got "circle(at 70rem bottom)" -FAIL test unit (inline): rem - circle(at center 60rem) assert_equals: expected "circle(at 50% 60rem)" but got "circle(at center 60rem)" -FAIL test unit (inline): rem - circle(at 60rem center) assert_equals: expected "circle(at 60rem 50%)" but got "circle(at 60rem center)" -FAIL test unit (inline): rem - circle(at left 50% top 50rem) assert_equals: expected "circle(at 50% 50rem)" but got "circle(at left 50% top 50rem)" -FAIL test unit (inline): rem - circle(at left 50% bottom 70rem) assert_equals: expected "circle(at 50% calc(100% - 70rem))" but got "circle(at left 50% bottom 70rem)" -FAIL test unit (inline): rem - circle(at left 50rem top 50%) assert_equals: expected "circle(at 50rem 50%)" but got "circle(at left 50rem top 50%)" -FAIL test unit (inline): rem - circle(at left 50rem top 50rem) assert_equals: expected "circle(at 50rem 50rem)" but got "circle(at left 50rem top 50rem)" -FAIL test unit (inline): rem - circle(at left 50rem bottom 70%) assert_equals: expected "circle(at 50rem calc(30%))" but got "circle(at left 50rem bottom 70%)" -FAIL test unit (inline): rem - circle(at top 50% left 50rem) assert_equals: expected "circle(at 50rem 50%)" but got "circle(at left 50rem top 50%)" -FAIL test unit (inline): rem - circle(at top 50% right 80rem) assert_equals: expected "circle(at calc(100% - 80rem) 50%)" but got "circle(at right 80rem top 50%)" -FAIL test unit (inline): rem - circle(at top 50rem left 50%) assert_equals: expected "circle(at 50% 50rem)" but got "circle(at left 50% top 50rem)" -FAIL test unit (inline): rem - circle(at top 50rem left 50rem) assert_equals: expected "circle(at 50rem 50rem)" but got "circle(at left 50rem top 50rem)" -FAIL test unit (inline): rem - circle(at top 50rem right 80%) assert_equals: expected "circle(at calc(20%) 50rem)" but got "circle(at right 80% top 50rem)" -FAIL test unit (inline): rem - circle(at bottom 70% left 50rem) assert_equals: expected "circle(at 50rem calc(30%))" but got "circle(at left 50rem bottom 70%)" -FAIL test unit (inline): rem - circle(at bottom 70% right 80rem) assert_equals: expected "circle(at calc(100% - 80rem) calc(30%))" but got "circle(at right 80rem bottom 70%)" -FAIL test unit (inline): rem - circle(at bottom 70rem left 50%) assert_equals: expected "circle(at 50% calc(100% - 70rem))" but got "circle(at left 50% bottom 70rem)" -FAIL test unit (inline): rem - circle(at bottom 70rem right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70rem))" but got "circle(at right 50% bottom 70rem)" -FAIL test unit (inline): rem - circle(at bottom 70rem right 80rem) assert_equals: expected "circle(at calc(100% - 80rem) calc(100% - 70rem))" but got "circle(at right 80rem bottom 70rem)" -FAIL test unit (inline): rem - circle(at right 80% top 50rem) assert_equals: expected "circle(at calc(20%) 50rem)" but got "circle(at right 80% top 50rem)" -FAIL test unit (inline): rem - circle(at right 80% bottom 70rem) assert_equals: expected "circle(at calc(20%) calc(100% - 70rem))" but got "circle(at right 80% bottom 70rem)" -FAIL test unit (inline): rem - circle(at right 80rem top 50%) assert_equals: expected "circle(at calc(100% - 80rem) 50%)" but got "circle(at right 80rem top 50%)" -FAIL test unit (inline): rem - circle(at right 80rem bottom 70%) assert_equals: expected "circle(at calc(100% - 80rem) calc(30%))" but got "circle(at right 80rem bottom 70%)" -FAIL test unit (inline): rem - circle(at right 80rem bottom 70rem) assert_equals: expected "circle(at calc(100% - 80rem) calc(100% - 70rem))" but got "circle(at right 80rem bottom 70rem)" -FAIL test unit (inline): vw - circle(at 50vw) assert_equals: expected "circle(at 50vw 50%)" but got "circle(at 50vw center)" +PASS test unit (inline): rem - circle(at left 50rem) +PASS test unit (inline): rem - circle(at 50rem top) +PASS test unit (inline): rem - circle(at right 80rem) +PASS test unit (inline): rem - circle(at 70rem bottom) +PASS test unit (inline): rem - circle(at center 60rem) +PASS test unit (inline): rem - circle(at 60rem center) +PASS test unit (inline): rem - circle(at left 50% top 50rem) +PASS test unit (inline): rem - circle(at left 50% bottom 70rem) +PASS test unit (inline): rem - circle(at left 50rem top 50%) +PASS test unit (inline): rem - circle(at left 50rem top 50rem) +PASS test unit (inline): rem - circle(at left 50rem bottom 70%) +PASS test unit (inline): rem - circle(at top 50% left 50rem) +PASS test unit (inline): rem - circle(at top 50% right 80rem) +PASS test unit (inline): rem - circle(at top 50rem left 50%) +PASS test unit (inline): rem - circle(at top 50rem left 50rem) +PASS test unit (inline): rem - circle(at top 50rem right 80%) +PASS test unit (inline): rem - circle(at bottom 70% left 50rem) +PASS test unit (inline): rem - circle(at bottom 70% right 80rem) +PASS test unit (inline): rem - circle(at bottom 70rem left 50%) +PASS test unit (inline): rem - circle(at bottom 70rem right 50%) +PASS test unit (inline): rem - circle(at bottom 70rem right 80rem) +PASS test unit (inline): rem - circle(at right 80% top 50rem) +PASS test unit (inline): rem - circle(at right 80% bottom 70rem) +PASS test unit (inline): rem - circle(at right 80rem top 50%) +PASS test unit (inline): rem - circle(at right 80rem bottom 70%) +PASS test unit (inline): rem - circle(at right 80rem bottom 70rem) +PASS test unit (inline): vw - circle(at 50vw) PASS test unit (inline): vw - circle(at 50% 50vw) PASS test unit (inline): vw - circle(at 50vw 50%) PASS test unit (inline): vw - circle(at 50vw 50vw) -FAIL test unit (inline): vw - circle(at left 50vw) assert_equals: expected "circle(at 0% 50vw)" but got "circle(at left 50vw)" -FAIL test unit (inline): vw - circle(at 50vw top) assert_equals: expected "circle(at 50vw 0%)" but got "circle(at 50vw top)" -FAIL test unit (inline): vw - circle(at right 80vw) assert_equals: expected "circle(at 100% 80vw)" but got "circle(at right 80vw)" -FAIL test unit (inline): vw - circle(at 70vw bottom) assert_equals: expected "circle(at 70vw 100%)" but got "circle(at 70vw bottom)" -FAIL test unit (inline): vw - circle(at center 60vw) assert_equals: expected "circle(at 50% 60vw)" but got "circle(at center 60vw)" -FAIL test unit (inline): vw - circle(at 60vw center) assert_equals: expected "circle(at 60vw 50%)" but got "circle(at 60vw center)" -FAIL test unit (inline): vw - circle(at left 50% top 50vw) assert_equals: expected "circle(at 50% 50vw)" but got "circle(at left 50% top 50vw)" -FAIL test unit (inline): vw - circle(at left 50% bottom 70vw) assert_equals: expected "circle(at 50% calc(100% - 70vw))" but got "circle(at left 50% bottom 70vw)" -FAIL test unit (inline): vw - circle(at left 50vw top 50%) assert_equals: expected "circle(at 50vw 50%)" but got "circle(at left 50vw top 50%)" -FAIL test unit (inline): vw - circle(at left 50vw top 50vw) assert_equals: expected "circle(at 50vw 50vw)" but got "circle(at left 50vw top 50vw)" -FAIL test unit (inline): vw - circle(at left 50vw bottom 70%) assert_equals: expected "circle(at 50vw calc(30%))" but got "circle(at left 50vw bottom 70%)" -FAIL test unit (inline): vw - circle(at top 50% left 50vw) assert_equals: expected "circle(at 50vw 50%)" but got "circle(at left 50vw top 50%)" -FAIL test unit (inline): vw - circle(at top 50% right 80vw) assert_equals: expected "circle(at calc(100% - 80vw) 50%)" but got "circle(at right 80vw top 50%)" -FAIL test unit (inline): vw - circle(at top 50vw left 50%) assert_equals: expected "circle(at 50% 50vw)" but got "circle(at left 50% top 50vw)" -FAIL test unit (inline): vw - circle(at top 50vw left 50vw) assert_equals: expected "circle(at 50vw 50vw)" but got "circle(at left 50vw top 50vw)" -FAIL test unit (inline): vw - circle(at top 50vw right 80%) assert_equals: expected "circle(at calc(20%) 50vw)" but got "circle(at right 80% top 50vw)" -FAIL test unit (inline): vw - circle(at bottom 70% left 50vw) assert_equals: expected "circle(at 50vw calc(30%))" but got "circle(at left 50vw bottom 70%)" -FAIL test unit (inline): vw - circle(at bottom 70% right 80vw) assert_equals: expected "circle(at calc(100% - 80vw) calc(30%))" but got "circle(at right 80vw bottom 70%)" -FAIL test unit (inline): vw - circle(at bottom 70vw left 50%) assert_equals: expected "circle(at 50% calc(100% - 70vw))" but got "circle(at left 50% bottom 70vw)" -FAIL test unit (inline): vw - circle(at bottom 70vw right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70vw))" but got "circle(at right 50% bottom 70vw)" -FAIL test unit (inline): vw - circle(at bottom 70vw right 80vw) assert_equals: expected "circle(at calc(100% - 80vw) calc(100% - 70vw))" but got "circle(at right 80vw bottom 70vw)" -FAIL test unit (inline): vw - circle(at right 80% top 50vw) assert_equals: expected "circle(at calc(20%) 50vw)" but got "circle(at right 80% top 50vw)" -FAIL test unit (inline): vw - circle(at right 80% bottom 70vw) assert_equals: expected "circle(at calc(20%) calc(100% - 70vw))" but got "circle(at right 80% bottom 70vw)" -FAIL test unit (inline): vw - circle(at right 80vw top 50%) assert_equals: expected "circle(at calc(100% - 80vw) 50%)" but got "circle(at right 80vw top 50%)" -FAIL test unit (inline): vw - circle(at right 80vw bottom 70%) assert_equals: expected "circle(at calc(100% - 80vw) calc(30%))" but got "circle(at right 80vw bottom 70%)" -FAIL test unit (inline): vw - circle(at right 80vw bottom 70vw) assert_equals: expected "circle(at calc(100% - 80vw) calc(100% - 70vw))" but got "circle(at right 80vw bottom 70vw)" -FAIL test unit (inline): vh - circle(at 50vh) assert_equals: expected "circle(at 50vh 50%)" but got "circle(at 50vh center)" +PASS test unit (inline): vw - circle(at left 50vw) +PASS test unit (inline): vw - circle(at 50vw top) +PASS test unit (inline): vw - circle(at right 80vw) +PASS test unit (inline): vw - circle(at 70vw bottom) +PASS test unit (inline): vw - circle(at center 60vw) +PASS test unit (inline): vw - circle(at 60vw center) +PASS test unit (inline): vw - circle(at left 50% top 50vw) +PASS test unit (inline): vw - circle(at left 50% bottom 70vw) +PASS test unit (inline): vw - circle(at left 50vw top 50%) +PASS test unit (inline): vw - circle(at left 50vw top 50vw) +PASS test unit (inline): vw - circle(at left 50vw bottom 70%) +PASS test unit (inline): vw - circle(at top 50% left 50vw) +PASS test unit (inline): vw - circle(at top 50% right 80vw) +PASS test unit (inline): vw - circle(at top 50vw left 50%) +PASS test unit (inline): vw - circle(at top 50vw left 50vw) +PASS test unit (inline): vw - circle(at top 50vw right 80%) +PASS test unit (inline): vw - circle(at bottom 70% left 50vw) +PASS test unit (inline): vw - circle(at bottom 70% right 80vw) +PASS test unit (inline): vw - circle(at bottom 70vw left 50%) +PASS test unit (inline): vw - circle(at bottom 70vw right 50%) +PASS test unit (inline): vw - circle(at bottom 70vw right 80vw) +PASS test unit (inline): vw - circle(at right 80% top 50vw) +PASS test unit (inline): vw - circle(at right 80% bottom 70vw) +PASS test unit (inline): vw - circle(at right 80vw top 50%) +PASS test unit (inline): vw - circle(at right 80vw bottom 70%) +PASS test unit (inline): vw - circle(at right 80vw bottom 70vw) +PASS test unit (inline): vh - circle(at 50vh) PASS test unit (inline): vh - circle(at 50% 50vh) PASS test unit (inline): vh - circle(at 50vh 50%) PASS test unit (inline): vh - circle(at 50vh 50vh) -FAIL test unit (inline): vh - circle(at left 50vh) assert_equals: expected "circle(at 0% 50vh)" but got "circle(at left 50vh)" -FAIL test unit (inline): vh - circle(at 50vh top) assert_equals: expected "circle(at 50vh 0%)" but got "circle(at 50vh top)" -FAIL test unit (inline): vh - circle(at right 80vh) assert_equals: expected "circle(at 100% 80vh)" but got "circle(at right 80vh)" -FAIL test unit (inline): vh - circle(at 70vh bottom) assert_equals: expected "circle(at 70vh 100%)" but got "circle(at 70vh bottom)" -FAIL test unit (inline): vh - circle(at center 60vh) assert_equals: expected "circle(at 50% 60vh)" but got "circle(at center 60vh)" -FAIL test unit (inline): vh - circle(at 60vh center) assert_equals: expected "circle(at 60vh 50%)" but got "circle(at 60vh center)" -FAIL test unit (inline): vh - circle(at left 50% top 50vh) assert_equals: expected "circle(at 50% 50vh)" but got "circle(at left 50% top 50vh)" -FAIL test unit (inline): vh - circle(at left 50% bottom 70vh) assert_equals: expected "circle(at 50% calc(100% - 70vh))" but got "circle(at left 50% bottom 70vh)" -FAIL test unit (inline): vh - circle(at left 50vh top 50%) assert_equals: expected "circle(at 50vh 50%)" but got "circle(at left 50vh top 50%)" -FAIL test unit (inline): vh - circle(at left 50vh top 50vh) assert_equals: expected "circle(at 50vh 50vh)" but got "circle(at left 50vh top 50vh)" -FAIL test unit (inline): vh - circle(at left 50vh bottom 70%) assert_equals: expected "circle(at 50vh calc(30%))" but got "circle(at left 50vh bottom 70%)" -FAIL test unit (inline): vh - circle(at top 50% left 50vh) assert_equals: expected "circle(at 50vh 50%)" but got "circle(at left 50vh top 50%)" -FAIL test unit (inline): vh - circle(at top 50% right 80vh) assert_equals: expected "circle(at calc(100% - 80vh) 50%)" but got "circle(at right 80vh top 50%)" -FAIL test unit (inline): vh - circle(at top 50vh left 50%) assert_equals: expected "circle(at 50% 50vh)" but got "circle(at left 50% top 50vh)" -FAIL test unit (inline): vh - circle(at top 50vh left 50vh) assert_equals: expected "circle(at 50vh 50vh)" but got "circle(at left 50vh top 50vh)" -FAIL test unit (inline): vh - circle(at top 50vh right 80%) assert_equals: expected "circle(at calc(20%) 50vh)" but got "circle(at right 80% top 50vh)" -FAIL test unit (inline): vh - circle(at bottom 70% left 50vh) assert_equals: expected "circle(at 50vh calc(30%))" but got "circle(at left 50vh bottom 70%)" -FAIL test unit (inline): vh - circle(at bottom 70% right 80vh) assert_equals: expected "circle(at calc(100% - 80vh) calc(30%))" but got "circle(at right 80vh bottom 70%)" -FAIL test unit (inline): vh - circle(at bottom 70vh left 50%) assert_equals: expected "circle(at 50% calc(100% - 70vh))" but got "circle(at left 50% bottom 70vh)" -FAIL test unit (inline): vh - circle(at bottom 70vh right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70vh))" but got "circle(at right 50% bottom 70vh)" -FAIL test unit (inline): vh - circle(at bottom 70vh right 80vh) assert_equals: expected "circle(at calc(100% - 80vh) calc(100% - 70vh))" but got "circle(at right 80vh bottom 70vh)" -FAIL test unit (inline): vh - circle(at right 80% top 50vh) assert_equals: expected "circle(at calc(20%) 50vh)" but got "circle(at right 80% top 50vh)" -FAIL test unit (inline): vh - circle(at right 80% bottom 70vh) assert_equals: expected "circle(at calc(20%) calc(100% - 70vh))" but got "circle(at right 80% bottom 70vh)" -FAIL test unit (inline): vh - circle(at right 80vh top 50%) assert_equals: expected "circle(at calc(100% - 80vh) 50%)" but got "circle(at right 80vh top 50%)" -FAIL test unit (inline): vh - circle(at right 80vh bottom 70%) assert_equals: expected "circle(at calc(100% - 80vh) calc(30%))" but got "circle(at right 80vh bottom 70%)" -FAIL test unit (inline): vh - circle(at right 80vh bottom 70vh) assert_equals: expected "circle(at calc(100% - 80vh) calc(100% - 70vh))" but got "circle(at right 80vh bottom 70vh)" -FAIL test unit (inline): vmin - circle(at 50vmin) assert_equals: expected "circle(at 50vmin 50%)" but got "circle(at 50vmin center)" +PASS test unit (inline): vh - circle(at left 50vh) +PASS test unit (inline): vh - circle(at 50vh top) +PASS test unit (inline): vh - circle(at right 80vh) +PASS test unit (inline): vh - circle(at 70vh bottom) +PASS test unit (inline): vh - circle(at center 60vh) +PASS test unit (inline): vh - circle(at 60vh center) +PASS test unit (inline): vh - circle(at left 50% top 50vh) +PASS test unit (inline): vh - circle(at left 50% bottom 70vh) +PASS test unit (inline): vh - circle(at left 50vh top 50%) +PASS test unit (inline): vh - circle(at left 50vh top 50vh) +PASS test unit (inline): vh - circle(at left 50vh bottom 70%) +PASS test unit (inline): vh - circle(at top 50% left 50vh) +PASS test unit (inline): vh - circle(at top 50% right 80vh) +PASS test unit (inline): vh - circle(at top 50vh left 50%) +PASS test unit (inline): vh - circle(at top 50vh left 50vh) +PASS test unit (inline): vh - circle(at top 50vh right 80%) +PASS test unit (inline): vh - circle(at bottom 70% left 50vh) +PASS test unit (inline): vh - circle(at bottom 70% right 80vh) +PASS test unit (inline): vh - circle(at bottom 70vh left 50%) +PASS test unit (inline): vh - circle(at bottom 70vh right 50%) +PASS test unit (inline): vh - circle(at bottom 70vh right 80vh) +PASS test unit (inline): vh - circle(at right 80% top 50vh) +PASS test unit (inline): vh - circle(at right 80% bottom 70vh) +PASS test unit (inline): vh - circle(at right 80vh top 50%) +PASS test unit (inline): vh - circle(at right 80vh bottom 70%) +PASS test unit (inline): vh - circle(at right 80vh bottom 70vh) +PASS test unit (inline): vmin - circle(at 50vmin) PASS test unit (inline): vmin - circle(at 50% 50vmin) PASS test unit (inline): vmin - circle(at 50vmin 50%) PASS test unit (inline): vmin - circle(at 50vmin 50vmin) -FAIL test unit (inline): vmin - circle(at left 50vmin) assert_equals: expected "circle(at 0% 50vmin)" but got "circle(at left 50vmin)" -FAIL test unit (inline): vmin - circle(at 50vmin top) assert_equals: expected "circle(at 50vmin 0%)" but got "circle(at 50vmin top)" -FAIL test unit (inline): vmin - circle(at right 80vmin) assert_equals: expected "circle(at 100% 80vmin)" but got "circle(at right 80vmin)" -FAIL test unit (inline): vmin - circle(at 70vmin bottom) assert_equals: expected "circle(at 70vmin 100%)" but got "circle(at 70vmin bottom)" -FAIL test unit (inline): vmin - circle(at center 60vmin) assert_equals: expected "circle(at 50% 60vmin)" but got "circle(at center 60vmin)" -FAIL test unit (inline): vmin - circle(at 60vmin center) assert_equals: expected "circle(at 60vmin 50%)" but got "circle(at 60vmin center)" -FAIL test unit (inline): vmin - circle(at left 50% top 50vmin) assert_equals: expected "circle(at 50% 50vmin)" but got "circle(at left 50% top 50vmin)" -FAIL test unit (inline): vmin - circle(at left 50% bottom 70vmin) assert_equals: expected "circle(at 50% calc(100% - 70vmin))" but got "circle(at left 50% bottom 70vmin)" -FAIL test unit (inline): vmin - circle(at left 50vmin top 50%) assert_equals: expected "circle(at 50vmin 50%)" but got "circle(at left 50vmin top 50%)" -FAIL test unit (inline): vmin - circle(at left 50vmin top 50vmin) assert_equals: expected "circle(at 50vmin 50vmin)" but got "circle(at left 50vmin top 50vmin)" -FAIL test unit (inline): vmin - circle(at left 50vmin bottom 70%) assert_equals: expected "circle(at 50vmin calc(30%))" but got "circle(at left 50vmin bottom 70%)" -FAIL test unit (inline): vmin - circle(at top 50% left 50vmin) assert_equals: expected "circle(at 50vmin 50%)" but got "circle(at left 50vmin top 50%)" -FAIL test unit (inline): vmin - circle(at top 50% right 80vmin) assert_equals: expected "circle(at calc(100% - 80vmin) 50%)" but got "circle(at right 80vmin top 50%)" -FAIL test unit (inline): vmin - circle(at top 50vmin left 50%) assert_equals: expected "circle(at 50% 50vmin)" but got "circle(at left 50% top 50vmin)" -FAIL test unit (inline): vmin - circle(at top 50vmin left 50vmin) assert_equals: expected "circle(at 50vmin 50vmin)" but got "circle(at left 50vmin top 50vmin)" -FAIL test unit (inline): vmin - circle(at top 50vmin right 80%) assert_equals: expected "circle(at calc(20%) 50vmin)" but got "circle(at right 80% top 50vmin)" -FAIL test unit (inline): vmin - circle(at bottom 70% left 50vmin) assert_equals: expected "circle(at 50vmin calc(30%))" but got "circle(at left 50vmin bottom 70%)" -FAIL test unit (inline): vmin - circle(at bottom 70% right 80vmin) assert_equals: expected "circle(at calc(100% - 80vmin) calc(30%))" but got "circle(at right 80vmin bottom 70%)" -FAIL test unit (inline): vmin - circle(at bottom 70vmin left 50%) assert_equals: expected "circle(at 50% calc(100% - 70vmin))" but got "circle(at left 50% bottom 70vmin)" -FAIL test unit (inline): vmin - circle(at bottom 70vmin right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70vmin))" but got "circle(at right 50% bottom 70vmin)" -FAIL test unit (inline): vmin - circle(at bottom 70vmin right 80vmin) assert_equals: expected "circle(at calc(100% - 80vmin) calc(100% - 70vmin))" but got "circle(at right 80vmin bottom 70vmin)" -FAIL test unit (inline): vmin - circle(at right 80% top 50vmin) assert_equals: expected "circle(at calc(20%) 50vmin)" but got "circle(at right 80% top 50vmin)" -FAIL test unit (inline): vmin - circle(at right 80% bottom 70vmin) assert_equals: expected "circle(at calc(20%) calc(100% - 70vmin))" but got "circle(at right 80% bottom 70vmin)" -FAIL test unit (inline): vmin - circle(at right 80vmin top 50%) assert_equals: expected "circle(at calc(100% - 80vmin) 50%)" but got "circle(at right 80vmin top 50%)" -FAIL test unit (inline): vmin - circle(at right 80vmin bottom 70%) assert_equals: expected "circle(at calc(100% - 80vmin) calc(30%))" but got "circle(at right 80vmin bottom 70%)" -FAIL test unit (inline): vmin - circle(at right 80vmin bottom 70vmin) assert_equals: expected "circle(at calc(100% - 80vmin) calc(100% - 70vmin))" but got "circle(at right 80vmin bottom 70vmin)" -FAIL test unit (inline): vmax - circle(at 50vmax) assert_equals: expected "circle(at 50vmax 50%)" but got "circle(at 50vmax center)" +PASS test unit (inline): vmin - circle(at left 50vmin) +PASS test unit (inline): vmin - circle(at 50vmin top) +PASS test unit (inline): vmin - circle(at right 80vmin) +PASS test unit (inline): vmin - circle(at 70vmin bottom) +PASS test unit (inline): vmin - circle(at center 60vmin) +PASS test unit (inline): vmin - circle(at 60vmin center) +PASS test unit (inline): vmin - circle(at left 50% top 50vmin) +PASS test unit (inline): vmin - circle(at left 50% bottom 70vmin) +PASS test unit (inline): vmin - circle(at left 50vmin top 50%) +PASS test unit (inline): vmin - circle(at left 50vmin top 50vmin) +PASS test unit (inline): vmin - circle(at left 50vmin bottom 70%) +PASS test unit (inline): vmin - circle(at top 50% left 50vmin) +PASS test unit (inline): vmin - circle(at top 50% right 80vmin) +PASS test unit (inline): vmin - circle(at top 50vmin left 50%) +PASS test unit (inline): vmin - circle(at top 50vmin left 50vmin) +PASS test unit (inline): vmin - circle(at top 50vmin right 80%) +PASS test unit (inline): vmin - circle(at bottom 70% left 50vmin) +PASS test unit (inline): vmin - circle(at bottom 70% right 80vmin) +PASS test unit (inline): vmin - circle(at bottom 70vmin left 50%) +PASS test unit (inline): vmin - circle(at bottom 70vmin right 50%) +PASS test unit (inline): vmin - circle(at bottom 70vmin right 80vmin) +PASS test unit (inline): vmin - circle(at right 80% top 50vmin) +PASS test unit (inline): vmin - circle(at right 80% bottom 70vmin) +PASS test unit (inline): vmin - circle(at right 80vmin top 50%) +PASS test unit (inline): vmin - circle(at right 80vmin bottom 70%) +PASS test unit (inline): vmin - circle(at right 80vmin bottom 70vmin) +PASS test unit (inline): vmax - circle(at 50vmax) PASS test unit (inline): vmax - circle(at 50% 50vmax) PASS test unit (inline): vmax - circle(at 50vmax 50%) PASS test unit (inline): vmax - circle(at 50vmax 50vmax) -FAIL test unit (inline): vmax - circle(at left 50vmax) assert_equals: expected "circle(at 0% 50vmax)" but got "circle(at left 50vmax)" -FAIL test unit (inline): vmax - circle(at 50vmax top) assert_equals: expected "circle(at 50vmax 0%)" but got "circle(at 50vmax top)" -FAIL test unit (inline): vmax - circle(at right 80vmax) assert_equals: expected "circle(at 100% 80vmax)" but got "circle(at right 80vmax)" -FAIL test unit (inline): vmax - circle(at 70vmax bottom) assert_equals: expected "circle(at 70vmax 100%)" but got "circle(at 70vmax bottom)" -FAIL test unit (inline): vmax - circle(at center 60vmax) assert_equals: expected "circle(at 50% 60vmax)" but got "circle(at center 60vmax)" -FAIL test unit (inline): vmax - circle(at 60vmax center) assert_equals: expected "circle(at 60vmax 50%)" but got "circle(at 60vmax center)" -FAIL test unit (inline): vmax - circle(at left 50% top 50vmax) assert_equals: expected "circle(at 50% 50vmax)" but got "circle(at left 50% top 50vmax)" -FAIL test unit (inline): vmax - circle(at left 50% bottom 70vmax) assert_equals: expected "circle(at 50% calc(100% - 70vmax))" but got "circle(at left 50% bottom 70vmax)" -FAIL test unit (inline): vmax - circle(at left 50vmax top 50%) assert_equals: expected "circle(at 50vmax 50%)" but got "circle(at left 50vmax top 50%)" -FAIL test unit (inline): vmax - circle(at left 50vmax top 50vmax) assert_equals: expected "circle(at 50vmax 50vmax)" but got "circle(at left 50vmax top 50vmax)" -FAIL test unit (inline): vmax - circle(at left 50vmax bottom 70%) assert_equals: expected "circle(at 50vmax calc(30%))" but got "circle(at left 50vmax bottom 70%)" -FAIL test unit (inline): vmax - circle(at top 50% left 50vmax) assert_equals: expected "circle(at 50vmax 50%)" but got "circle(at left 50vmax top 50%)" -FAIL test unit (inline): vmax - circle(at top 50% right 80vmax) assert_equals: expected "circle(at calc(100% - 80vmax) 50%)" but got "circle(at right 80vmax top 50%)" -FAIL test unit (inline): vmax - circle(at top 50vmax left 50%) assert_equals: expected "circle(at 50% 50vmax)" but got "circle(at left 50% top 50vmax)" -FAIL test unit (inline): vmax - circle(at top 50vmax left 50vmax) assert_equals: expected "circle(at 50vmax 50vmax)" but got "circle(at left 50vmax top 50vmax)" -FAIL test unit (inline): vmax - circle(at top 50vmax right 80%) assert_equals: expected "circle(at calc(20%) 50vmax)" but got "circle(at right 80% top 50vmax)" -FAIL test unit (inline): vmax - circle(at bottom 70% left 50vmax) assert_equals: expected "circle(at 50vmax calc(30%))" but got "circle(at left 50vmax bottom 70%)" -FAIL test unit (inline): vmax - circle(at bottom 70% right 80vmax) assert_equals: expected "circle(at calc(100% - 80vmax) calc(30%))" but got "circle(at right 80vmax bottom 70%)" -FAIL test unit (inline): vmax - circle(at bottom 70vmax left 50%) assert_equals: expected "circle(at 50% calc(100% - 70vmax))" but got "circle(at left 50% bottom 70vmax)" -FAIL test unit (inline): vmax - circle(at bottom 70vmax right 50%) assert_equals: expected "circle(at calc(50%) calc(100% - 70vmax))" but got "circle(at right 50% bottom 70vmax)" -FAIL test unit (inline): vmax - circle(at bottom 70vmax right 80vmax) assert_equals: expected "circle(at calc(100% - 80vmax) calc(100% - 70vmax))" but got "circle(at right 80vmax bottom 70vmax)" -FAIL test unit (inline): vmax - circle(at right 80% top 50vmax) assert_equals: expected "circle(at calc(20%) 50vmax)" but got "circle(at right 80% top 50vmax)" -FAIL test unit (inline): vmax - circle(at right 80% bottom 70vmax) assert_equals: expected "circle(at calc(20%) calc(100% - 70vmax))" but got "circle(at right 80% bottom 70vmax)" -FAIL test unit (inline): vmax - circle(at right 80vmax top 50%) assert_equals: expected "circle(at calc(100% - 80vmax) 50%)" but got "circle(at right 80vmax top 50%)" -FAIL test unit (inline): vmax - circle(at right 80vmax bottom 70%) assert_equals: expected "circle(at calc(100% - 80vmax) calc(30%))" but got "circle(at right 80vmax bottom 70%)" -FAIL test unit (inline): vmax - circle(at right 80vmax bottom 70vmax) assert_equals: expected "circle(at calc(100% - 80vmax) calc(100% - 70vmax))" but got "circle(at right 80vmax bottom 70vmax)" +PASS test unit (inline): vmax - circle(at left 50vmax) +PASS test unit (inline): vmax - circle(at 50vmax top) +PASS test unit (inline): vmax - circle(at right 80vmax) +PASS test unit (inline): vmax - circle(at 70vmax bottom) +PASS test unit (inline): vmax - circle(at center 60vmax) +PASS test unit (inline): vmax - circle(at 60vmax center) +PASS test unit (inline): vmax - circle(at left 50% top 50vmax) +PASS test unit (inline): vmax - circle(at left 50% bottom 70vmax) +PASS test unit (inline): vmax - circle(at left 50vmax top 50%) +PASS test unit (inline): vmax - circle(at left 50vmax top 50vmax) +PASS test unit (inline): vmax - circle(at left 50vmax bottom 70%) +PASS test unit (inline): vmax - circle(at top 50% left 50vmax) +PASS test unit (inline): vmax - circle(at top 50% right 80vmax) +PASS test unit (inline): vmax - circle(at top 50vmax left 50%) +PASS test unit (inline): vmax - circle(at top 50vmax left 50vmax) +PASS test unit (inline): vmax - circle(at top 50vmax right 80%) +PASS test unit (inline): vmax - circle(at bottom 70% left 50vmax) +PASS test unit (inline): vmax - circle(at bottom 70% right 80vmax) +PASS test unit (inline): vmax - circle(at bottom 70vmax left 50%) +PASS test unit (inline): vmax - circle(at bottom 70vmax right 50%) +PASS test unit (inline): vmax - circle(at bottom 70vmax right 80vmax) +PASS test unit (inline): vmax - circle(at right 80% top 50vmax) +PASS test unit (inline): vmax - circle(at right 80% bottom 70vmax) +PASS test unit (inline): vmax - circle(at right 80vmax top 50%) +PASS test unit (inline): vmax - circle(at right 80vmax bottom 70%) +PASS test unit (inline): vmax - circle(at right 80vmax bottom 70vmax) PASS test unit (computed): cm - circle(at 50cm) PASS test unit (computed): cm - circle(at 50% 50cm) PASS test unit (computed): cm - circle(at 50cm 50%) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009-expected.txt index fb0634f5feb7..d4650fffed79 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009-expected.txt @@ -1,16 +1,16 @@ -FAIL circle(at +50px) - inline assert_equals: expected "circle(at 50px 50%)" but got "circle(at 50px center)" -FAIL circle(at -50px) - inline assert_equals: expected "circle(at -50px 50%)" but got "circle(at -50px center)" -FAIL circle(at +50%) - inline assert_equals: expected "circle(at 50% 50%)" but got "circle(at 50% center)" -FAIL circle(at -50%) - inline assert_equals: expected "circle(at -50% 50%)" but got "circle(at -50% center)" -FAIL circle(at left +50px) - inline assert_equals: expected "circle(at 0% 50px)" but got "circle(at left 50px)" -FAIL circle(at left +50%) - inline assert_equals: expected "circle(at 0% 50%)" but got "circle(at left 50%)" -FAIL circle(at right -50px) - inline assert_equals: expected "circle(at 100% -50px)" but got "circle(at right -50px)" -FAIL circle(at right -50%) - inline assert_equals: expected "circle(at 100% -50%)" but got "circle(at right -50%)" -FAIL circle(at +50px top) - inline assert_equals: expected "circle(at 50px 0%)" but got "circle(at 50px top)" -FAIL circle(at +50% top) - inline assert_equals: expected "circle(at 50% 0%)" but got "circle(at 50% top)" -FAIL circle(at -50px bottom) - inline assert_equals: expected "circle(at -50px 100%)" but got "circle(at -50px bottom)" -FAIL circle(at -50% bottom) - inline assert_equals: expected "circle(at -50% 100%)" but got "circle(at -50% bottom)" +PASS circle(at +50px) - inline +PASS circle(at -50px) - inline +PASS circle(at +50%) - inline +PASS circle(at -50%) - inline +PASS circle(at left +50px) - inline +PASS circle(at left +50%) - inline +PASS circle(at right -50px) - inline +PASS circle(at right -50%) - inline +PASS circle(at +50px top) - inline +PASS circle(at +50% top) - inline +PASS circle(at -50px bottom) - inline +PASS circle(at -50% bottom) - inline PASS circle(at +50px +50px) - inline PASS circle(at +50% +50%) - inline PASS circle(at -50px -50px) - inline diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009.html index 1aebc3cf096e..a1d74ad9fc65 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-009.html @@ -21,62 +21,62 @@ var valid_circle_radii_tests = [ { "actual": "circle(at +50px)", - "expected_inline": "circle(at 50px 50%)", + "expected_inline": "circle(at 50px center)", "expected_computed": "circle(at 50px 50%)" }, { "actual": "circle(at -50px)", - "expected_inline": "circle(at -50px 50%)", + "expected_inline": "circle(at -50px center)", "expected_computed": "circle(at -50px 50%)" }, { "actual": "circle(at +50%)", - "expected_inline": "circle(at 50% 50%)", + "expected_inline": "circle(at 50% center)", "expected_computed": "circle(at 50% 50%)" }, { "actual": "circle(at -50%)", - "expected_inline": "circle(at -50% 50%)", + "expected_inline": "circle(at -50% center)", "expected_computed": "circle(at -50% 50%)" }, { "actual": "circle(at left +50px)", - "expected_inline": "circle(at 0% 50px)", + "expected_inline": "circle(at left 50px)", "expected_computed": "circle(at 0% 50px)" }, { "actual": "circle(at left +50%)", - "expected_inline": "circle(at 0% 50%)", + "expected_inline": "circle(at left 50%)", "expected_computed": "circle(at 0% 50%)" }, { "actual": "circle(at right -50px)", - "expected_inline": "circle(at 100% -50px)", + "expected_inline": "circle(at right -50px)", "expected_computed": "circle(at 100% -50px)" }, { "actual": "circle(at right -50%)", - "expected_inline": "circle(at 100% -50%)", + "expected_inline": "circle(at right -50%)", "expected_computed": "circle(at 100% -50%)" }, { "actual": "circle(at +50px top)", - "expected_inline": "circle(at 50px 0%)", + "expected_inline": "circle(at 50px top)", "expected_computed": "circle(at 50px 0%)" }, { "actual": "circle(at +50% top)", - "expected_inline": "circle(at 50% 0%)", + "expected_inline": "circle(at 50% top)", "expected_computed": "circle(at 50% 0%)" }, { "actual": "circle(at -50px bottom)", - "expected_inline": "circle(at -50px 100%)", + "expected_inline": "circle(at -50px bottom)", "expected_computed": "circle(at -50px 100%)" }, { "actual": "circle(at -50% bottom)", - "expected_inline": "circle(at -50% 100%)", + "expected_inline": "circle(at -50% bottom)", "expected_computed": "circle(at -50% 100%)" }, { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011-expected.txt index 19893bab48c0..5297249fb9ea 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011-expected.txt @@ -1,11 +1,11 @@ -FAIL circle(at calc(10in)) - inline style assert_equals: expected "circle(at calc(960px) 50%)" but got "circle(at calc(960px) center)" -FAIL circle(at calc(10in + 20px)) - inline style assert_equals: expected "circle(at calc(980px) 50%)" but got "circle(at calc(980px) center)" -FAIL circle(at calc(30%)) - inline style assert_equals: expected "circle(at calc(30%) 50%)" but got "circle(at calc(30%) center)" -FAIL circle(at calc(100%/4)) - inline style assert_equals: expected "circle(at calc(25%) 50%)" but got "circle(at calc(25%) center)" -FAIL circle(at calc(25%*3)) - inline style assert_equals: expected "circle(at calc(75%) 50%)" but got "circle(at calc(75%) center)" -FAIL circle(at calc(25%*3 - 10in)) - inline style assert_equals: expected "circle(at calc(75% - 960px) 50%)" but got "circle(at calc(75% - 960px) center)" -FAIL circle(at calc((12.5%*6 + 10in) / 4)) - inline style assert_equals: expected "circle(at calc(18.75% + 240px) 50%)" but got "circle(at calc(18.75% + 240px) center)" +PASS circle(at calc(10in)) - inline style +PASS circle(at calc(10in + 20px)) - inline style +PASS circle(at calc(30%)) - inline style +PASS circle(at calc(100%/4)) - inline style +PASS circle(at calc(25%*3)) - inline style +PASS circle(at calc(25%*3 - 10in)) - inline style +PASS circle(at calc((12.5%*6 + 10in) / 4)) - inline style PASS circle(at calc(10in)) - computed style PASS circle(at calc(10in + 20px)) - computed style PASS circle(at calc(30%)) - computed style diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011.html index cca245e41144..a42bdcd5b921 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-circle-011.html @@ -21,7 +21,7 @@ var circle_position_calc_tests = []; ParsingUtils.calcTestValues.forEach(function(value) { testCase = ['circle(at '+ value[0] +')', - 'circle(at '+ value[1] +' 50%)']; + 'circle(at '+ value[1] +' center)']; if(Object.prototype.toString.call( value[2] ) === '[object Array]' && value[2].length == 2) { testCase.push([ 'circle(at '+ value[2][0] +' 50%)', 'circle(at '+ value[2][1] +' 50%)' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-002-expected.txt index d391a3e7f1c1..bbae6ae7fca5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-002-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-002-expected.txt @@ -1,72 +1,72 @@ -FAIL ellipse(at 50%) serializes as ellipse(at 50% 50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at 50% center)" -FAIL ellipse(at 50px) serializes as ellipse(at 50px 50%) - inline assert_equals: expected "ellipse(at 50px 50%)" but got "ellipse(at 50px center)" +PASS ellipse(at 50%) serializes as ellipse(at 50% center) - inline +PASS ellipse(at 50px) serializes as ellipse(at 50px center) - inline PASS ellipse(at 50% 50%) serializes as ellipse(at 50% 50%) - inline PASS ellipse(at 50% 50px) serializes as ellipse(at 50% 50px) - inline PASS ellipse(at 50px 50%) serializes as ellipse(at 50px 50%) - inline PASS ellipse(at 50px 50px) serializes as ellipse(at 50px 50px) - inline -FAIL ellipse(at left) serializes as ellipse(at 0% 50%) - inline assert_equals: expected "ellipse(at 0% 50%)" but got "ellipse(at left center)" -FAIL ellipse(at top) serializes as ellipse(at 50% 0%) - inline assert_equals: expected "ellipse(at 50% 0%)" but got "ellipse(at center top)" -FAIL ellipse(at right) serializes as ellipse(at 100% 50%) - inline assert_equals: expected "ellipse(at 100% 50%)" but got "ellipse(at right center)" -FAIL ellipse(at bottom) serializes as ellipse(at 50% 100%) - inline assert_equals: expected "ellipse(at 50% 100%)" but got "ellipse(at center bottom)" -FAIL ellipse(at center) serializes as ellipse(at 50% 50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at center center)" -FAIL ellipse(at left top) serializes as ellipse(at 0% 0%) - inline assert_equals: expected "ellipse(at 0% 0%)" but got "ellipse(at left top)" -FAIL ellipse(at left bottom) serializes as ellipse(at 0% 100%) - inline assert_equals: expected "ellipse(at 0% 100%)" but got "ellipse(at left bottom)" -FAIL ellipse(at left center) serializes as ellipse(at 0% 50%) - inline assert_equals: expected "ellipse(at 0% 50%)" but got "ellipse(at left center)" -FAIL ellipse(at top left) serializes as ellipse(at 0% 0%) - inline assert_equals: expected "ellipse(at 0% 0%)" but got "ellipse(at left top)" -FAIL ellipse(at top right) serializes as ellipse(at 100% 0%) - inline assert_equals: expected "ellipse(at 100% 0%)" but got "ellipse(at right top)" -FAIL ellipse(at top center) serializes as ellipse(at 50% 0%) - inline assert_equals: expected "ellipse(at 50% 0%)" but got "ellipse(at center top)" -FAIL ellipse(at right top) serializes as ellipse(at 100% 0%) - inline assert_equals: expected "ellipse(at 100% 0%)" but got "ellipse(at right top)" -FAIL ellipse(at right bottom) serializes as ellipse(at 100% 100%) - inline assert_equals: expected "ellipse(at 100% 100%)" but got "ellipse(at right bottom)" -FAIL ellipse(at right center) serializes as ellipse(at 100% 50%) - inline assert_equals: expected "ellipse(at 100% 50%)" but got "ellipse(at right center)" -FAIL ellipse(at bottom left) serializes as ellipse(at 0% 100%) - inline assert_equals: expected "ellipse(at 0% 100%)" but got "ellipse(at left bottom)" -FAIL ellipse(at bottom right) serializes as ellipse(at 100% 100%) - inline assert_equals: expected "ellipse(at 100% 100%)" but got "ellipse(at right bottom)" -FAIL ellipse(at bottom center) serializes as ellipse(at 50% 100%) - inline assert_equals: expected "ellipse(at 50% 100%)" but got "ellipse(at center bottom)" -FAIL ellipse(at center top) serializes as ellipse(at 50% 0%) - inline assert_equals: expected "ellipse(at 50% 0%)" but got "ellipse(at center top)" -FAIL ellipse(at center left) serializes as ellipse(at 0% 50%) - inline assert_equals: expected "ellipse(at 0% 50%)" but got "ellipse(at left center)" -FAIL ellipse(at center right) serializes as ellipse(at 100% 50%) - inline assert_equals: expected "ellipse(at 100% 50%)" but got "ellipse(at right center)" -FAIL ellipse(at center bottom) serializes as ellipse(at 50% 100%) - inline assert_equals: expected "ellipse(at 50% 100%)" but got "ellipse(at center bottom)" -FAIL ellipse(at center center) serializes as ellipse(at 50% 50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at center center)" -FAIL ellipse(at left 50%) serializes as ellipse(at 0% 50%) - inline assert_equals: expected "ellipse(at 0% 50%)" but got "ellipse(at left 50%)" -FAIL ellipse(at left 50px) serializes as ellipse(at 0% 50px) - inline assert_equals: expected "ellipse(at 0% 50px)" but got "ellipse(at left 50px)" -FAIL ellipse(at 50% top) serializes as ellipse(at 50% 0%) - inline assert_equals: expected "ellipse(at 50% 0%)" but got "ellipse(at 50% top)" -FAIL ellipse(at 50px top) serializes as ellipse(at 50px 0%) - inline assert_equals: expected "ellipse(at 50px 0%)" but got "ellipse(at 50px top)" -FAIL ellipse(at right 80%) serializes as ellipse(at 100% 80%) - inline assert_equals: expected "ellipse(at 100% 80%)" but got "ellipse(at right 80%)" -FAIL ellipse(at right 80px) serializes as ellipse(at 100% 80px) - inline assert_equals: expected "ellipse(at 100% 80px)" but got "ellipse(at right 80px)" -FAIL ellipse(at 70% bottom) serializes as ellipse(at 70% 100%) - inline assert_equals: expected "ellipse(at 70% 100%)" but got "ellipse(at 70% bottom)" -FAIL ellipse(at 70px bottom) serializes as ellipse(at 70px 100%) - inline assert_equals: expected "ellipse(at 70px 100%)" but got "ellipse(at 70px bottom)" -FAIL ellipse(at center 60%) serializes as ellipse(at 50% 60%) - inline assert_equals: expected "ellipse(at 50% 60%)" but got "ellipse(at center 60%)" -FAIL ellipse(at center 60px) serializes as ellipse(at 50% 60px) - inline assert_equals: expected "ellipse(at 50% 60px)" but got "ellipse(at center 60px)" -FAIL ellipse(at 60% center) serializes as ellipse(at 60% 50%) - inline assert_equals: expected "ellipse(at 60% 50%)" but got "ellipse(at 60% center)" -FAIL ellipse(at 60px center) serializes as ellipse(at 60px 50%) - inline assert_equals: expected "ellipse(at 60px 50%)" but got "ellipse(at 60px center)" -FAIL ellipse(at left 50% top 50%) serializes as ellipse(at 50% 50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at left 50% top 50%)" -FAIL ellipse(at left 50% top 50px) serializes as ellipse(at 50% 50px) - inline assert_equals: expected "ellipse(at 50% 50px)" but got "ellipse(at left 50% top 50px)" -FAIL ellipse(at left 50% bottom 70%) serializes as ellipse(at 50% calc(30%)) - inline assert_equals: expected "ellipse(at 50% calc(30%))" but got "ellipse(at left 50% bottom 70%)" -FAIL ellipse(at left 50% bottom 70px) serializes as ellipse(at 50% calc(100% - 70px)) - inline assert_equals: expected "ellipse(at 50% calc(100% - 70px))" but got "ellipse(at left 50% bottom 70px)" -FAIL ellipse(at left 50px top 50%) serializes as ellipse(at 50px 50%) - inline assert_equals: expected "ellipse(at 50px 50%)" but got "ellipse(at left 50px top 50%)" -FAIL ellipse(at left 50px top 50px) serializes as ellipse(at 50px 50px) - inline assert_equals: expected "ellipse(at 50px 50px)" but got "ellipse(at left 50px top 50px)" -FAIL ellipse(at left 50px bottom 70%) serializes as ellipse(at 50px calc(30%)) - inline assert_equals: expected "ellipse(at 50px calc(30%))" but got "ellipse(at left 50px bottom 70%)" -FAIL ellipse(at top 50% left 50%) serializes as ellipse(at 50% 50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at left 50% top 50%)" -FAIL ellipse(at top 50% left 50px) serializes as ellipse(at 50px 50%) - inline assert_equals: expected "ellipse(at 50px 50%)" but got "ellipse(at left 50px top 50%)" -FAIL ellipse(at top 50% right 80%) serializes as ellipse(at calc(20%) 50%) - inline assert_equals: expected "ellipse(at calc(20%) 50%)" but got "ellipse(at right 80% top 50%)" -FAIL ellipse(at top 50% right 80px) serializes as ellipse(at calc(100% - 80px) 50%) - inline assert_equals: expected "ellipse(at calc(100% - 80px) 50%)" but got "ellipse(at right 80px top 50%)" -FAIL ellipse(at top 50px left 50%) serializes as ellipse(at 50% 50px) - inline assert_equals: expected "ellipse(at 50% 50px)" but got "ellipse(at left 50% top 50px)" -FAIL ellipse(at top 50px left 50px) serializes as ellipse(at 50px 50px) - inline assert_equals: expected "ellipse(at 50px 50px)" but got "ellipse(at left 50px top 50px)" -FAIL ellipse(at top 50px right 80%) serializes as ellipse(at calc(20%) 50px) - inline assert_equals: expected "ellipse(at calc(20%) 50px)" but got "ellipse(at right 80% top 50px)" -FAIL ellipse(at bottom 70% left 50%) serializes as ellipse(at 50% calc(30%)) - inline assert_equals: expected "ellipse(at 50% calc(30%))" but got "ellipse(at left 50% bottom 70%)" -FAIL ellipse(at bottom 70% left 50px) serializes as ellipse(at 50px calc(30%)) - inline assert_equals: expected "ellipse(at 50px calc(30%))" but got "ellipse(at left 50px bottom 70%)" -FAIL ellipse(at bottom 70% right 80%) serializes as ellipse(at calc(20%) calc(30%)) - inline assert_equals: expected "ellipse(at calc(20%) calc(30%))" but got "ellipse(at right 80% bottom 70%)" -FAIL ellipse(at bottom 70% right 80px) serializes as ellipse(at calc(100% - 80px) calc(30%)) - inline assert_equals: expected "ellipse(at calc(100% - 80px) calc(30%))" but got "ellipse(at right 80px bottom 70%)" -FAIL ellipse(at bottom 70px left 50%) serializes as ellipse(at 50% calc(100% - 70px)) - inline assert_equals: expected "ellipse(at 50% calc(100% - 70px))" but got "ellipse(at left 50% bottom 70px)" -FAIL ellipse(at bottom 70px right 50%) serializes as ellipse(at calc(50%) calc(100% - 70px)) - inline assert_equals: expected "ellipse(at calc(50%) calc(100% - 70px))" but got "ellipse(at right 50% bottom 70px)" -FAIL ellipse(at bottom 70px right 80px) serializes as ellipse(at calc(100% - 80px) calc(100% - 70px)) - inline assert_equals: expected "ellipse(at calc(100% - 80px) calc(100% - 70px))" but got "ellipse(at right 80px bottom 70px)" -FAIL ellipse(at right 80% top 50%) serializes as ellipse(at calc(20%) 50%) - inline assert_equals: expected "ellipse(at calc(20%) 50%)" but got "ellipse(at right 80% top 50%)" -FAIL ellipse(at right 80% top 50px) serializes as ellipse(at calc(20%) 50px) - inline assert_equals: expected "ellipse(at calc(20%) 50px)" but got "ellipse(at right 80% top 50px)" -FAIL ellipse(at right 80% bottom 70%) serializes as ellipse(at calc(20%) calc(30%)) - inline assert_equals: expected "ellipse(at calc(20%) calc(30%))" but got "ellipse(at right 80% bottom 70%)" -FAIL ellipse(at right 80% bottom 70px) serializes as ellipse(at calc(20%) calc(100% - 70px)) - inline assert_equals: expected "ellipse(at calc(20%) calc(100% - 70px))" but got "ellipse(at right 80% bottom 70px)" -FAIL ellipse(at right 80px top 50%) serializes as ellipse(at calc(100% - 80px) 50%) - inline assert_equals: expected "ellipse(at calc(100% - 80px) 50%)" but got "ellipse(at right 80px top 50%)" -FAIL ellipse(at right 80px bottom 70%) serializes as ellipse(at calc(100% - 80px) calc(30%)) - inline assert_equals: expected "ellipse(at calc(100% - 80px) calc(30%))" but got "ellipse(at right 80px bottom 70%)" -FAIL ellipse(at right 80px bottom 70px) serializes as ellipse(at calc(100% - 80px) calc(100% - 70px)) - inline assert_equals: expected "ellipse(at calc(100% - 80px) calc(100% - 70px))" but got "ellipse(at right 80px bottom 70px)" +PASS ellipse(at left) serializes as ellipse(at left center) - inline +PASS ellipse(at top) serializes as ellipse(at center top) - inline +PASS ellipse(at right) serializes as ellipse(at right center) - inline +PASS ellipse(at bottom) serializes as ellipse(at center bottom) - inline +PASS ellipse(at center) serializes as ellipse(at center center) - inline +PASS ellipse(at left top) serializes as ellipse(at left top) - inline +PASS ellipse(at left bottom) serializes as ellipse(at left bottom) - inline +PASS ellipse(at left center) serializes as ellipse(at left center) - inline +PASS ellipse(at top left) serializes as ellipse(at left top) - inline +PASS ellipse(at top right) serializes as ellipse(at right top) - inline +PASS ellipse(at top center) serializes as ellipse(at center top) - inline +PASS ellipse(at right top) serializes as ellipse(at right top) - inline +PASS ellipse(at right bottom) serializes as ellipse(at right bottom) - inline +PASS ellipse(at right center) serializes as ellipse(at right center) - inline +PASS ellipse(at bottom left) serializes as ellipse(at left bottom) - inline +PASS ellipse(at bottom right) serializes as ellipse(at right bottom) - inline +PASS ellipse(at bottom center) serializes as ellipse(at center bottom) - inline +PASS ellipse(at center top) serializes as ellipse(at center top) - inline +PASS ellipse(at center left) serializes as ellipse(at left center) - inline +PASS ellipse(at center right) serializes as ellipse(at right center) - inline +PASS ellipse(at center bottom) serializes as ellipse(at center bottom) - inline +PASS ellipse(at center center) serializes as ellipse(at center center) - inline +PASS ellipse(at left 50%) serializes as ellipse(at left 50%) - inline +PASS ellipse(at left 50px) serializes as ellipse(at left 50px) - inline +PASS ellipse(at 50% top) serializes as ellipse(at 50% top) - inline +PASS ellipse(at 50px top) serializes as ellipse(at 50px top) - inline +PASS ellipse(at right 80%) serializes as ellipse(at right 80%) - inline +PASS ellipse(at right 80px) serializes as ellipse(at right 80px) - inline +PASS ellipse(at 70% bottom) serializes as ellipse(at 70% bottom) - inline +PASS ellipse(at 70px bottom) serializes as ellipse(at 70px bottom) - inline +PASS ellipse(at center 60%) serializes as ellipse(at center 60%) - inline +PASS ellipse(at center 60px) serializes as ellipse(at center 60px) - inline +PASS ellipse(at 60% center) serializes as ellipse(at 60% center) - inline +PASS ellipse(at 60px center) serializes as ellipse(at 60px center) - inline +PASS ellipse(at left 50% top 50%) serializes as ellipse(at left 50% top 50%) - inline +PASS ellipse(at left 50% top 50px) serializes as ellipse(at left 50% top 50px) - inline +PASS ellipse(at left 50% bottom 70%) serializes as ellipse(at left 50% bottom 70%) - inline +PASS ellipse(at left 50% bottom 70px) serializes as ellipse(at left 50% bottom 70px) - inline +PASS ellipse(at left 50px top 50%) serializes as ellipse(at left 50px top 50%) - inline +PASS ellipse(at left 50px top 50px) serializes as ellipse(at left 50px top 50px) - inline +PASS ellipse(at left 50px bottom 70%) serializes as ellipse(at left 50px bottom 70%) - inline +PASS ellipse(at top 50% left 50%) serializes as ellipse(at left 50% top 50%) - inline +PASS ellipse(at top 50% left 50px) serializes as ellipse(at left 50px top 50%) - inline +PASS ellipse(at top 50% right 80%) serializes as ellipse(at right 80% top 50%) - inline +PASS ellipse(at top 50% right 80px) serializes as ellipse(at right 80px top 50%) - inline +PASS ellipse(at top 50px left 50%) serializes as ellipse(at left 50% top 50px) - inline +PASS ellipse(at top 50px left 50px) serializes as ellipse(at left 50px top 50px) - inline +PASS ellipse(at top 50px right 80%) serializes as ellipse(at right 80% top 50px) - inline +PASS ellipse(at bottom 70% left 50%) serializes as ellipse(at left 50% bottom 70%) - inline +PASS ellipse(at bottom 70% left 50px) serializes as ellipse(at left 50px bottom 70%) - inline +PASS ellipse(at bottom 70% right 80%) serializes as ellipse(at right 80% bottom 70%) - inline +PASS ellipse(at bottom 70% right 80px) serializes as ellipse(at right 80px bottom 70%) - inline +PASS ellipse(at bottom 70px left 50%) serializes as ellipse(at left 50% bottom 70px) - inline +PASS ellipse(at bottom 70px right 50%) serializes as ellipse(at right 50% bottom 70px) - inline +PASS ellipse(at bottom 70px right 80px) serializes as ellipse(at right 80px bottom 70px) - inline +PASS ellipse(at right 80% top 50%) serializes as ellipse(at right 80% top 50%) - inline +PASS ellipse(at right 80% top 50px) serializes as ellipse(at right 80% top 50px) - inline +PASS ellipse(at right 80% bottom 70%) serializes as ellipse(at right 80% bottom 70%) - inline +PASS ellipse(at right 80% bottom 70px) serializes as ellipse(at right 80% bottom 70px) - inline +PASS ellipse(at right 80px top 50%) serializes as ellipse(at right 80px top 50%) - inline +PASS ellipse(at right 80px bottom 70%) serializes as ellipse(at right 80px bottom 70%) - inline +PASS ellipse(at right 80px bottom 70px) serializes as ellipse(at right 80px bottom 70px) - inline PASS ellipse(at 50%) serializes as ellipse(at 50% 50%) - computed PASS ellipse(at 50px) serializes as ellipse(at 50px 50%) - computed PASS ellipse(at 50% 50%) serializes as ellipse(at 50% 50%) - computed diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-004-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-004-expected.txt index e82c96a9963a..136eb51bd25e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-004-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-004-expected.txt @@ -1,394 +1,394 @@ -FAIL test unit (inline): cm - ellipse(at 50cm) assert_equals: expected "ellipse(at 50cm 50%)" but got "ellipse(at 50cm center)" +PASS test unit (inline): cm - ellipse(at 50cm) PASS test unit (inline): cm - ellipse(at 50% 50cm) PASS test unit (inline): cm - ellipse(at 50cm 50%) PASS test unit (inline): cm - ellipse(at 50cm 50cm) -FAIL test unit (inline): cm - ellipse(at left 50cm) assert_equals: expected "ellipse(at 0% 50cm)" but got "ellipse(at left 50cm)" -FAIL test unit (inline): cm - ellipse(at 50cm top) assert_equals: expected "ellipse(at 50cm 0%)" but got "ellipse(at 50cm top)" -FAIL test unit (inline): cm - ellipse(at right 80cm) assert_equals: expected "ellipse(at 100% 80cm)" but got "ellipse(at right 80cm)" -FAIL test unit (inline): cm - ellipse(at 70cm bottom) assert_equals: expected "ellipse(at 70cm 100%)" but got "ellipse(at 70cm bottom)" -FAIL test unit (inline): cm - ellipse(at center 60cm) assert_equals: expected "ellipse(at 50% 60cm)" but got "ellipse(at center 60cm)" -FAIL test unit (inline): cm - ellipse(at 60cm center) assert_equals: expected "ellipse(at 60cm 50%)" but got "ellipse(at 60cm center)" -FAIL test unit (inline): cm - ellipse(at left 50% top 50cm) assert_equals: expected "ellipse(at 50% 50cm)" but got "ellipse(at left 50% top 50cm)" -FAIL test unit (inline): cm - ellipse(at left 50% bottom 70cm) assert_equals: expected "ellipse(at 50% calc(100% - 2645.67px))" but got "ellipse(at left 50% bottom 70cm)" -FAIL test unit (inline): cm - ellipse(at left 50cm top 50%) assert_equals: expected "ellipse(at 50cm 50%)" but got "ellipse(at left 50cm top 50%)" -FAIL test unit (inline): cm - ellipse(at left 50cm top 50cm) assert_equals: expected "ellipse(at 50cm 50cm)" but got "ellipse(at left 50cm top 50cm)" -FAIL test unit (inline): cm - ellipse(at left 50cm bottom 70%) assert_equals: expected "ellipse(at 50cm calc(30%))" but got "ellipse(at left 50cm bottom 70%)" -FAIL test unit (inline): cm - ellipse(at top 50% left 50cm) assert_equals: expected "ellipse(at 50cm 50%)" but got "ellipse(at left 50cm top 50%)" -FAIL test unit (inline): cm - ellipse(at top 50% right 80cm) assert_equals: expected "ellipse(at calc(100% - 3023.62px) 50%)" but got "ellipse(at right 80cm top 50%)" -FAIL test unit (inline): cm - ellipse(at top 50cm left 50%) assert_equals: expected "ellipse(at 50% 50cm)" but got "ellipse(at left 50% top 50cm)" -FAIL test unit (inline): cm - ellipse(at top 50cm left 50cm) assert_equals: expected "ellipse(at 50cm 50cm)" but got "ellipse(at left 50cm top 50cm)" -FAIL test unit (inline): cm - ellipse(at top 50cm right 80%) assert_equals: expected "ellipse(at calc(20%) 50cm)" but got "ellipse(at right 80% top 50cm)" -FAIL test unit (inline): cm - ellipse(at bottom 70% left 50cm) assert_equals: expected "ellipse(at 50cm calc(30%))" but got "ellipse(at left 50cm bottom 70%)" -FAIL test unit (inline): cm - ellipse(at bottom 70% right 80cm) assert_equals: expected "ellipse(at calc(100% - 3023.62px) calc(30%))" but got "ellipse(at right 80cm bottom 70%)" -FAIL test unit (inline): cm - ellipse(at bottom 70cm left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 2645.67px))" but got "ellipse(at left 50% bottom 70cm)" -FAIL test unit (inline): cm - ellipse(at bottom 70cm right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 2645.67px))" but got "ellipse(at right 50% bottom 70cm)" -FAIL test unit (inline): cm - ellipse(at bottom 70cm right 80cm) assert_equals: expected "ellipse(at calc(100% - 3023.62px) calc(100% - 2645.67px))" but got "ellipse(at right 80cm bottom 70cm)" -FAIL test unit (inline): cm - ellipse(at right 80% top 50cm) assert_equals: expected "ellipse(at calc(20%) 50cm)" but got "ellipse(at right 80% top 50cm)" -FAIL test unit (inline): cm - ellipse(at right 80% bottom 70cm) assert_equals: expected "ellipse(at calc(20%) calc(100% - 2645.67px))" but got "ellipse(at right 80% bottom 70cm)" -FAIL test unit (inline): cm - ellipse(at right 80cm top 50%) assert_equals: expected "ellipse(at calc(100% - 3023.62px) 50%)" but got "ellipse(at right 80cm top 50%)" -FAIL test unit (inline): cm - ellipse(at right 80cm bottom 70%) assert_equals: expected "ellipse(at calc(100% - 3023.62px) calc(30%))" but got "ellipse(at right 80cm bottom 70%)" -FAIL test unit (inline): cm - ellipse(at right 80cm bottom 70cm) assert_equals: expected "ellipse(at calc(100% - 3023.62px) calc(100% - 2645.67px))" but got "ellipse(at right 80cm bottom 70cm)" -FAIL test unit (inline): mm - ellipse(at 50mm) assert_equals: expected "ellipse(at 50mm 50%)" but got "ellipse(at 50mm center)" +PASS test unit (inline): cm - ellipse(at left 50cm) +PASS test unit (inline): cm - ellipse(at 50cm top) +PASS test unit (inline): cm - ellipse(at right 80cm) +PASS test unit (inline): cm - ellipse(at 70cm bottom) +PASS test unit (inline): cm - ellipse(at center 60cm) +PASS test unit (inline): cm - ellipse(at 60cm center) +PASS test unit (inline): cm - ellipse(at left 50% top 50cm) +PASS test unit (inline): cm - ellipse(at left 50% bottom 70cm) +PASS test unit (inline): cm - ellipse(at left 50cm top 50%) +PASS test unit (inline): cm - ellipse(at left 50cm top 50cm) +PASS test unit (inline): cm - ellipse(at left 50cm bottom 70%) +PASS test unit (inline): cm - ellipse(at top 50% left 50cm) +PASS test unit (inline): cm - ellipse(at top 50% right 80cm) +PASS test unit (inline): cm - ellipse(at top 50cm left 50%) +PASS test unit (inline): cm - ellipse(at top 50cm left 50cm) +PASS test unit (inline): cm - ellipse(at top 50cm right 80%) +PASS test unit (inline): cm - ellipse(at bottom 70% left 50cm) +PASS test unit (inline): cm - ellipse(at bottom 70% right 80cm) +PASS test unit (inline): cm - ellipse(at bottom 70cm left 50%) +PASS test unit (inline): cm - ellipse(at bottom 70cm right 50%) +PASS test unit (inline): cm - ellipse(at bottom 70cm right 80cm) +PASS test unit (inline): cm - ellipse(at right 80% top 50cm) +PASS test unit (inline): cm - ellipse(at right 80% bottom 70cm) +PASS test unit (inline): cm - ellipse(at right 80cm top 50%) +PASS test unit (inline): cm - ellipse(at right 80cm bottom 70%) +PASS test unit (inline): cm - ellipse(at right 80cm bottom 70cm) +PASS test unit (inline): mm - ellipse(at 50mm) PASS test unit (inline): mm - ellipse(at 50% 50mm) PASS test unit (inline): mm - ellipse(at 50mm 50%) PASS test unit (inline): mm - ellipse(at 50mm 50mm) -FAIL test unit (inline): mm - ellipse(at left 50mm) assert_equals: expected "ellipse(at 0% 50mm)" but got "ellipse(at left 50mm)" -FAIL test unit (inline): mm - ellipse(at 50mm top) assert_equals: expected "ellipse(at 50mm 0%)" but got "ellipse(at 50mm top)" -FAIL test unit (inline): mm - ellipse(at right 80mm) assert_equals: expected "ellipse(at 100% 80mm)" but got "ellipse(at right 80mm)" -FAIL test unit (inline): mm - ellipse(at 70mm bottom) assert_equals: expected "ellipse(at 70mm 100%)" but got "ellipse(at 70mm bottom)" -FAIL test unit (inline): mm - ellipse(at center 60mm) assert_equals: expected "ellipse(at 50% 60mm)" but got "ellipse(at center 60mm)" -FAIL test unit (inline): mm - ellipse(at 60mm center) assert_equals: expected "ellipse(at 60mm 50%)" but got "ellipse(at 60mm center)" -FAIL test unit (inline): mm - ellipse(at left 50% top 50mm) assert_equals: expected "ellipse(at 50% 50mm)" but got "ellipse(at left 50% top 50mm)" -FAIL test unit (inline): mm - ellipse(at left 50% bottom 70mm) assert_equals: expected "ellipse(at 50% calc(100% - 264.567px))" but got "ellipse(at left 50% bottom 70mm)" -FAIL test unit (inline): mm - ellipse(at left 50mm top 50%) assert_equals: expected "ellipse(at 50mm 50%)" but got "ellipse(at left 50mm top 50%)" -FAIL test unit (inline): mm - ellipse(at left 50mm top 50mm) assert_equals: expected "ellipse(at 50mm 50mm)" but got "ellipse(at left 50mm top 50mm)" -FAIL test unit (inline): mm - ellipse(at left 50mm bottom 70%) assert_equals: expected "ellipse(at 50mm calc(30%))" but got "ellipse(at left 50mm bottom 70%)" -FAIL test unit (inline): mm - ellipse(at top 50% left 50mm) assert_equals: expected "ellipse(at 50mm 50%)" but got "ellipse(at left 50mm top 50%)" -FAIL test unit (inline): mm - ellipse(at top 50% right 80mm) assert_equals: expected "ellipse(at calc(100% - 302.362px) 50%)" but got "ellipse(at right 80mm top 50%)" -FAIL test unit (inline): mm - ellipse(at top 50mm left 50%) assert_equals: expected "ellipse(at 50% 50mm)" but got "ellipse(at left 50% top 50mm)" -FAIL test unit (inline): mm - ellipse(at top 50mm left 50mm) assert_equals: expected "ellipse(at 50mm 50mm)" but got "ellipse(at left 50mm top 50mm)" -FAIL test unit (inline): mm - ellipse(at top 50mm right 80%) assert_equals: expected "ellipse(at calc(20%) 50mm)" but got "ellipse(at right 80% top 50mm)" -FAIL test unit (inline): mm - ellipse(at bottom 70% left 50mm) assert_equals: expected "ellipse(at 50mm calc(30%))" but got "ellipse(at left 50mm bottom 70%)" -FAIL test unit (inline): mm - ellipse(at bottom 70% right 80mm) assert_equals: expected "ellipse(at calc(100% - 302.362px) calc(30%))" but got "ellipse(at right 80mm bottom 70%)" -FAIL test unit (inline): mm - ellipse(at bottom 70mm left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 264.567px))" but got "ellipse(at left 50% bottom 70mm)" -FAIL test unit (inline): mm - ellipse(at bottom 70mm right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 264.567px))" but got "ellipse(at right 50% bottom 70mm)" -FAIL test unit (inline): mm - ellipse(at bottom 70mm right 80mm) assert_equals: expected "ellipse(at calc(100% - 302.362px) calc(100% - 264.567px))" but got "ellipse(at right 80mm bottom 70mm)" -FAIL test unit (inline): mm - ellipse(at right 80% top 50mm) assert_equals: expected "ellipse(at calc(20%) 50mm)" but got "ellipse(at right 80% top 50mm)" -FAIL test unit (inline): mm - ellipse(at right 80% bottom 70mm) assert_equals: expected "ellipse(at calc(20%) calc(100% - 264.567px))" but got "ellipse(at right 80% bottom 70mm)" -FAIL test unit (inline): mm - ellipse(at right 80mm top 50%) assert_equals: expected "ellipse(at calc(100% - 302.362px) 50%)" but got "ellipse(at right 80mm top 50%)" -FAIL test unit (inline): mm - ellipse(at right 80mm bottom 70%) assert_equals: expected "ellipse(at calc(100% - 302.362px) calc(30%))" but got "ellipse(at right 80mm bottom 70%)" -FAIL test unit (inline): mm - ellipse(at right 80mm bottom 70mm) assert_equals: expected "ellipse(at calc(100% - 302.362px) calc(100% - 264.567px))" but got "ellipse(at right 80mm bottom 70mm)" -FAIL test unit (inline): in - ellipse(at 50in) assert_equals: expected "ellipse(at 50in 50%)" but got "ellipse(at 50in center)" +PASS test unit (inline): mm - ellipse(at left 50mm) +PASS test unit (inline): mm - ellipse(at 50mm top) +PASS test unit (inline): mm - ellipse(at right 80mm) +PASS test unit (inline): mm - ellipse(at 70mm bottom) +PASS test unit (inline): mm - ellipse(at center 60mm) +PASS test unit (inline): mm - ellipse(at 60mm center) +PASS test unit (inline): mm - ellipse(at left 50% top 50mm) +PASS test unit (inline): mm - ellipse(at left 50% bottom 70mm) +PASS test unit (inline): mm - ellipse(at left 50mm top 50%) +PASS test unit (inline): mm - ellipse(at left 50mm top 50mm) +PASS test unit (inline): mm - ellipse(at left 50mm bottom 70%) +PASS test unit (inline): mm - ellipse(at top 50% left 50mm) +PASS test unit (inline): mm - ellipse(at top 50% right 80mm) +PASS test unit (inline): mm - ellipse(at top 50mm left 50%) +PASS test unit (inline): mm - ellipse(at top 50mm left 50mm) +PASS test unit (inline): mm - ellipse(at top 50mm right 80%) +PASS test unit (inline): mm - ellipse(at bottom 70% left 50mm) +PASS test unit (inline): mm - ellipse(at bottom 70% right 80mm) +PASS test unit (inline): mm - ellipse(at bottom 70mm left 50%) +PASS test unit (inline): mm - ellipse(at bottom 70mm right 50%) +PASS test unit (inline): mm - ellipse(at bottom 70mm right 80mm) +PASS test unit (inline): mm - ellipse(at right 80% top 50mm) +PASS test unit (inline): mm - ellipse(at right 80% bottom 70mm) +PASS test unit (inline): mm - ellipse(at right 80mm top 50%) +PASS test unit (inline): mm - ellipse(at right 80mm bottom 70%) +PASS test unit (inline): mm - ellipse(at right 80mm bottom 70mm) +PASS test unit (inline): in - ellipse(at 50in) PASS test unit (inline): in - ellipse(at 50% 50in) PASS test unit (inline): in - ellipse(at 50in 50%) PASS test unit (inline): in - ellipse(at 50in 50in) -FAIL test unit (inline): in - ellipse(at left 50in) assert_equals: expected "ellipse(at 0% 50in)" but got "ellipse(at left 50in)" -FAIL test unit (inline): in - ellipse(at 50in top) assert_equals: expected "ellipse(at 50in 0%)" but got "ellipse(at 50in top)" -FAIL test unit (inline): in - ellipse(at right 80in) assert_equals: expected "ellipse(at 100% 80in)" but got "ellipse(at right 80in)" -FAIL test unit (inline): in - ellipse(at 70in bottom) assert_equals: expected "ellipse(at 70in 100%)" but got "ellipse(at 70in bottom)" -FAIL test unit (inline): in - ellipse(at center 60in) assert_equals: expected "ellipse(at 50% 60in)" but got "ellipse(at center 60in)" -FAIL test unit (inline): in - ellipse(at 60in center) assert_equals: expected "ellipse(at 60in 50%)" but got "ellipse(at 60in center)" -FAIL test unit (inline): in - ellipse(at left 50% top 50in) assert_equals: expected "ellipse(at 50% 50in)" but got "ellipse(at left 50% top 50in)" -FAIL test unit (inline): in - ellipse(at left 50% bottom 70in) assert_equals: expected "ellipse(at 50% calc(100% - 6720px))" but got "ellipse(at left 50% bottom 70in)" -FAIL test unit (inline): in - ellipse(at left 50in top 50%) assert_equals: expected "ellipse(at 50in 50%)" but got "ellipse(at left 50in top 50%)" -FAIL test unit (inline): in - ellipse(at left 50in top 50in) assert_equals: expected "ellipse(at 50in 50in)" but got "ellipse(at left 50in top 50in)" -FAIL test unit (inline): in - ellipse(at left 50in bottom 70%) assert_equals: expected "ellipse(at 50in calc(30%))" but got "ellipse(at left 50in bottom 70%)" -FAIL test unit (inline): in - ellipse(at top 50% left 50in) assert_equals: expected "ellipse(at 50in 50%)" but got "ellipse(at left 50in top 50%)" -FAIL test unit (inline): in - ellipse(at top 50% right 80in) assert_equals: expected "ellipse(at calc(100% - 7680px) 50%)" but got "ellipse(at right 80in top 50%)" -FAIL test unit (inline): in - ellipse(at top 50in left 50%) assert_equals: expected "ellipse(at 50% 50in)" but got "ellipse(at left 50% top 50in)" -FAIL test unit (inline): in - ellipse(at top 50in left 50in) assert_equals: expected "ellipse(at 50in 50in)" but got "ellipse(at left 50in top 50in)" -FAIL test unit (inline): in - ellipse(at top 50in right 80%) assert_equals: expected "ellipse(at calc(20%) 50in)" but got "ellipse(at right 80% top 50in)" -FAIL test unit (inline): in - ellipse(at bottom 70% left 50in) assert_equals: expected "ellipse(at 50in calc(30%))" but got "ellipse(at left 50in bottom 70%)" -FAIL test unit (inline): in - ellipse(at bottom 70% right 80in) assert_equals: expected "ellipse(at calc(100% - 7680px) calc(30%))" but got "ellipse(at right 80in bottom 70%)" -FAIL test unit (inline): in - ellipse(at bottom 70in left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 6720px))" but got "ellipse(at left 50% bottom 70in)" -FAIL test unit (inline): in - ellipse(at bottom 70in right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 6720px))" but got "ellipse(at right 50% bottom 70in)" -FAIL test unit (inline): in - ellipse(at bottom 70in right 80in) assert_equals: expected "ellipse(at calc(100% - 7680px) calc(100% - 6720px))" but got "ellipse(at right 80in bottom 70in)" -FAIL test unit (inline): in - ellipse(at right 80% top 50in) assert_equals: expected "ellipse(at calc(20%) 50in)" but got "ellipse(at right 80% top 50in)" -FAIL test unit (inline): in - ellipse(at right 80% bottom 70in) assert_equals: expected "ellipse(at calc(20%) calc(100% - 6720px))" but got "ellipse(at right 80% bottom 70in)" -FAIL test unit (inline): in - ellipse(at right 80in top 50%) assert_equals: expected "ellipse(at calc(100% - 7680px) 50%)" but got "ellipse(at right 80in top 50%)" -FAIL test unit (inline): in - ellipse(at right 80in bottom 70%) assert_equals: expected "ellipse(at calc(100% - 7680px) calc(30%))" but got "ellipse(at right 80in bottom 70%)" -FAIL test unit (inline): in - ellipse(at right 80in bottom 70in) assert_equals: expected "ellipse(at calc(100% - 7680px) calc(100% - 6720px))" but got "ellipse(at right 80in bottom 70in)" -FAIL test unit (inline): pt - ellipse(at 50pt) assert_equals: expected "ellipse(at 50pt 50%)" but got "ellipse(at 50pt center)" +PASS test unit (inline): in - ellipse(at left 50in) +PASS test unit (inline): in - ellipse(at 50in top) +PASS test unit (inline): in - ellipse(at right 80in) +PASS test unit (inline): in - ellipse(at 70in bottom) +PASS test unit (inline): in - ellipse(at center 60in) +PASS test unit (inline): in - ellipse(at 60in center) +PASS test unit (inline): in - ellipse(at left 50% top 50in) +PASS test unit (inline): in - ellipse(at left 50% bottom 70in) +PASS test unit (inline): in - ellipse(at left 50in top 50%) +PASS test unit (inline): in - ellipse(at left 50in top 50in) +PASS test unit (inline): in - ellipse(at left 50in bottom 70%) +PASS test unit (inline): in - ellipse(at top 50% left 50in) +PASS test unit (inline): in - ellipse(at top 50% right 80in) +PASS test unit (inline): in - ellipse(at top 50in left 50%) +PASS test unit (inline): in - ellipse(at top 50in left 50in) +PASS test unit (inline): in - ellipse(at top 50in right 80%) +PASS test unit (inline): in - ellipse(at bottom 70% left 50in) +PASS test unit (inline): in - ellipse(at bottom 70% right 80in) +PASS test unit (inline): in - ellipse(at bottom 70in left 50%) +PASS test unit (inline): in - ellipse(at bottom 70in right 50%) +PASS test unit (inline): in - ellipse(at bottom 70in right 80in) +PASS test unit (inline): in - ellipse(at right 80% top 50in) +PASS test unit (inline): in - ellipse(at right 80% bottom 70in) +PASS test unit (inline): in - ellipse(at right 80in top 50%) +PASS test unit (inline): in - ellipse(at right 80in bottom 70%) +PASS test unit (inline): in - ellipse(at right 80in bottom 70in) +PASS test unit (inline): pt - ellipse(at 50pt) PASS test unit (inline): pt - ellipse(at 50% 50pt) PASS test unit (inline): pt - ellipse(at 50pt 50%) PASS test unit (inline): pt - ellipse(at 50pt 50pt) -FAIL test unit (inline): pt - ellipse(at left 50pt) assert_equals: expected "ellipse(at 0% 50pt)" but got "ellipse(at left 50pt)" -FAIL test unit (inline): pt - ellipse(at 50pt top) assert_equals: expected "ellipse(at 50pt 0%)" but got "ellipse(at 50pt top)" -FAIL test unit (inline): pt - ellipse(at right 80pt) assert_equals: expected "ellipse(at 100% 80pt)" but got "ellipse(at right 80pt)" -FAIL test unit (inline): pt - ellipse(at 70pt bottom) assert_equals: expected "ellipse(at 70pt 100%)" but got "ellipse(at 70pt bottom)" -FAIL test unit (inline): pt - ellipse(at center 60pt) assert_equals: expected "ellipse(at 50% 60pt)" but got "ellipse(at center 60pt)" -FAIL test unit (inline): pt - ellipse(at 60pt center) assert_equals: expected "ellipse(at 60pt 50%)" but got "ellipse(at 60pt center)" -FAIL test unit (inline): pt - ellipse(at left 50% top 50pt) assert_equals: expected "ellipse(at 50% 50pt)" but got "ellipse(at left 50% top 50pt)" -FAIL test unit (inline): pt - ellipse(at left 50% bottom 70pt) assert_equals: expected "ellipse(at 50% calc(100% - 93.3333px))" but got "ellipse(at left 50% bottom 70pt)" -FAIL test unit (inline): pt - ellipse(at left 50pt top 50%) assert_equals: expected "ellipse(at 50pt 50%)" but got "ellipse(at left 50pt top 50%)" -FAIL test unit (inline): pt - ellipse(at left 50pt top 50pt) assert_equals: expected "ellipse(at 50pt 50pt)" but got "ellipse(at left 50pt top 50pt)" -FAIL test unit (inline): pt - ellipse(at left 50pt bottom 70%) assert_equals: expected "ellipse(at 50pt calc(30%))" but got "ellipse(at left 50pt bottom 70%)" -FAIL test unit (inline): pt - ellipse(at top 50% left 50pt) assert_equals: expected "ellipse(at 50pt 50%)" but got "ellipse(at left 50pt top 50%)" -FAIL test unit (inline): pt - ellipse(at top 50% right 80pt) assert_equals: expected "ellipse(at calc(100% - 106.667px) 50%)" but got "ellipse(at right 80pt top 50%)" -FAIL test unit (inline): pt - ellipse(at top 50pt left 50%) assert_equals: expected "ellipse(at 50% 50pt)" but got "ellipse(at left 50% top 50pt)" -FAIL test unit (inline): pt - ellipse(at top 50pt left 50pt) assert_equals: expected "ellipse(at 50pt 50pt)" but got "ellipse(at left 50pt top 50pt)" -FAIL test unit (inline): pt - ellipse(at top 50pt right 80%) assert_equals: expected "ellipse(at calc(20%) 50pt)" but got "ellipse(at right 80% top 50pt)" -FAIL test unit (inline): pt - ellipse(at bottom 70% left 50pt) assert_equals: expected "ellipse(at 50pt calc(30%))" but got "ellipse(at left 50pt bottom 70%)" -FAIL test unit (inline): pt - ellipse(at bottom 70% right 80pt) assert_equals: expected "ellipse(at calc(100% - 106.667px) calc(30%))" but got "ellipse(at right 80pt bottom 70%)" -FAIL test unit (inline): pt - ellipse(at bottom 70pt left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 93.3333px))" but got "ellipse(at left 50% bottom 70pt)" -FAIL test unit (inline): pt - ellipse(at bottom 70pt right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 93.3333px))" but got "ellipse(at right 50% bottom 70pt)" -FAIL test unit (inline): pt - ellipse(at bottom 70pt right 80pt) assert_equals: expected "ellipse(at calc(100% - 106.667px) calc(100% - 93.3333px))" but got "ellipse(at right 80pt bottom 70pt)" -FAIL test unit (inline): pt - ellipse(at right 80% top 50pt) assert_equals: expected "ellipse(at calc(20%) 50pt)" but got "ellipse(at right 80% top 50pt)" -FAIL test unit (inline): pt - ellipse(at right 80% bottom 70pt) assert_equals: expected "ellipse(at calc(20%) calc(100% - 93.3333px))" but got "ellipse(at right 80% bottom 70pt)" -FAIL test unit (inline): pt - ellipse(at right 80pt top 50%) assert_equals: expected "ellipse(at calc(100% - 106.667px) 50%)" but got "ellipse(at right 80pt top 50%)" -FAIL test unit (inline): pt - ellipse(at right 80pt bottom 70%) assert_equals: expected "ellipse(at calc(100% - 106.667px) calc(30%))" but got "ellipse(at right 80pt bottom 70%)" -FAIL test unit (inline): pt - ellipse(at right 80pt bottom 70pt) assert_equals: expected "ellipse(at calc(100% - 106.667px) calc(100% - 93.3333px))" but got "ellipse(at right 80pt bottom 70pt)" -FAIL test unit (inline): pc - ellipse(at 50pc) assert_equals: expected "ellipse(at 50pc 50%)" but got "ellipse(at 50pc center)" +PASS test unit (inline): pt - ellipse(at left 50pt) +PASS test unit (inline): pt - ellipse(at 50pt top) +PASS test unit (inline): pt - ellipse(at right 80pt) +PASS test unit (inline): pt - ellipse(at 70pt bottom) +PASS test unit (inline): pt - ellipse(at center 60pt) +PASS test unit (inline): pt - ellipse(at 60pt center) +PASS test unit (inline): pt - ellipse(at left 50% top 50pt) +PASS test unit (inline): pt - ellipse(at left 50% bottom 70pt) +PASS test unit (inline): pt - ellipse(at left 50pt top 50%) +PASS test unit (inline): pt - ellipse(at left 50pt top 50pt) +PASS test unit (inline): pt - ellipse(at left 50pt bottom 70%) +PASS test unit (inline): pt - ellipse(at top 50% left 50pt) +PASS test unit (inline): pt - ellipse(at top 50% right 80pt) +PASS test unit (inline): pt - ellipse(at top 50pt left 50%) +PASS test unit (inline): pt - ellipse(at top 50pt left 50pt) +PASS test unit (inline): pt - ellipse(at top 50pt right 80%) +PASS test unit (inline): pt - ellipse(at bottom 70% left 50pt) +PASS test unit (inline): pt - ellipse(at bottom 70% right 80pt) +PASS test unit (inline): pt - ellipse(at bottom 70pt left 50%) +PASS test unit (inline): pt - ellipse(at bottom 70pt right 50%) +PASS test unit (inline): pt - ellipse(at bottom 70pt right 80pt) +PASS test unit (inline): pt - ellipse(at right 80% top 50pt) +PASS test unit (inline): pt - ellipse(at right 80% bottom 70pt) +PASS test unit (inline): pt - ellipse(at right 80pt top 50%) +PASS test unit (inline): pt - ellipse(at right 80pt bottom 70%) +PASS test unit (inline): pt - ellipse(at right 80pt bottom 70pt) +PASS test unit (inline): pc - ellipse(at 50pc) PASS test unit (inline): pc - ellipse(at 50% 50pc) PASS test unit (inline): pc - ellipse(at 50pc 50%) PASS test unit (inline): pc - ellipse(at 50pc 50pc) -FAIL test unit (inline): pc - ellipse(at left 50pc) assert_equals: expected "ellipse(at 0% 50pc)" but got "ellipse(at left 50pc)" -FAIL test unit (inline): pc - ellipse(at 50pc top) assert_equals: expected "ellipse(at 50pc 0%)" but got "ellipse(at 50pc top)" -FAIL test unit (inline): pc - ellipse(at right 80pc) assert_equals: expected "ellipse(at 100% 80pc)" but got "ellipse(at right 80pc)" -FAIL test unit (inline): pc - ellipse(at 70pc bottom) assert_equals: expected "ellipse(at 70pc 100%)" but got "ellipse(at 70pc bottom)" -FAIL test unit (inline): pc - ellipse(at center 60pc) assert_equals: expected "ellipse(at 50% 60pc)" but got "ellipse(at center 60pc)" -FAIL test unit (inline): pc - ellipse(at 60pc center) assert_equals: expected "ellipse(at 60pc 50%)" but got "ellipse(at 60pc center)" -FAIL test unit (inline): pc - ellipse(at left 50% top 50pc) assert_equals: expected "ellipse(at 50% 50pc)" but got "ellipse(at left 50% top 50pc)" -FAIL test unit (inline): pc - ellipse(at left 50% bottom 70pc) assert_equals: expected "ellipse(at 50% calc(100% - 1120px))" but got "ellipse(at left 50% bottom 70pc)" -FAIL test unit (inline): pc - ellipse(at left 50pc top 50%) assert_equals: expected "ellipse(at 50pc 50%)" but got "ellipse(at left 50pc top 50%)" -FAIL test unit (inline): pc - ellipse(at left 50pc top 50pc) assert_equals: expected "ellipse(at 50pc 50pc)" but got "ellipse(at left 50pc top 50pc)" -FAIL test unit (inline): pc - ellipse(at left 50pc bottom 70%) assert_equals: expected "ellipse(at 50pc calc(30%))" but got "ellipse(at left 50pc bottom 70%)" -FAIL test unit (inline): pc - ellipse(at top 50% left 50pc) assert_equals: expected "ellipse(at 50pc 50%)" but got "ellipse(at left 50pc top 50%)" -FAIL test unit (inline): pc - ellipse(at top 50% right 80pc) assert_equals: expected "ellipse(at calc(100% - 1280px) 50%)" but got "ellipse(at right 80pc top 50%)" -FAIL test unit (inline): pc - ellipse(at top 50pc left 50%) assert_equals: expected "ellipse(at 50% 50pc)" but got "ellipse(at left 50% top 50pc)" -FAIL test unit (inline): pc - ellipse(at top 50pc left 50pc) assert_equals: expected "ellipse(at 50pc 50pc)" but got "ellipse(at left 50pc top 50pc)" -FAIL test unit (inline): pc - ellipse(at top 50pc right 80%) assert_equals: expected "ellipse(at calc(20%) 50pc)" but got "ellipse(at right 80% top 50pc)" -FAIL test unit (inline): pc - ellipse(at bottom 70% left 50pc) assert_equals: expected "ellipse(at 50pc calc(30%))" but got "ellipse(at left 50pc bottom 70%)" -FAIL test unit (inline): pc - ellipse(at bottom 70% right 80pc) assert_equals: expected "ellipse(at calc(100% - 1280px) calc(30%))" but got "ellipse(at right 80pc bottom 70%)" -FAIL test unit (inline): pc - ellipse(at bottom 70pc left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 1120px))" but got "ellipse(at left 50% bottom 70pc)" -FAIL test unit (inline): pc - ellipse(at bottom 70pc right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 1120px))" but got "ellipse(at right 50% bottom 70pc)" -FAIL test unit (inline): pc - ellipse(at bottom 70pc right 80pc) assert_equals: expected "ellipse(at calc(100% - 1280px) calc(100% - 1120px))" but got "ellipse(at right 80pc bottom 70pc)" -FAIL test unit (inline): pc - ellipse(at right 80% top 50pc) assert_equals: expected "ellipse(at calc(20%) 50pc)" but got "ellipse(at right 80% top 50pc)" -FAIL test unit (inline): pc - ellipse(at right 80% bottom 70pc) assert_equals: expected "ellipse(at calc(20%) calc(100% - 1120px))" but got "ellipse(at right 80% bottom 70pc)" -FAIL test unit (inline): pc - ellipse(at right 80pc top 50%) assert_equals: expected "ellipse(at calc(100% - 1280px) 50%)" but got "ellipse(at right 80pc top 50%)" -FAIL test unit (inline): pc - ellipse(at right 80pc bottom 70%) assert_equals: expected "ellipse(at calc(100% - 1280px) calc(30%))" but got "ellipse(at right 80pc bottom 70%)" -FAIL test unit (inline): pc - ellipse(at right 80pc bottom 70pc) assert_equals: expected "ellipse(at calc(100% - 1280px) calc(100% - 1120px))" but got "ellipse(at right 80pc bottom 70pc)" -FAIL test unit (inline): em - ellipse(at 50em) assert_equals: expected "ellipse(at 50em 50%)" but got "ellipse(at 50em center)" +PASS test unit (inline): pc - ellipse(at left 50pc) +PASS test unit (inline): pc - ellipse(at 50pc top) +PASS test unit (inline): pc - ellipse(at right 80pc) +PASS test unit (inline): pc - ellipse(at 70pc bottom) +PASS test unit (inline): pc - ellipse(at center 60pc) +PASS test unit (inline): pc - ellipse(at 60pc center) +PASS test unit (inline): pc - ellipse(at left 50% top 50pc) +PASS test unit (inline): pc - ellipse(at left 50% bottom 70pc) +PASS test unit (inline): pc - ellipse(at left 50pc top 50%) +PASS test unit (inline): pc - ellipse(at left 50pc top 50pc) +PASS test unit (inline): pc - ellipse(at left 50pc bottom 70%) +PASS test unit (inline): pc - ellipse(at top 50% left 50pc) +PASS test unit (inline): pc - ellipse(at top 50% right 80pc) +PASS test unit (inline): pc - ellipse(at top 50pc left 50%) +PASS test unit (inline): pc - ellipse(at top 50pc left 50pc) +PASS test unit (inline): pc - ellipse(at top 50pc right 80%) +PASS test unit (inline): pc - ellipse(at bottom 70% left 50pc) +PASS test unit (inline): pc - ellipse(at bottom 70% right 80pc) +PASS test unit (inline): pc - ellipse(at bottom 70pc left 50%) +PASS test unit (inline): pc - ellipse(at bottom 70pc right 50%) +PASS test unit (inline): pc - ellipse(at bottom 70pc right 80pc) +PASS test unit (inline): pc - ellipse(at right 80% top 50pc) +PASS test unit (inline): pc - ellipse(at right 80% bottom 70pc) +PASS test unit (inline): pc - ellipse(at right 80pc top 50%) +PASS test unit (inline): pc - ellipse(at right 80pc bottom 70%) +PASS test unit (inline): pc - ellipse(at right 80pc bottom 70pc) +PASS test unit (inline): em - ellipse(at 50em) PASS test unit (inline): em - ellipse(at 50% 50em) PASS test unit (inline): em - ellipse(at 50em 50%) PASS test unit (inline): em - ellipse(at 50em 50em) -FAIL test unit (inline): em - ellipse(at left 50em) assert_equals: expected "ellipse(at 0% 50em)" but got "ellipse(at left 50em)" -FAIL test unit (inline): em - ellipse(at 50em top) assert_equals: expected "ellipse(at 50em 0%)" but got "ellipse(at 50em top)" -FAIL test unit (inline): em - ellipse(at right 80em) assert_equals: expected "ellipse(at 100% 80em)" but got "ellipse(at right 80em)" -FAIL test unit (inline): em - ellipse(at 70em bottom) assert_equals: expected "ellipse(at 70em 100%)" but got "ellipse(at 70em bottom)" -FAIL test unit (inline): em - ellipse(at center 60em) assert_equals: expected "ellipse(at 50% 60em)" but got "ellipse(at center 60em)" -FAIL test unit (inline): em - ellipse(at 60em center) assert_equals: expected "ellipse(at 60em 50%)" but got "ellipse(at 60em center)" -FAIL test unit (inline): em - ellipse(at left 50% top 50em) assert_equals: expected "ellipse(at 50% 50em)" but got "ellipse(at left 50% top 50em)" -FAIL test unit (inline): em - ellipse(at left 50% bottom 70em) assert_equals: expected "ellipse(at 50% calc(100% - 70em))" but got "ellipse(at left 50% bottom 70em)" -FAIL test unit (inline): em - ellipse(at left 50em top 50%) assert_equals: expected "ellipse(at 50em 50%)" but got "ellipse(at left 50em top 50%)" -FAIL test unit (inline): em - ellipse(at left 50em top 50em) assert_equals: expected "ellipse(at 50em 50em)" but got "ellipse(at left 50em top 50em)" -FAIL test unit (inline): em - ellipse(at left 50em bottom 70%) assert_equals: expected "ellipse(at 50em calc(30%))" but got "ellipse(at left 50em bottom 70%)" -FAIL test unit (inline): em - ellipse(at top 50% left 50em) assert_equals: expected "ellipse(at 50em 50%)" but got "ellipse(at left 50em top 50%)" -FAIL test unit (inline): em - ellipse(at top 50% right 80em) assert_equals: expected "ellipse(at calc(100% - 80em) 50%)" but got "ellipse(at right 80em top 50%)" -FAIL test unit (inline): em - ellipse(at top 50em left 50%) assert_equals: expected "ellipse(at 50% 50em)" but got "ellipse(at left 50% top 50em)" -FAIL test unit (inline): em - ellipse(at top 50em left 50em) assert_equals: expected "ellipse(at 50em 50em)" but got "ellipse(at left 50em top 50em)" -FAIL test unit (inline): em - ellipse(at top 50em right 80%) assert_equals: expected "ellipse(at calc(20%) 50em)" but got "ellipse(at right 80% top 50em)" -FAIL test unit (inline): em - ellipse(at bottom 70% left 50em) assert_equals: expected "ellipse(at 50em calc(30%))" but got "ellipse(at left 50em bottom 70%)" -FAIL test unit (inline): em - ellipse(at bottom 70% right 80em) assert_equals: expected "ellipse(at calc(100% - 80em) calc(30%))" but got "ellipse(at right 80em bottom 70%)" -FAIL test unit (inline): em - ellipse(at bottom 70em left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70em))" but got "ellipse(at left 50% bottom 70em)" -FAIL test unit (inline): em - ellipse(at bottom 70em right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70em))" but got "ellipse(at right 50% bottom 70em)" -FAIL test unit (inline): em - ellipse(at bottom 70em right 80em) assert_equals: expected "ellipse(at calc(100% - 80em) calc(100% - 70em))" but got "ellipse(at right 80em bottom 70em)" -FAIL test unit (inline): em - ellipse(at right 80% top 50em) assert_equals: expected "ellipse(at calc(20%) 50em)" but got "ellipse(at right 80% top 50em)" -FAIL test unit (inline): em - ellipse(at right 80% bottom 70em) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70em))" but got "ellipse(at right 80% bottom 70em)" -FAIL test unit (inline): em - ellipse(at right 80em top 50%) assert_equals: expected "ellipse(at calc(100% - 80em) 50%)" but got "ellipse(at right 80em top 50%)" -FAIL test unit (inline): em - ellipse(at right 80em bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80em) calc(30%))" but got "ellipse(at right 80em bottom 70%)" -FAIL test unit (inline): em - ellipse(at right 80em bottom 70em) assert_equals: expected "ellipse(at calc(100% - 80em) calc(100% - 70em))" but got "ellipse(at right 80em bottom 70em)" -FAIL test unit (inline): ex - ellipse(at 50ex) assert_equals: expected "ellipse(at 50ex 50%)" but got "ellipse(at 50ex center)" +PASS test unit (inline): em - ellipse(at left 50em) +PASS test unit (inline): em - ellipse(at 50em top) +PASS test unit (inline): em - ellipse(at right 80em) +PASS test unit (inline): em - ellipse(at 70em bottom) +PASS test unit (inline): em - ellipse(at center 60em) +PASS test unit (inline): em - ellipse(at 60em center) +PASS test unit (inline): em - ellipse(at left 50% top 50em) +PASS test unit (inline): em - ellipse(at left 50% bottom 70em) +PASS test unit (inline): em - ellipse(at left 50em top 50%) +PASS test unit (inline): em - ellipse(at left 50em top 50em) +PASS test unit (inline): em - ellipse(at left 50em bottom 70%) +PASS test unit (inline): em - ellipse(at top 50% left 50em) +PASS test unit (inline): em - ellipse(at top 50% right 80em) +PASS test unit (inline): em - ellipse(at top 50em left 50%) +PASS test unit (inline): em - ellipse(at top 50em left 50em) +PASS test unit (inline): em - ellipse(at top 50em right 80%) +PASS test unit (inline): em - ellipse(at bottom 70% left 50em) +PASS test unit (inline): em - ellipse(at bottom 70% right 80em) +PASS test unit (inline): em - ellipse(at bottom 70em left 50%) +PASS test unit (inline): em - ellipse(at bottom 70em right 50%) +PASS test unit (inline): em - ellipse(at bottom 70em right 80em) +PASS test unit (inline): em - ellipse(at right 80% top 50em) +PASS test unit (inline): em - ellipse(at right 80% bottom 70em) +PASS test unit (inline): em - ellipse(at right 80em top 50%) +PASS test unit (inline): em - ellipse(at right 80em bottom 70%) +PASS test unit (inline): em - ellipse(at right 80em bottom 70em) +PASS test unit (inline): ex - ellipse(at 50ex) PASS test unit (inline): ex - ellipse(at 50% 50ex) PASS test unit (inline): ex - ellipse(at 50ex 50%) PASS test unit (inline): ex - ellipse(at 50ex 50ex) -FAIL test unit (inline): ex - ellipse(at left 50ex) assert_equals: expected "ellipse(at 0% 50ex)" but got "ellipse(at left 50ex)" -FAIL test unit (inline): ex - ellipse(at 50ex top) assert_equals: expected "ellipse(at 50ex 0%)" but got "ellipse(at 50ex top)" -FAIL test unit (inline): ex - ellipse(at right 80ex) assert_equals: expected "ellipse(at 100% 80ex)" but got "ellipse(at right 80ex)" -FAIL test unit (inline): ex - ellipse(at 70ex bottom) assert_equals: expected "ellipse(at 70ex 100%)" but got "ellipse(at 70ex bottom)" -FAIL test unit (inline): ex - ellipse(at center 60ex) assert_equals: expected "ellipse(at 50% 60ex)" but got "ellipse(at center 60ex)" -FAIL test unit (inline): ex - ellipse(at 60ex center) assert_equals: expected "ellipse(at 60ex 50%)" but got "ellipse(at 60ex center)" -FAIL test unit (inline): ex - ellipse(at left 50% top 50ex) assert_equals: expected "ellipse(at 50% 50ex)" but got "ellipse(at left 50% top 50ex)" -FAIL test unit (inline): ex - ellipse(at left 50% bottom 70ex) assert_equals: expected "ellipse(at 50% calc(100% - 70ex))" but got "ellipse(at left 50% bottom 70ex)" -FAIL test unit (inline): ex - ellipse(at left 50ex top 50%) assert_equals: expected "ellipse(at 50ex 50%)" but got "ellipse(at left 50ex top 50%)" -FAIL test unit (inline): ex - ellipse(at left 50ex top 50ex) assert_equals: expected "ellipse(at 50ex 50ex)" but got "ellipse(at left 50ex top 50ex)" -FAIL test unit (inline): ex - ellipse(at left 50ex bottom 70%) assert_equals: expected "ellipse(at 50ex calc(30%))" but got "ellipse(at left 50ex bottom 70%)" -FAIL test unit (inline): ex - ellipse(at top 50% left 50ex) assert_equals: expected "ellipse(at 50ex 50%)" but got "ellipse(at left 50ex top 50%)" -FAIL test unit (inline): ex - ellipse(at top 50% right 80ex) assert_equals: expected "ellipse(at calc(100% - 80ex) 50%)" but got "ellipse(at right 80ex top 50%)" -FAIL test unit (inline): ex - ellipse(at top 50ex left 50%) assert_equals: expected "ellipse(at 50% 50ex)" but got "ellipse(at left 50% top 50ex)" -FAIL test unit (inline): ex - ellipse(at top 50ex left 50ex) assert_equals: expected "ellipse(at 50ex 50ex)" but got "ellipse(at left 50ex top 50ex)" -FAIL test unit (inline): ex - ellipse(at top 50ex right 80%) assert_equals: expected "ellipse(at calc(20%) 50ex)" but got "ellipse(at right 80% top 50ex)" -FAIL test unit (inline): ex - ellipse(at bottom 70% left 50ex) assert_equals: expected "ellipse(at 50ex calc(30%))" but got "ellipse(at left 50ex bottom 70%)" -FAIL test unit (inline): ex - ellipse(at bottom 70% right 80ex) assert_equals: expected "ellipse(at calc(100% - 80ex) calc(30%))" but got "ellipse(at right 80ex bottom 70%)" -FAIL test unit (inline): ex - ellipse(at bottom 70ex left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70ex))" but got "ellipse(at left 50% bottom 70ex)" -FAIL test unit (inline): ex - ellipse(at bottom 70ex right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70ex))" but got "ellipse(at right 50% bottom 70ex)" -FAIL test unit (inline): ex - ellipse(at bottom 70ex right 80ex) assert_equals: expected "ellipse(at calc(100% - 80ex) calc(100% - 70ex))" but got "ellipse(at right 80ex bottom 70ex)" -FAIL test unit (inline): ex - ellipse(at right 80% top 50ex) assert_equals: expected "ellipse(at calc(20%) 50ex)" but got "ellipse(at right 80% top 50ex)" -FAIL test unit (inline): ex - ellipse(at right 80% bottom 70ex) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70ex))" but got "ellipse(at right 80% bottom 70ex)" -FAIL test unit (inline): ex - ellipse(at right 80ex top 50%) assert_equals: expected "ellipse(at calc(100% - 80ex) 50%)" but got "ellipse(at right 80ex top 50%)" -FAIL test unit (inline): ex - ellipse(at right 80ex bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80ex) calc(30%))" but got "ellipse(at right 80ex bottom 70%)" -FAIL test unit (inline): ex - ellipse(at right 80ex bottom 70ex) assert_equals: expected "ellipse(at calc(100% - 80ex) calc(100% - 70ex))" but got "ellipse(at right 80ex bottom 70ex)" -FAIL test unit (inline): ch - ellipse(at 50ch) assert_equals: expected "ellipse(at 50ch 50%)" but got "ellipse(at 50ch center)" +PASS test unit (inline): ex - ellipse(at left 50ex) +PASS test unit (inline): ex - ellipse(at 50ex top) +PASS test unit (inline): ex - ellipse(at right 80ex) +PASS test unit (inline): ex - ellipse(at 70ex bottom) +PASS test unit (inline): ex - ellipse(at center 60ex) +PASS test unit (inline): ex - ellipse(at 60ex center) +PASS test unit (inline): ex - ellipse(at left 50% top 50ex) +PASS test unit (inline): ex - ellipse(at left 50% bottom 70ex) +PASS test unit (inline): ex - ellipse(at left 50ex top 50%) +PASS test unit (inline): ex - ellipse(at left 50ex top 50ex) +PASS test unit (inline): ex - ellipse(at left 50ex bottom 70%) +PASS test unit (inline): ex - ellipse(at top 50% left 50ex) +PASS test unit (inline): ex - ellipse(at top 50% right 80ex) +PASS test unit (inline): ex - ellipse(at top 50ex left 50%) +PASS test unit (inline): ex - ellipse(at top 50ex left 50ex) +PASS test unit (inline): ex - ellipse(at top 50ex right 80%) +PASS test unit (inline): ex - ellipse(at bottom 70% left 50ex) +PASS test unit (inline): ex - ellipse(at bottom 70% right 80ex) +PASS test unit (inline): ex - ellipse(at bottom 70ex left 50%) +PASS test unit (inline): ex - ellipse(at bottom 70ex right 50%) +PASS test unit (inline): ex - ellipse(at bottom 70ex right 80ex) +PASS test unit (inline): ex - ellipse(at right 80% top 50ex) +PASS test unit (inline): ex - ellipse(at right 80% bottom 70ex) +PASS test unit (inline): ex - ellipse(at right 80ex top 50%) +PASS test unit (inline): ex - ellipse(at right 80ex bottom 70%) +PASS test unit (inline): ex - ellipse(at right 80ex bottom 70ex) +PASS test unit (inline): ch - ellipse(at 50ch) PASS test unit (inline): ch - ellipse(at 50% 50ch) PASS test unit (inline): ch - ellipse(at 50ch 50%) PASS test unit (inline): ch - ellipse(at 50ch 50ch) -FAIL test unit (inline): ch - ellipse(at left 50ch) assert_equals: expected "ellipse(at 0% 50ch)" but got "ellipse(at left 50ch)" -FAIL test unit (inline): ch - ellipse(at 50ch top) assert_equals: expected "ellipse(at 50ch 0%)" but got "ellipse(at 50ch top)" -FAIL test unit (inline): ch - ellipse(at right 80ch) assert_equals: expected "ellipse(at 100% 80ch)" but got "ellipse(at right 80ch)" -FAIL test unit (inline): ch - ellipse(at 70ch bottom) assert_equals: expected "ellipse(at 70ch 100%)" but got "ellipse(at 70ch bottom)" -FAIL test unit (inline): ch - ellipse(at center 60ch) assert_equals: expected "ellipse(at 50% 60ch)" but got "ellipse(at center 60ch)" -FAIL test unit (inline): ch - ellipse(at 60ch center) assert_equals: expected "ellipse(at 60ch 50%)" but got "ellipse(at 60ch center)" -FAIL test unit (inline): ch - ellipse(at left 50% top 50ch) assert_equals: expected "ellipse(at 50% 50ch)" but got "ellipse(at left 50% top 50ch)" -FAIL test unit (inline): ch - ellipse(at left 50% bottom 70ch) assert_equals: expected "ellipse(at 50% calc(100% - 70ch))" but got "ellipse(at left 50% bottom 70ch)" -FAIL test unit (inline): ch - ellipse(at left 50ch top 50%) assert_equals: expected "ellipse(at 50ch 50%)" but got "ellipse(at left 50ch top 50%)" -FAIL test unit (inline): ch - ellipse(at left 50ch top 50ch) assert_equals: expected "ellipse(at 50ch 50ch)" but got "ellipse(at left 50ch top 50ch)" -FAIL test unit (inline): ch - ellipse(at left 50ch bottom 70%) assert_equals: expected "ellipse(at 50ch calc(30%))" but got "ellipse(at left 50ch bottom 70%)" -FAIL test unit (inline): ch - ellipse(at top 50% left 50ch) assert_equals: expected "ellipse(at 50ch 50%)" but got "ellipse(at left 50ch top 50%)" -FAIL test unit (inline): ch - ellipse(at top 50% right 80ch) assert_equals: expected "ellipse(at calc(100% - 80ch) 50%)" but got "ellipse(at right 80ch top 50%)" -FAIL test unit (inline): ch - ellipse(at top 50ch left 50%) assert_equals: expected "ellipse(at 50% 50ch)" but got "ellipse(at left 50% top 50ch)" -FAIL test unit (inline): ch - ellipse(at top 50ch left 50ch) assert_equals: expected "ellipse(at 50ch 50ch)" but got "ellipse(at left 50ch top 50ch)" -FAIL test unit (inline): ch - ellipse(at top 50ch right 80%) assert_equals: expected "ellipse(at calc(20%) 50ch)" but got "ellipse(at right 80% top 50ch)" -FAIL test unit (inline): ch - ellipse(at bottom 70% left 50ch) assert_equals: expected "ellipse(at 50ch calc(30%))" but got "ellipse(at left 50ch bottom 70%)" -FAIL test unit (inline): ch - ellipse(at bottom 70% right 80ch) assert_equals: expected "ellipse(at calc(100% - 80ch) calc(30%))" but got "ellipse(at right 80ch bottom 70%)" -FAIL test unit (inline): ch - ellipse(at bottom 70ch left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70ch))" but got "ellipse(at left 50% bottom 70ch)" -FAIL test unit (inline): ch - ellipse(at bottom 70ch right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70ch))" but got "ellipse(at right 50% bottom 70ch)" -FAIL test unit (inline): ch - ellipse(at bottom 70ch right 80ch) assert_equals: expected "ellipse(at calc(100% - 80ch) calc(100% - 70ch))" but got "ellipse(at right 80ch bottom 70ch)" -FAIL test unit (inline): ch - ellipse(at right 80% top 50ch) assert_equals: expected "ellipse(at calc(20%) 50ch)" but got "ellipse(at right 80% top 50ch)" -FAIL test unit (inline): ch - ellipse(at right 80% bottom 70ch) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70ch))" but got "ellipse(at right 80% bottom 70ch)" -FAIL test unit (inline): ch - ellipse(at right 80ch top 50%) assert_equals: expected "ellipse(at calc(100% - 80ch) 50%)" but got "ellipse(at right 80ch top 50%)" -FAIL test unit (inline): ch - ellipse(at right 80ch bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80ch) calc(30%))" but got "ellipse(at right 80ch bottom 70%)" -FAIL test unit (inline): ch - ellipse(at right 80ch bottom 70ch) assert_equals: expected "ellipse(at calc(100% - 80ch) calc(100% - 70ch))" but got "ellipse(at right 80ch bottom 70ch)" -FAIL test unit (inline): rem - ellipse(at 50rem) assert_equals: expected "ellipse(at 50rem 50%)" but got "ellipse(at 50rem center)" +PASS test unit (inline): ch - ellipse(at left 50ch) +PASS test unit (inline): ch - ellipse(at 50ch top) +PASS test unit (inline): ch - ellipse(at right 80ch) +PASS test unit (inline): ch - ellipse(at 70ch bottom) +PASS test unit (inline): ch - ellipse(at center 60ch) +PASS test unit (inline): ch - ellipse(at 60ch center) +PASS test unit (inline): ch - ellipse(at left 50% top 50ch) +PASS test unit (inline): ch - ellipse(at left 50% bottom 70ch) +PASS test unit (inline): ch - ellipse(at left 50ch top 50%) +PASS test unit (inline): ch - ellipse(at left 50ch top 50ch) +PASS test unit (inline): ch - ellipse(at left 50ch bottom 70%) +PASS test unit (inline): ch - ellipse(at top 50% left 50ch) +PASS test unit (inline): ch - ellipse(at top 50% right 80ch) +PASS test unit (inline): ch - ellipse(at top 50ch left 50%) +PASS test unit (inline): ch - ellipse(at top 50ch left 50ch) +PASS test unit (inline): ch - ellipse(at top 50ch right 80%) +PASS test unit (inline): ch - ellipse(at bottom 70% left 50ch) +PASS test unit (inline): ch - ellipse(at bottom 70% right 80ch) +PASS test unit (inline): ch - ellipse(at bottom 70ch left 50%) +PASS test unit (inline): ch - ellipse(at bottom 70ch right 50%) +PASS test unit (inline): ch - ellipse(at bottom 70ch right 80ch) +PASS test unit (inline): ch - ellipse(at right 80% top 50ch) +PASS test unit (inline): ch - ellipse(at right 80% bottom 70ch) +PASS test unit (inline): ch - ellipse(at right 80ch top 50%) +PASS test unit (inline): ch - ellipse(at right 80ch bottom 70%) +PASS test unit (inline): ch - ellipse(at right 80ch bottom 70ch) +PASS test unit (inline): rem - ellipse(at 50rem) PASS test unit (inline): rem - ellipse(at 50% 50rem) PASS test unit (inline): rem - ellipse(at 50rem 50%) PASS test unit (inline): rem - ellipse(at 50rem 50rem) -FAIL test unit (inline): rem - ellipse(at left 50rem) assert_equals: expected "ellipse(at 0% 50rem)" but got "ellipse(at left 50rem)" -FAIL test unit (inline): rem - ellipse(at 50rem top) assert_equals: expected "ellipse(at 50rem 0%)" but got "ellipse(at 50rem top)" -FAIL test unit (inline): rem - ellipse(at right 80rem) assert_equals: expected "ellipse(at 100% 80rem)" but got "ellipse(at right 80rem)" -FAIL test unit (inline): rem - ellipse(at 70rem bottom) assert_equals: expected "ellipse(at 70rem 100%)" but got "ellipse(at 70rem bottom)" -FAIL test unit (inline): rem - ellipse(at center 60rem) assert_equals: expected "ellipse(at 50% 60rem)" but got "ellipse(at center 60rem)" -FAIL test unit (inline): rem - ellipse(at 60rem center) assert_equals: expected "ellipse(at 60rem 50%)" but got "ellipse(at 60rem center)" -FAIL test unit (inline): rem - ellipse(at left 50% top 50rem) assert_equals: expected "ellipse(at 50% 50rem)" but got "ellipse(at left 50% top 50rem)" -FAIL test unit (inline): rem - ellipse(at left 50% bottom 70rem) assert_equals: expected "ellipse(at 50% calc(100% - 70rem))" but got "ellipse(at left 50% bottom 70rem)" -FAIL test unit (inline): rem - ellipse(at left 50rem top 50%) assert_equals: expected "ellipse(at 50rem 50%)" but got "ellipse(at left 50rem top 50%)" -FAIL test unit (inline): rem - ellipse(at left 50rem top 50rem) assert_equals: expected "ellipse(at 50rem 50rem)" but got "ellipse(at left 50rem top 50rem)" -FAIL test unit (inline): rem - ellipse(at left 50rem bottom 70%) assert_equals: expected "ellipse(at 50rem calc(30%))" but got "ellipse(at left 50rem bottom 70%)" -FAIL test unit (inline): rem - ellipse(at top 50% left 50rem) assert_equals: expected "ellipse(at 50rem 50%)" but got "ellipse(at left 50rem top 50%)" -FAIL test unit (inline): rem - ellipse(at top 50% right 80rem) assert_equals: expected "ellipse(at calc(100% - 80rem) 50%)" but got "ellipse(at right 80rem top 50%)" -FAIL test unit (inline): rem - ellipse(at top 50rem left 50%) assert_equals: expected "ellipse(at 50% 50rem)" but got "ellipse(at left 50% top 50rem)" -FAIL test unit (inline): rem - ellipse(at top 50rem left 50rem) assert_equals: expected "ellipse(at 50rem 50rem)" but got "ellipse(at left 50rem top 50rem)" -FAIL test unit (inline): rem - ellipse(at top 50rem right 80%) assert_equals: expected "ellipse(at calc(20%) 50rem)" but got "ellipse(at right 80% top 50rem)" -FAIL test unit (inline): rem - ellipse(at bottom 70% left 50rem) assert_equals: expected "ellipse(at 50rem calc(30%))" but got "ellipse(at left 50rem bottom 70%)" -FAIL test unit (inline): rem - ellipse(at bottom 70% right 80rem) assert_equals: expected "ellipse(at calc(100% - 80rem) calc(30%))" but got "ellipse(at right 80rem bottom 70%)" -FAIL test unit (inline): rem - ellipse(at bottom 70rem left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70rem))" but got "ellipse(at left 50% bottom 70rem)" -FAIL test unit (inline): rem - ellipse(at bottom 70rem right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70rem))" but got "ellipse(at right 50% bottom 70rem)" -FAIL test unit (inline): rem - ellipse(at bottom 70rem right 80rem) assert_equals: expected "ellipse(at calc(100% - 80rem) calc(100% - 70rem))" but got "ellipse(at right 80rem bottom 70rem)" -FAIL test unit (inline): rem - ellipse(at right 80% top 50rem) assert_equals: expected "ellipse(at calc(20%) 50rem)" but got "ellipse(at right 80% top 50rem)" -FAIL test unit (inline): rem - ellipse(at right 80% bottom 70rem) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70rem))" but got "ellipse(at right 80% bottom 70rem)" -FAIL test unit (inline): rem - ellipse(at right 80rem top 50%) assert_equals: expected "ellipse(at calc(100% - 80rem) 50%)" but got "ellipse(at right 80rem top 50%)" -FAIL test unit (inline): rem - ellipse(at right 80rem bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80rem) calc(30%))" but got "ellipse(at right 80rem bottom 70%)" -FAIL test unit (inline): rem - ellipse(at right 80rem bottom 70rem) assert_equals: expected "ellipse(at calc(100% - 80rem) calc(100% - 70rem))" but got "ellipse(at right 80rem bottom 70rem)" -FAIL test unit (inline): vw - ellipse(at 50vw) assert_equals: expected "ellipse(at 50vw 50%)" but got "ellipse(at 50vw center)" +PASS test unit (inline): rem - ellipse(at left 50rem) +PASS test unit (inline): rem - ellipse(at 50rem top) +PASS test unit (inline): rem - ellipse(at right 80rem) +PASS test unit (inline): rem - ellipse(at 70rem bottom) +PASS test unit (inline): rem - ellipse(at center 60rem) +PASS test unit (inline): rem - ellipse(at 60rem center) +PASS test unit (inline): rem - ellipse(at left 50% top 50rem) +PASS test unit (inline): rem - ellipse(at left 50% bottom 70rem) +PASS test unit (inline): rem - ellipse(at left 50rem top 50%) +PASS test unit (inline): rem - ellipse(at left 50rem top 50rem) +PASS test unit (inline): rem - ellipse(at left 50rem bottom 70%) +PASS test unit (inline): rem - ellipse(at top 50% left 50rem) +PASS test unit (inline): rem - ellipse(at top 50% right 80rem) +PASS test unit (inline): rem - ellipse(at top 50rem left 50%) +PASS test unit (inline): rem - ellipse(at top 50rem left 50rem) +PASS test unit (inline): rem - ellipse(at top 50rem right 80%) +PASS test unit (inline): rem - ellipse(at bottom 70% left 50rem) +PASS test unit (inline): rem - ellipse(at bottom 70% right 80rem) +PASS test unit (inline): rem - ellipse(at bottom 70rem left 50%) +PASS test unit (inline): rem - ellipse(at bottom 70rem right 50%) +PASS test unit (inline): rem - ellipse(at bottom 70rem right 80rem) +PASS test unit (inline): rem - ellipse(at right 80% top 50rem) +PASS test unit (inline): rem - ellipse(at right 80% bottom 70rem) +PASS test unit (inline): rem - ellipse(at right 80rem top 50%) +PASS test unit (inline): rem - ellipse(at right 80rem bottom 70%) +PASS test unit (inline): rem - ellipse(at right 80rem bottom 70rem) +PASS test unit (inline): vw - ellipse(at 50vw) PASS test unit (inline): vw - ellipse(at 50% 50vw) PASS test unit (inline): vw - ellipse(at 50vw 50%) PASS test unit (inline): vw - ellipse(at 50vw 50vw) -FAIL test unit (inline): vw - ellipse(at left 50vw) assert_equals: expected "ellipse(at 0% 50vw)" but got "ellipse(at left 50vw)" -FAIL test unit (inline): vw - ellipse(at 50vw top) assert_equals: expected "ellipse(at 50vw 0%)" but got "ellipse(at 50vw top)" -FAIL test unit (inline): vw - ellipse(at right 80vw) assert_equals: expected "ellipse(at 100% 80vw)" but got "ellipse(at right 80vw)" -FAIL test unit (inline): vw - ellipse(at 70vw bottom) assert_equals: expected "ellipse(at 70vw 100%)" but got "ellipse(at 70vw bottom)" -FAIL test unit (inline): vw - ellipse(at center 60vw) assert_equals: expected "ellipse(at 50% 60vw)" but got "ellipse(at center 60vw)" -FAIL test unit (inline): vw - ellipse(at 60vw center) assert_equals: expected "ellipse(at 60vw 50%)" but got "ellipse(at 60vw center)" -FAIL test unit (inline): vw - ellipse(at left 50% top 50vw) assert_equals: expected "ellipse(at 50% 50vw)" but got "ellipse(at left 50% top 50vw)" -FAIL test unit (inline): vw - ellipse(at left 50% bottom 70vw) assert_equals: expected "ellipse(at 50% calc(100% - 70vw))" but got "ellipse(at left 50% bottom 70vw)" -FAIL test unit (inline): vw - ellipse(at left 50vw top 50%) assert_equals: expected "ellipse(at 50vw 50%)" but got "ellipse(at left 50vw top 50%)" -FAIL test unit (inline): vw - ellipse(at left 50vw top 50vw) assert_equals: expected "ellipse(at 50vw 50vw)" but got "ellipse(at left 50vw top 50vw)" -FAIL test unit (inline): vw - ellipse(at left 50vw bottom 70%) assert_equals: expected "ellipse(at 50vw calc(30%))" but got "ellipse(at left 50vw bottom 70%)" -FAIL test unit (inline): vw - ellipse(at top 50% left 50vw) assert_equals: expected "ellipse(at 50vw 50%)" but got "ellipse(at left 50vw top 50%)" -FAIL test unit (inline): vw - ellipse(at top 50% right 80vw) assert_equals: expected "ellipse(at calc(100% - 80vw) 50%)" but got "ellipse(at right 80vw top 50%)" -FAIL test unit (inline): vw - ellipse(at top 50vw left 50%) assert_equals: expected "ellipse(at 50% 50vw)" but got "ellipse(at left 50% top 50vw)" -FAIL test unit (inline): vw - ellipse(at top 50vw left 50vw) assert_equals: expected "ellipse(at 50vw 50vw)" but got "ellipse(at left 50vw top 50vw)" -FAIL test unit (inline): vw - ellipse(at top 50vw right 80%) assert_equals: expected "ellipse(at calc(20%) 50vw)" but got "ellipse(at right 80% top 50vw)" -FAIL test unit (inline): vw - ellipse(at bottom 70% left 50vw) assert_equals: expected "ellipse(at 50vw calc(30%))" but got "ellipse(at left 50vw bottom 70%)" -FAIL test unit (inline): vw - ellipse(at bottom 70% right 80vw) assert_equals: expected "ellipse(at calc(100% - 80vw) calc(30%))" but got "ellipse(at right 80vw bottom 70%)" -FAIL test unit (inline): vw - ellipse(at bottom 70vw left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70vw))" but got "ellipse(at left 50% bottom 70vw)" -FAIL test unit (inline): vw - ellipse(at bottom 70vw right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70vw))" but got "ellipse(at right 50% bottom 70vw)" -FAIL test unit (inline): vw - ellipse(at bottom 70vw right 80vw) assert_equals: expected "ellipse(at calc(100% - 80vw) calc(100% - 70vw))" but got "ellipse(at right 80vw bottom 70vw)" -FAIL test unit (inline): vw - ellipse(at right 80% top 50vw) assert_equals: expected "ellipse(at calc(20%) 50vw)" but got "ellipse(at right 80% top 50vw)" -FAIL test unit (inline): vw - ellipse(at right 80% bottom 70vw) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70vw))" but got "ellipse(at right 80% bottom 70vw)" -FAIL test unit (inline): vw - ellipse(at right 80vw top 50%) assert_equals: expected "ellipse(at calc(100% - 80vw) 50%)" but got "ellipse(at right 80vw top 50%)" -FAIL test unit (inline): vw - ellipse(at right 80vw bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80vw) calc(30%))" but got "ellipse(at right 80vw bottom 70%)" -FAIL test unit (inline): vw - ellipse(at right 80vw bottom 70vw) assert_equals: expected "ellipse(at calc(100% - 80vw) calc(100% - 70vw))" but got "ellipse(at right 80vw bottom 70vw)" -FAIL test unit (inline): vh - ellipse(at 50vh) assert_equals: expected "ellipse(at 50vh 50%)" but got "ellipse(at 50vh center)" +PASS test unit (inline): vw - ellipse(at left 50vw) +PASS test unit (inline): vw - ellipse(at 50vw top) +PASS test unit (inline): vw - ellipse(at right 80vw) +PASS test unit (inline): vw - ellipse(at 70vw bottom) +PASS test unit (inline): vw - ellipse(at center 60vw) +PASS test unit (inline): vw - ellipse(at 60vw center) +PASS test unit (inline): vw - ellipse(at left 50% top 50vw) +PASS test unit (inline): vw - ellipse(at left 50% bottom 70vw) +PASS test unit (inline): vw - ellipse(at left 50vw top 50%) +PASS test unit (inline): vw - ellipse(at left 50vw top 50vw) +PASS test unit (inline): vw - ellipse(at left 50vw bottom 70%) +PASS test unit (inline): vw - ellipse(at top 50% left 50vw) +PASS test unit (inline): vw - ellipse(at top 50% right 80vw) +PASS test unit (inline): vw - ellipse(at top 50vw left 50%) +PASS test unit (inline): vw - ellipse(at top 50vw left 50vw) +PASS test unit (inline): vw - ellipse(at top 50vw right 80%) +PASS test unit (inline): vw - ellipse(at bottom 70% left 50vw) +PASS test unit (inline): vw - ellipse(at bottom 70% right 80vw) +PASS test unit (inline): vw - ellipse(at bottom 70vw left 50%) +PASS test unit (inline): vw - ellipse(at bottom 70vw right 50%) +PASS test unit (inline): vw - ellipse(at bottom 70vw right 80vw) +PASS test unit (inline): vw - ellipse(at right 80% top 50vw) +PASS test unit (inline): vw - ellipse(at right 80% bottom 70vw) +PASS test unit (inline): vw - ellipse(at right 80vw top 50%) +PASS test unit (inline): vw - ellipse(at right 80vw bottom 70%) +PASS test unit (inline): vw - ellipse(at right 80vw bottom 70vw) +PASS test unit (inline): vh - ellipse(at 50vh) PASS test unit (inline): vh - ellipse(at 50% 50vh) PASS test unit (inline): vh - ellipse(at 50vh 50%) PASS test unit (inline): vh - ellipse(at 50vh 50vh) -FAIL test unit (inline): vh - ellipse(at left 50vh) assert_equals: expected "ellipse(at 0% 50vh)" but got "ellipse(at left 50vh)" -FAIL test unit (inline): vh - ellipse(at 50vh top) assert_equals: expected "ellipse(at 50vh 0%)" but got "ellipse(at 50vh top)" -FAIL test unit (inline): vh - ellipse(at right 80vh) assert_equals: expected "ellipse(at 100% 80vh)" but got "ellipse(at right 80vh)" -FAIL test unit (inline): vh - ellipse(at 70vh bottom) assert_equals: expected "ellipse(at 70vh 100%)" but got "ellipse(at 70vh bottom)" -FAIL test unit (inline): vh - ellipse(at center 60vh) assert_equals: expected "ellipse(at 50% 60vh)" but got "ellipse(at center 60vh)" -FAIL test unit (inline): vh - ellipse(at 60vh center) assert_equals: expected "ellipse(at 60vh 50%)" but got "ellipse(at 60vh center)" -FAIL test unit (inline): vh - ellipse(at left 50% top 50vh) assert_equals: expected "ellipse(at 50% 50vh)" but got "ellipse(at left 50% top 50vh)" -FAIL test unit (inline): vh - ellipse(at left 50% bottom 70vh) assert_equals: expected "ellipse(at 50% calc(100% - 70vh))" but got "ellipse(at left 50% bottom 70vh)" -FAIL test unit (inline): vh - ellipse(at left 50vh top 50%) assert_equals: expected "ellipse(at 50vh 50%)" but got "ellipse(at left 50vh top 50%)" -FAIL test unit (inline): vh - ellipse(at left 50vh top 50vh) assert_equals: expected "ellipse(at 50vh 50vh)" but got "ellipse(at left 50vh top 50vh)" -FAIL test unit (inline): vh - ellipse(at left 50vh bottom 70%) assert_equals: expected "ellipse(at 50vh calc(30%))" but got "ellipse(at left 50vh bottom 70%)" -FAIL test unit (inline): vh - ellipse(at top 50% left 50vh) assert_equals: expected "ellipse(at 50vh 50%)" but got "ellipse(at left 50vh top 50%)" -FAIL test unit (inline): vh - ellipse(at top 50% right 80vh) assert_equals: expected "ellipse(at calc(100% - 80vh) 50%)" but got "ellipse(at right 80vh top 50%)" -FAIL test unit (inline): vh - ellipse(at top 50vh left 50%) assert_equals: expected "ellipse(at 50% 50vh)" but got "ellipse(at left 50% top 50vh)" -FAIL test unit (inline): vh - ellipse(at top 50vh left 50vh) assert_equals: expected "ellipse(at 50vh 50vh)" but got "ellipse(at left 50vh top 50vh)" -FAIL test unit (inline): vh - ellipse(at top 50vh right 80%) assert_equals: expected "ellipse(at calc(20%) 50vh)" but got "ellipse(at right 80% top 50vh)" -FAIL test unit (inline): vh - ellipse(at bottom 70% left 50vh) assert_equals: expected "ellipse(at 50vh calc(30%))" but got "ellipse(at left 50vh bottom 70%)" -FAIL test unit (inline): vh - ellipse(at bottom 70% right 80vh) assert_equals: expected "ellipse(at calc(100% - 80vh) calc(30%))" but got "ellipse(at right 80vh bottom 70%)" -FAIL test unit (inline): vh - ellipse(at bottom 70vh left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70vh))" but got "ellipse(at left 50% bottom 70vh)" -FAIL test unit (inline): vh - ellipse(at bottom 70vh right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70vh))" but got "ellipse(at right 50% bottom 70vh)" -FAIL test unit (inline): vh - ellipse(at bottom 70vh right 80vh) assert_equals: expected "ellipse(at calc(100% - 80vh) calc(100% - 70vh))" but got "ellipse(at right 80vh bottom 70vh)" -FAIL test unit (inline): vh - ellipse(at right 80% top 50vh) assert_equals: expected "ellipse(at calc(20%) 50vh)" but got "ellipse(at right 80% top 50vh)" -FAIL test unit (inline): vh - ellipse(at right 80% bottom 70vh) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70vh))" but got "ellipse(at right 80% bottom 70vh)" -FAIL test unit (inline): vh - ellipse(at right 80vh top 50%) assert_equals: expected "ellipse(at calc(100% - 80vh) 50%)" but got "ellipse(at right 80vh top 50%)" -FAIL test unit (inline): vh - ellipse(at right 80vh bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80vh) calc(30%))" but got "ellipse(at right 80vh bottom 70%)" -FAIL test unit (inline): vh - ellipse(at right 80vh bottom 70vh) assert_equals: expected "ellipse(at calc(100% - 80vh) calc(100% - 70vh))" but got "ellipse(at right 80vh bottom 70vh)" -FAIL test unit (inline): vmin - ellipse(at 50vmin) assert_equals: expected "ellipse(at 50vmin 50%)" but got "ellipse(at 50vmin center)" +PASS test unit (inline): vh - ellipse(at left 50vh) +PASS test unit (inline): vh - ellipse(at 50vh top) +PASS test unit (inline): vh - ellipse(at right 80vh) +PASS test unit (inline): vh - ellipse(at 70vh bottom) +PASS test unit (inline): vh - ellipse(at center 60vh) +PASS test unit (inline): vh - ellipse(at 60vh center) +PASS test unit (inline): vh - ellipse(at left 50% top 50vh) +PASS test unit (inline): vh - ellipse(at left 50% bottom 70vh) +PASS test unit (inline): vh - ellipse(at left 50vh top 50%) +PASS test unit (inline): vh - ellipse(at left 50vh top 50vh) +PASS test unit (inline): vh - ellipse(at left 50vh bottom 70%) +PASS test unit (inline): vh - ellipse(at top 50% left 50vh) +PASS test unit (inline): vh - ellipse(at top 50% right 80vh) +PASS test unit (inline): vh - ellipse(at top 50vh left 50%) +PASS test unit (inline): vh - ellipse(at top 50vh left 50vh) +PASS test unit (inline): vh - ellipse(at top 50vh right 80%) +PASS test unit (inline): vh - ellipse(at bottom 70% left 50vh) +PASS test unit (inline): vh - ellipse(at bottom 70% right 80vh) +PASS test unit (inline): vh - ellipse(at bottom 70vh left 50%) +PASS test unit (inline): vh - ellipse(at bottom 70vh right 50%) +PASS test unit (inline): vh - ellipse(at bottom 70vh right 80vh) +PASS test unit (inline): vh - ellipse(at right 80% top 50vh) +PASS test unit (inline): vh - ellipse(at right 80% bottom 70vh) +PASS test unit (inline): vh - ellipse(at right 80vh top 50%) +PASS test unit (inline): vh - ellipse(at right 80vh bottom 70%) +PASS test unit (inline): vh - ellipse(at right 80vh bottom 70vh) +PASS test unit (inline): vmin - ellipse(at 50vmin) PASS test unit (inline): vmin - ellipse(at 50% 50vmin) PASS test unit (inline): vmin - ellipse(at 50vmin 50%) PASS test unit (inline): vmin - ellipse(at 50vmin 50vmin) -FAIL test unit (inline): vmin - ellipse(at left 50vmin) assert_equals: expected "ellipse(at 0% 50vmin)" but got "ellipse(at left 50vmin)" -FAIL test unit (inline): vmin - ellipse(at 50vmin top) assert_equals: expected "ellipse(at 50vmin 0%)" but got "ellipse(at 50vmin top)" -FAIL test unit (inline): vmin - ellipse(at right 80vmin) assert_equals: expected "ellipse(at 100% 80vmin)" but got "ellipse(at right 80vmin)" -FAIL test unit (inline): vmin - ellipse(at 70vmin bottom) assert_equals: expected "ellipse(at 70vmin 100%)" but got "ellipse(at 70vmin bottom)" -FAIL test unit (inline): vmin - ellipse(at center 60vmin) assert_equals: expected "ellipse(at 50% 60vmin)" but got "ellipse(at center 60vmin)" -FAIL test unit (inline): vmin - ellipse(at 60vmin center) assert_equals: expected "ellipse(at 60vmin 50%)" but got "ellipse(at 60vmin center)" -FAIL test unit (inline): vmin - ellipse(at left 50% top 50vmin) assert_equals: expected "ellipse(at 50% 50vmin)" but got "ellipse(at left 50% top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at left 50% bottom 70vmin) assert_equals: expected "ellipse(at 50% calc(100% - 70vmin))" but got "ellipse(at left 50% bottom 70vmin)" -FAIL test unit (inline): vmin - ellipse(at left 50vmin top 50%) assert_equals: expected "ellipse(at 50vmin 50%)" but got "ellipse(at left 50vmin top 50%)" -FAIL test unit (inline): vmin - ellipse(at left 50vmin top 50vmin) assert_equals: expected "ellipse(at 50vmin 50vmin)" but got "ellipse(at left 50vmin top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at left 50vmin bottom 70%) assert_equals: expected "ellipse(at 50vmin calc(30%))" but got "ellipse(at left 50vmin bottom 70%)" -FAIL test unit (inline): vmin - ellipse(at top 50% left 50vmin) assert_equals: expected "ellipse(at 50vmin 50%)" but got "ellipse(at left 50vmin top 50%)" -FAIL test unit (inline): vmin - ellipse(at top 50% right 80vmin) assert_equals: expected "ellipse(at calc(100% - 80vmin) 50%)" but got "ellipse(at right 80vmin top 50%)" -FAIL test unit (inline): vmin - ellipse(at top 50vmin left 50%) assert_equals: expected "ellipse(at 50% 50vmin)" but got "ellipse(at left 50% top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at top 50vmin left 50vmin) assert_equals: expected "ellipse(at 50vmin 50vmin)" but got "ellipse(at left 50vmin top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at top 50vmin right 80%) assert_equals: expected "ellipse(at calc(20%) 50vmin)" but got "ellipse(at right 80% top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at bottom 70% left 50vmin) assert_equals: expected "ellipse(at 50vmin calc(30%))" but got "ellipse(at left 50vmin bottom 70%)" -FAIL test unit (inline): vmin - ellipse(at bottom 70% right 80vmin) assert_equals: expected "ellipse(at calc(100% - 80vmin) calc(30%))" but got "ellipse(at right 80vmin bottom 70%)" -FAIL test unit (inline): vmin - ellipse(at bottom 70vmin left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70vmin))" but got "ellipse(at left 50% bottom 70vmin)" -FAIL test unit (inline): vmin - ellipse(at bottom 70vmin right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70vmin))" but got "ellipse(at right 50% bottom 70vmin)" -FAIL test unit (inline): vmin - ellipse(at bottom 70vmin right 80vmin) assert_equals: expected "ellipse(at calc(100% - 80vmin) calc(100% - 70vmin))" but got "ellipse(at right 80vmin bottom 70vmin)" -FAIL test unit (inline): vmin - ellipse(at right 80% top 50vmin) assert_equals: expected "ellipse(at calc(20%) 50vmin)" but got "ellipse(at right 80% top 50vmin)" -FAIL test unit (inline): vmin - ellipse(at right 80% bottom 70vmin) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70vmin))" but got "ellipse(at right 80% bottom 70vmin)" -FAIL test unit (inline): vmin - ellipse(at right 80vmin top 50%) assert_equals: expected "ellipse(at calc(100% - 80vmin) 50%)" but got "ellipse(at right 80vmin top 50%)" -FAIL test unit (inline): vmin - ellipse(at right 80vmin bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80vmin) calc(30%))" but got "ellipse(at right 80vmin bottom 70%)" -FAIL test unit (inline): vmin - ellipse(at right 80vmin bottom 70vmin) assert_equals: expected "ellipse(at calc(100% - 80vmin) calc(100% - 70vmin))" but got "ellipse(at right 80vmin bottom 70vmin)" -FAIL test unit (inline): vmax - ellipse(at 50vmax) assert_equals: expected "ellipse(at 50vmax 50%)" but got "ellipse(at 50vmax center)" +PASS test unit (inline): vmin - ellipse(at left 50vmin) +PASS test unit (inline): vmin - ellipse(at 50vmin top) +PASS test unit (inline): vmin - ellipse(at right 80vmin) +PASS test unit (inline): vmin - ellipse(at 70vmin bottom) +PASS test unit (inline): vmin - ellipse(at center 60vmin) +PASS test unit (inline): vmin - ellipse(at 60vmin center) +PASS test unit (inline): vmin - ellipse(at left 50% top 50vmin) +PASS test unit (inline): vmin - ellipse(at left 50% bottom 70vmin) +PASS test unit (inline): vmin - ellipse(at left 50vmin top 50%) +PASS test unit (inline): vmin - ellipse(at left 50vmin top 50vmin) +PASS test unit (inline): vmin - ellipse(at left 50vmin bottom 70%) +PASS test unit (inline): vmin - ellipse(at top 50% left 50vmin) +PASS test unit (inline): vmin - ellipse(at top 50% right 80vmin) +PASS test unit (inline): vmin - ellipse(at top 50vmin left 50%) +PASS test unit (inline): vmin - ellipse(at top 50vmin left 50vmin) +PASS test unit (inline): vmin - ellipse(at top 50vmin right 80%) +PASS test unit (inline): vmin - ellipse(at bottom 70% left 50vmin) +PASS test unit (inline): vmin - ellipse(at bottom 70% right 80vmin) +PASS test unit (inline): vmin - ellipse(at bottom 70vmin left 50%) +PASS test unit (inline): vmin - ellipse(at bottom 70vmin right 50%) +PASS test unit (inline): vmin - ellipse(at bottom 70vmin right 80vmin) +PASS test unit (inline): vmin - ellipse(at right 80% top 50vmin) +PASS test unit (inline): vmin - ellipse(at right 80% bottom 70vmin) +PASS test unit (inline): vmin - ellipse(at right 80vmin top 50%) +PASS test unit (inline): vmin - ellipse(at right 80vmin bottom 70%) +PASS test unit (inline): vmin - ellipse(at right 80vmin bottom 70vmin) +PASS test unit (inline): vmax - ellipse(at 50vmax) PASS test unit (inline): vmax - ellipse(at 50% 50vmax) PASS test unit (inline): vmax - ellipse(at 50vmax 50%) PASS test unit (inline): vmax - ellipse(at 50vmax 50vmax) -FAIL test unit (inline): vmax - ellipse(at left 50vmax) assert_equals: expected "ellipse(at 0% 50vmax)" but got "ellipse(at left 50vmax)" -FAIL test unit (inline): vmax - ellipse(at 50vmax top) assert_equals: expected "ellipse(at 50vmax 0%)" but got "ellipse(at 50vmax top)" -FAIL test unit (inline): vmax - ellipse(at right 80vmax) assert_equals: expected "ellipse(at 100% 80vmax)" but got "ellipse(at right 80vmax)" -FAIL test unit (inline): vmax - ellipse(at 70vmax bottom) assert_equals: expected "ellipse(at 70vmax 100%)" but got "ellipse(at 70vmax bottom)" -FAIL test unit (inline): vmax - ellipse(at center 60vmax) assert_equals: expected "ellipse(at 50% 60vmax)" but got "ellipse(at center 60vmax)" -FAIL test unit (inline): vmax - ellipse(at 60vmax center) assert_equals: expected "ellipse(at 60vmax 50%)" but got "ellipse(at 60vmax center)" -FAIL test unit (inline): vmax - ellipse(at left 50% top 50vmax) assert_equals: expected "ellipse(at 50% 50vmax)" but got "ellipse(at left 50% top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at left 50% bottom 70vmax) assert_equals: expected "ellipse(at 50% calc(100% - 70vmax))" but got "ellipse(at left 50% bottom 70vmax)" -FAIL test unit (inline): vmax - ellipse(at left 50vmax top 50%) assert_equals: expected "ellipse(at 50vmax 50%)" but got "ellipse(at left 50vmax top 50%)" -FAIL test unit (inline): vmax - ellipse(at left 50vmax top 50vmax) assert_equals: expected "ellipse(at 50vmax 50vmax)" but got "ellipse(at left 50vmax top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at left 50vmax bottom 70%) assert_equals: expected "ellipse(at 50vmax calc(30%))" but got "ellipse(at left 50vmax bottom 70%)" -FAIL test unit (inline): vmax - ellipse(at top 50% left 50vmax) assert_equals: expected "ellipse(at 50vmax 50%)" but got "ellipse(at left 50vmax top 50%)" -FAIL test unit (inline): vmax - ellipse(at top 50% right 80vmax) assert_equals: expected "ellipse(at calc(100% - 80vmax) 50%)" but got "ellipse(at right 80vmax top 50%)" -FAIL test unit (inline): vmax - ellipse(at top 50vmax left 50%) assert_equals: expected "ellipse(at 50% 50vmax)" but got "ellipse(at left 50% top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at top 50vmax left 50vmax) assert_equals: expected "ellipse(at 50vmax 50vmax)" but got "ellipse(at left 50vmax top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at top 50vmax right 80%) assert_equals: expected "ellipse(at calc(20%) 50vmax)" but got "ellipse(at right 80% top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at bottom 70% left 50vmax) assert_equals: expected "ellipse(at 50vmax calc(30%))" but got "ellipse(at left 50vmax bottom 70%)" -FAIL test unit (inline): vmax - ellipse(at bottom 70% right 80vmax) assert_equals: expected "ellipse(at calc(100% - 80vmax) calc(30%))" but got "ellipse(at right 80vmax bottom 70%)" -FAIL test unit (inline): vmax - ellipse(at bottom 70vmax left 50%) assert_equals: expected "ellipse(at 50% calc(100% - 70vmax))" but got "ellipse(at left 50% bottom 70vmax)" -FAIL test unit (inline): vmax - ellipse(at bottom 70vmax right 50%) assert_equals: expected "ellipse(at calc(50%) calc(100% - 70vmax))" but got "ellipse(at right 50% bottom 70vmax)" -FAIL test unit (inline): vmax - ellipse(at bottom 70vmax right 80vmax) assert_equals: expected "ellipse(at calc(100% - 80vmax) calc(100% - 70vmax))" but got "ellipse(at right 80vmax bottom 70vmax)" -FAIL test unit (inline): vmax - ellipse(at right 80% top 50vmax) assert_equals: expected "ellipse(at calc(20%) 50vmax)" but got "ellipse(at right 80% top 50vmax)" -FAIL test unit (inline): vmax - ellipse(at right 80% bottom 70vmax) assert_equals: expected "ellipse(at calc(20%) calc(100% - 70vmax))" but got "ellipse(at right 80% bottom 70vmax)" -FAIL test unit (inline): vmax - ellipse(at right 80vmax top 50%) assert_equals: expected "ellipse(at calc(100% - 80vmax) 50%)" but got "ellipse(at right 80vmax top 50%)" -FAIL test unit (inline): vmax - ellipse(at right 80vmax bottom 70%) assert_equals: expected "ellipse(at calc(100% - 80vmax) calc(30%))" but got "ellipse(at right 80vmax bottom 70%)" -FAIL test unit (inline): vmax - ellipse(at right 80vmax bottom 70vmax) assert_equals: expected "ellipse(at calc(100% - 80vmax) calc(100% - 70vmax))" but got "ellipse(at right 80vmax bottom 70vmax)" +PASS test unit (inline): vmax - ellipse(at left 50vmax) +PASS test unit (inline): vmax - ellipse(at 50vmax top) +PASS test unit (inline): vmax - ellipse(at right 80vmax) +PASS test unit (inline): vmax - ellipse(at 70vmax bottom) +PASS test unit (inline): vmax - ellipse(at center 60vmax) +PASS test unit (inline): vmax - ellipse(at 60vmax center) +PASS test unit (inline): vmax - ellipse(at left 50% top 50vmax) +PASS test unit (inline): vmax - ellipse(at left 50% bottom 70vmax) +PASS test unit (inline): vmax - ellipse(at left 50vmax top 50%) +PASS test unit (inline): vmax - ellipse(at left 50vmax top 50vmax) +PASS test unit (inline): vmax - ellipse(at left 50vmax bottom 70%) +PASS test unit (inline): vmax - ellipse(at top 50% left 50vmax) +PASS test unit (inline): vmax - ellipse(at top 50% right 80vmax) +PASS test unit (inline): vmax - ellipse(at top 50vmax left 50%) +PASS test unit (inline): vmax - ellipse(at top 50vmax left 50vmax) +PASS test unit (inline): vmax - ellipse(at top 50vmax right 80%) +PASS test unit (inline): vmax - ellipse(at bottom 70% left 50vmax) +PASS test unit (inline): vmax - ellipse(at bottom 70% right 80vmax) +PASS test unit (inline): vmax - ellipse(at bottom 70vmax left 50%) +PASS test unit (inline): vmax - ellipse(at bottom 70vmax right 50%) +PASS test unit (inline): vmax - ellipse(at bottom 70vmax right 80vmax) +PASS test unit (inline): vmax - ellipse(at right 80% top 50vmax) +PASS test unit (inline): vmax - ellipse(at right 80% bottom 70vmax) +PASS test unit (inline): vmax - ellipse(at right 80vmax top 50%) +PASS test unit (inline): vmax - ellipse(at right 80vmax bottom 70%) +PASS test unit (inline): vmax - ellipse(at right 80vmax bottom 70vmax) PASS test unit (computed): cm - ellipse(at 50cm) PASS test unit (computed): cm - ellipse(at 50% 50cm) PASS test unit (computed): cm - ellipse(at 50cm 50%) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009-expected.txt index 049ee1fcf6db..3169ab869394 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009-expected.txt @@ -1,16 +1,16 @@ -FAIL ellipse(at +50px) - inline assert_equals: expected "ellipse(at 50px 50%)" but got "ellipse(at 50px center)" -FAIL ellipse(at -50px) - inline assert_equals: expected "ellipse(at -50px 50%)" but got "ellipse(at -50px center)" -FAIL ellipse(at +50%) - inline assert_equals: expected "ellipse(at 50% 50%)" but got "ellipse(at 50% center)" -FAIL ellipse(at -50%) - inline assert_equals: expected "ellipse(at -50% 50%)" but got "ellipse(at -50% center)" -FAIL ellipse(at left +50px) - inline assert_equals: expected "ellipse(at 0% 50px)" but got "ellipse(at left 50px)" -FAIL ellipse(at left +50%) - inline assert_equals: expected "ellipse(at 0% 50%)" but got "ellipse(at left 50%)" -FAIL ellipse(at right -50px) - inline assert_equals: expected "ellipse(at 100% -50px)" but got "ellipse(at right -50px)" -FAIL ellipse(at right -50%) - inline assert_equals: expected "ellipse(at 100% -50%)" but got "ellipse(at right -50%)" -FAIL ellipse(at +50px top) - inline assert_equals: expected "ellipse(at 50px 0%)" but got "ellipse(at 50px top)" -FAIL ellipse(at +50% top) - inline assert_equals: expected "ellipse(at 50% 0%)" but got "ellipse(at 50% top)" -FAIL ellipse(at -50px bottom) - inline assert_equals: expected "ellipse(at -50px 100%)" but got "ellipse(at -50px bottom)" -FAIL ellipse(at -50% bottom) - inline assert_equals: expected "ellipse(at -50% 100%)" but got "ellipse(at -50% bottom)" +PASS ellipse(at +50px) - inline +PASS ellipse(at -50px) - inline +PASS ellipse(at +50%) - inline +PASS ellipse(at -50%) - inline +PASS ellipse(at left +50px) - inline +PASS ellipse(at left +50%) - inline +PASS ellipse(at right -50px) - inline +PASS ellipse(at right -50%) - inline +PASS ellipse(at +50px top) - inline +PASS ellipse(at +50% top) - inline +PASS ellipse(at -50px bottom) - inline +PASS ellipse(at -50% bottom) - inline PASS ellipse(at +50px +50px) - inline PASS ellipse(at +50% +50%) - inline PASS ellipse(at -50px -50px) - inline diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009.html index 36db61825b20..9e571bd89745 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/shape-outside-ellipse-009.html @@ -21,62 +21,62 @@ var valid_ellipse_radii_tests = [ { "actual": "ellipse(at +50px)", - "expected_inline": "ellipse(at 50px 50%)", + "expected_inline": "ellipse(at 50px center)", "expected_computed": "ellipse(at 50px 50%)" }, { "actual": "ellipse(at -50px)", - "expected_inline": "ellipse(at -50px 50%)", + "expected_inline": "ellipse(at -50px center)", "expected_computed": "ellipse(at -50px 50%)" }, { "actual": "ellipse(at +50%)", - "expected_inline": "ellipse(at 50% 50%)", + "expected_inline": "ellipse(at 50% center)", "expected_computed": "ellipse(at 50% 50%)" }, { "actual": "ellipse(at -50%)", - "expected_inline": "ellipse(at -50% 50%)", + "expected_inline": "ellipse(at -50% center)", "expected_computed": "ellipse(at -50% 50%)" }, { "actual": "ellipse(at left +50px)", - "expected_inline": "ellipse(at 0% 50px)", + "expected_inline": "ellipse(at left 50px)", "expected_computed": "ellipse(at 0% 50px)" }, { "actual": "ellipse(at left +50%)", - "expected_inline": "ellipse(at 0% 50%)", + "expected_inline": "ellipse(at left 50%)", "expected_computed": "ellipse(at 0% 50%)" }, { "actual": "ellipse(at right -50px)", - "expected_inline": "ellipse(at 100% -50px)", + "expected_inline": "ellipse(at right -50px)", "expected_computed": "ellipse(at 100% -50px)" }, { "actual": "ellipse(at right -50%)", - "expected_inline": "ellipse(at 100% -50%)", + "expected_inline": "ellipse(at right -50%)", "expected_computed": "ellipse(at 100% -50%)" }, { "actual": "ellipse(at +50px top)", - "expected_inline": "ellipse(at 50px 0%)", + "expected_inline": "ellipse(at 50px top)", "expected_computed": "ellipse(at 50px 0%)" }, { "actual": "ellipse(at +50% top)", - "expected_inline": "ellipse(at 50% 0%)", + "expected_inline": "ellipse(at 50% top)", "expected_computed": "ellipse(at 50% 0%)" }, { "actual": "ellipse(at -50px bottom)", - "expected_inline": "ellipse(at -50px 100%)", + "expected_inline": "ellipse(at -50px bottom)", "expected_computed": "ellipse(at -50px 100%)" }, { "actual": "ellipse(at -50% bottom)", - "expected_inline": "ellipse(at -50% 100%)", + "expected_inline": "ellipse(at -50% bottom)", "expected_computed": "ellipse(at -50% 100%)" }, { diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/support/parsing-utils.js b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/support/parsing-utils.js index 9c13a213e96b..e438ab9fa937 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/support/parsing-utils.js +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/shape-outside/values/support/parsing-utils.js @@ -519,93 +519,93 @@ var validUnits = [ var validPositions = [ /// [ percent ], [ length ], [ percent | percent ], [ percent | length ], [ length | percent ], [ length | length ] - ["50%", "50% 50%"], - ["50u1", "50u1 50%"], + ["50%", "50% center", "50% 50%"], + ["50u1", "50u1 center", "50u1 50%"], ["50% 50%", "50% 50%"], ["50% 50u1", "50% 50u1"], ["50u1 50%", "50u1 50%"], ["50u1 50u1", "50u1 50u1"], ///// [ keyword ], [ keyword keyword ] x 5 keywords - ["left", "0% 50%"], - ["top", "50% 0%"], - ["right", "100% 50%"], - ["bottom", "50% 100%"], - ["center", "50% 50%"], - - ["left top", "0% 0%"], - ["left bottom", "0% 100%"], - ["left center", "0% 50%"], - - ["top left", "0% 0%"], - ["top right", "100% 0%"], - ["top center", "50% 0%"], - - ["right top", "100% 0%"], - ["right bottom", "100% 100%"], - ["right center", "100% 50%"], - - ["bottom left", "0% 100%"], - ["bottom right", "100% 100%"], - ["bottom center", "50% 100%"], - - ["center top", "50% 0%"], - ["center left", "0% 50%"], - ["center right", "100% 50%"], - ["center bottom", "50% 100%"], - ["center center", "50% 50%"], + ["left", "left center", "0% 50%"], + ["top", "center top", "50% 0%"], + ["right", "right center", "100% 50%"], + ["bottom", "center bottom", "50% 100%"], + ["center", "center center", "50% 50%"], + + ["left top", "left top", "0% 0%"], + ["left bottom", "left bottom", "0% 100%"], + ["left center", "left center", "0% 50%"], + + ["top left", "left top", "0% 0%"], + ["top right", "right top", "100% 0%"], + ["top center", "center top", "50% 0%"], + + ["right top", "right top", "100% 0%"], + ["right bottom", "right bottom", "100% 100%"], + ["right center", "right center", "100% 50%"], + + ["bottom left", "left bottom", "0% 100%"], + ["bottom right", "right bottom", "100% 100%"], + ["bottom center", "center bottom", "50% 100%"], + + ["center top", "center top", "50% 0%"], + ["center left", "left center", "0% 50%"], + ["center right", "right center", "100% 50%"], + ["center bottom", "center bottom", "50% 100%"], + ["center center", "center center", "50% 50%"], ////// [ keyword | percent ], [ keyword | length ], [ percent | keyword ], [ length | keyword ] x 5 keywords - ["left 50%", "0% 50%"], - ["left 50u1", "0% 50u1"], + ["left 50%", "left 50%", "0% 50%"], + ["left 50u1", "left 50u1", "0% 50u1"], - ["50% top", "50% 0%"], - ["50u1 top", "50u1 0%"], + ["50% top", "50% top", "50% 0%"], + ["50u1 top", "50u1 top", "50u1 0%"], - ["right 80%", "100% 80%"], - ["right 80u1", "100% 80u1"], + ["right 80%", "right 80%", "100% 80%"], + ["right 80u1", "right 80u1", "100% 80u1"], - ["70% bottom", "70% 100%"], - ["70u1 bottom", "70u1 100%"], + ["70% bottom", "70% bottom", "70% 100%"], + ["70u1 bottom", "70u1 bottom", "70u1 100%"], - ["center 60%", "50% 60%"], - ["center 60u1", "50% 60u1"], - ["60% center", "60% 50%"], - ["60u1 center", "60u1 50%"], + ["center 60%", "center 60%", "50% 60%"], + ["center 60u1", "center 60u1", "50% 60u1"], + ["60% center", "60% center", "60% 50%"], + ["60u1 center", "60u1 center", "60u1 50%"], ////// [ keyword percent | keyword percent], [ keyword percent | keyword length], ////// [ keyword length | keyword length], [ keyword length | keyword percent] x 5 keywords - ["left 50% top 50%", "50% 50%"], - ["left 50% top 50u1", "50% 50u1"], - ["left 50% bottom 70%", "50% calc(30%)", "50% 30%"], - ["left 50% bottom 70u1", "[convert] 50% calc(100% - 70u1)"], - ["left 50u1 top 50%", "50u1 50%"], - ["left 50u1 top 50u1", "50u1 50u1"], - ["left 50u1 bottom 70%", "50u1 calc(30%)", "50u1 30%"], - - ["top 50% left 50%", "50% 50%"], - ["top 50% left 50u1", "50u1 50%"], - ["top 50% right 80%", "calc(20%) 50%", "20% 50%"], - ["top 50% right 80u1", "[convert] calc(100% - 80u1) 50%"], - ["top 50u1 left 50%", "50% 50u1"], - ["top 50u1 left 50u1", "50u1 50u1"], - ["top 50u1 right 80%", "calc(20%) 50u1", "20% 50u1"], - - ["bottom 70% left 50%", "50% calc(30%)", "50% 30%"], - ["bottom 70% left 50u1", "50u1 calc(30%)", "50u1 30%"], - ["bottom 70% right 80%", "calc(20%) calc(30%)", "20% 30%"], - ["bottom 70% right 80u1", "[convert] calc(100% - 80u1) calc(30%)", "calc(100% - 80u1) 30%"], - ["bottom 70u1 left 50%", "[convert] 50% calc(100% - 70u1)"], - ["bottom 70u1 right 50%", "[convert] calc(50%) calc(100% - 70u1)", "50% calc(100% - 70u1)"], - ["bottom 70u1 right 80u1", "[convert] calc(100% - 80u1) calc(100% - 70u1)"], - - ["right 80% top 50%", "calc(20%) 50%", "20% 50%"], - ["right 80% top 50u1", "calc(20%) 50u1", "20% 50u1"], - ["right 80% bottom 70%", "calc(20%) calc(30%)", "20% 30%"], - ["right 80% bottom 70u1", "[convert] calc(20%) calc(100% - 70u1)", "20% calc(100% - 70u1)"], - ["right 80u1 top 50%", "[convert] calc(100% - 80u1) 50%"], - ["right 80u1 bottom 70%", "[convert] calc(100% - 80u1) calc(30%)", "calc(100% - 80u1) 30%"], - ["right 80u1 bottom 70u1", "[convert] calc(100% - 80u1) calc(100% - 70u1)"], + ["left 50% top 50%", "left 50% top 50%", "50% 50%"], + ["left 50% top 50u1", "left 50% top 50u1", "50% 50u1"], + ["left 50% bottom 70%", "left 50% bottom 70%", "50% 30%"], + ["left 50% bottom 70u1", "left 50% bottom 70u1", "50% calc(100% - 70u1)"], + ["left 50u1 top 50%", "left 50u1 top 50%", "50u1 50%"], + ["left 50u1 top 50u1", "left 50u1 top 50u1", "50u1 50u1"], + ["left 50u1 bottom 70%", "left 50u1 bottom 70%", "50u1 30%"], + + ["top 50% left 50%", "left 50% top 50%", "50% 50%"], + ["top 50% left 50u1", "left 50u1 top 50%", "50u1 50%"], + ["top 50% right 80%", "right 80% top 50%", "20% 50%"], + ["top 50% right 80u1", "right 80u1 top 50%", "calc(100% - 80u1) 50%"], + ["top 50u1 left 50%", "left 50% top 50u1", "50% 50u1"], + ["top 50u1 left 50u1", "left 50u1 top 50u1", "50u1 50u1"], + ["top 50u1 right 80%", "right 80% top 50u1", "20% 50u1"], + + ["bottom 70% left 50%", "left 50% bottom 70%", "50% 30%"], + ["bottom 70% left 50u1", "left 50u1 bottom 70%", "50u1 30%"], + ["bottom 70% right 80%", "right 80% bottom 70%", "20% 30%"], + ["bottom 70% right 80u1", "right 80u1 bottom 70%", "calc(100% - 80u1) 30%"], + ["bottom 70u1 left 50%", "left 50% bottom 70u1", "50% calc(100% - 70u1)"], + ["bottom 70u1 right 50%", "right 50% bottom 70u1", "50% calc(100% - 70u1)"], + ["bottom 70u1 right 80u1", "right 80u1 bottom 70u1", "calc(100% - 80u1) calc(100% - 70u1)"], + + ["right 80% top 50%", "right 80% top 50%", "20% 50%"], + ["right 80% top 50u1", "right 80% top 50u1", "20% 50u1"], + ["right 80% bottom 70%", "right 80% bottom 70%", "20% 30%"], + ["right 80% bottom 70u1", "right 80% bottom 70u1", "20% calc(100% - 70u1)"], + ["right 80u1 top 50%", "right 80u1 top 50%", "calc(100% - 80u1) 50%"], + ["right 80u1 bottom 70%", "right 80u1 bottom 70%", "calc(100% - 80u1) 30%"], + ["right 80u1 bottom 70u1", "right 80u1 bottom 70u1", "calc(100% - 80u1) calc(100% - 70u1)"], ]; var invalidPositions = [ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-intrinsic-height-inset-percentage-child.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-intrinsic-height-inset-percentage-child.html index b82e2ccd797f..2ed202b152f2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-intrinsic-height-inset-percentage-child.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-intrinsic-height-inset-percentage-child.html @@ -1,5 +1,6 @@ + + +
    + + +
    + +
    +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-crash.html index 04b6f1b28c7f..7a4dff81fa09 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-crash.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-crash.html @@ -1,4 +1,4 @@ - + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-name-change.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-name-change.html new file mode 100644 index 000000000000..4e5fe430ad69 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-name-change.html @@ -0,0 +1,12 @@ + + + + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-remove.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-remove.html new file mode 100644 index 000000000000..c12b4db8ef4b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-remove.html @@ -0,0 +1,11 @@ + + + + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-write.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-write.html new file mode 100644 index 000000000000..80bd5a308a63 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-write.html @@ -0,0 +1,10 @@ + + + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-after-head.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-after-head.html new file mode 100644 index 000000000000..66f339bd77cd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-after-head.html @@ -0,0 +1,15 @@ + + + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-in-body.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-in-body.html new file mode 100644 index 000000000000..83f0392d8a17 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-in-body.html @@ -0,0 +1,15 @@ + + + + + + + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-navigation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-navigation.html new file mode 100644 index 000000000000..94e744eee7b6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-navigation.html @@ -0,0 +1,18 @@ + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-slow.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-slow.html index 4ff0d4c29a79..369977b0e6c5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-slow.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-slow.html @@ -1,5 +1,9 @@ + + -
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/slow.js b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/slow.js new file mode 100644 index 000000000000..3f3652caf198 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/slow.js @@ -0,0 +1,15 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Force a sleep for 0.5 second, to make sure the rest of the parsing is done +// via a timer. +(function () { + const start = new Date().getTime(); + while (true) { + const now = new Date().getTime(); + if (now - start > 500) { + break; + } + } +})(); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/w3c-import.log index 7d30146bfed9..f44b0fd2569b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/w3c-import.log @@ -17,10 +17,18 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/1x1-navy.png /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-400x200root.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dom-content-loaded.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-append.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-name-change.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-remove.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-dynamic-write.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-icb.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-after-head.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-meta-in-body.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-navigation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-request-resize-error.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-request-resize.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-slow.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents-unsized.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/iframe-contents.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/slow-image.py +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/resources/slow.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded-expected.txt new file mode 100644 index 000000000000..3a393d940912 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded-expected.txt @@ -0,0 +1,10 @@ + + +Harness Error (FAIL), message = Unhandled rejection: assert_equals: expected 400 but got 150 + +TIMEOUT `DOMContentLoaded` triggers resizing Test timed out + +Harness Error (FAIL), message = Unhandled rejection: assert_equals: expected 400 but got 150 + +TIMEOUT `DOMContentLoaded` triggers resizing Test timed out + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.html new file mode 100644 index 000000000000..13d8f4b81ceb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.html @@ -0,0 +1,30 @@ + +Test that `DOMContentLoaded` triggers resizing. + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative-expected.txt deleted file mode 100644 index 7039ae335139..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative-expected.txt +++ /dev/null @@ -1,4 +0,0 @@ - - -FAIL `DOMContentLoaded` triggers resizing assert_equals: expected 200 but got 150 - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative.html deleted file mode 100644 index 3cf977c98764..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative.html +++ /dev/null @@ -1,31 +0,0 @@ - -Test that `DOMContentLoaded` triggers resizing. - - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append.html new file mode 100644 index 000000000000..25e0fdb05fb0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append.html @@ -0,0 +1,12 @@ + +Test that dynamic addition of meta tag does not enable responsive sizing. + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change-expected.html new file mode 100644 index 000000000000..2fa633e086dc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change.html new file mode 100644 index 000000000000..17f7bfdf0fc3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change.html @@ -0,0 +1,12 @@ + +Test that dynamic addition of meta tag does not enable responsive sizing. + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove.html new file mode 100644 index 000000000000..618cee920e8a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove.html @@ -0,0 +1,11 @@ + +Test that responsive iframe meta tag is immutable using ref test. + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write-expected.html new file mode 100644 index 000000000000..2fa633e086dc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write.html new file mode 100644 index 000000000000..a43978155c15 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write.html @@ -0,0 +1,12 @@ + +Test that dynamic addition of meta tag via document.write does not enable responsive sizing. + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative-expected.txt deleted file mode 100644 index 591e3e8e0b3d..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative-expected.txt +++ /dev/null @@ -1,4 +0,0 @@ - - -FAIL The fallback size is used assert_equals: expected 100 but got 150 - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative.html deleted file mode 100644 index 6c9592a52253..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative.html +++ /dev/null @@ -1,28 +0,0 @@ - -Test that the fallback size is used. - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.html new file mode 100644 index 000000000000..1fe95f67084e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.html @@ -0,0 +1,35 @@ + +Test that IFRAME content uses the initial ICB to measure the natural size. + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative.html deleted file mode 100644 index 1011e7b5139e..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative.html +++ /dev/null @@ -1,35 +0,0 @@ - -Test that IFRAME content uses the initial ICB to measure the natural size. - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head-expected.html new file mode 100644 index 000000000000..c446474f71a9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head.html new file mode 100644 index 000000000000..b7bf85e3459f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head.html @@ -0,0 +1,12 @@ + +Test that meta tag after head enables responsive sizing. + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body-expected.html new file mode 100644 index 000000000000..2fa633e086dc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body.html new file mode 100644 index 000000000000..9d762c36c099 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body.html @@ -0,0 +1,12 @@ + +Test that meta tag in body does not enable responsive sizing. + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-expected.txt new file mode 100644 index 000000000000..2563db8df5fc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-expected.txt @@ -0,0 +1,4 @@ + + +FAIL Responsive iframe preserves size during navigation assert_equals: Initial height should be 200px expected 200 but got 150 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized.html new file mode 100644 index 000000000000..93fdab5b569d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized.html @@ -0,0 +1,57 @@ + +Responsive iframe should clear size during navigation to non-responsive page + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=cross-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=cross-expected.txt new file mode 100644 index 000000000000..ec41ee4adb3d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=cross-expected.txt @@ -0,0 +1,4 @@ + + +FAIL Responsive iframe clears size during navigation to non-responsive page assert_equals: Initial height should be 200px expected 200 but got 150 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=same-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=same-expected.txt new file mode 100644 index 000000000000..ec41ee4adb3d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized_origin=same-expected.txt @@ -0,0 +1,4 @@ + + +FAIL Responsive iframe clears size during navigation to non-responsive page assert_equals: Initial height should be 200px expected 200 but got 150 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation.html new file mode 100644 index 000000000000..d6412fb81477 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation.html @@ -0,0 +1,77 @@ + +Responsive iframe should keep size during navigation + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized-expected.html new file mode 100644 index 000000000000..2fa633e086dc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.tentative-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-expected.html new file mode 100644 index 000000000000..c446474f71a9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-expected.html @@ -0,0 +1,10 @@ + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=,300,150-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=,300,150-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=,300,150-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=,300,150-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-block-size,300,200-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-block-size,300,200-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-block-size,300,200-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-block-size,300,200-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-block-size,400,150,vertical-rl-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-block-size,400,150,vertical-rl-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-block-size,400,150,vertical-rl-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-block-size,400,150,vertical-rl-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-height,300,200-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-height,300,200-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-height,300,200-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-height,300,200-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-inline-size,300,200,vertical-rl-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-inline-size,300,200,vertical-rl-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-inline-size,300,200,vertical-rl-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-inline-size,300,200,vertical-rl-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-inline-size,400,150-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-inline-size,400,150-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-inline-size,400,150-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-inline-size,400,150-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-width,400,150-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-width,400,150-expected.txt similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative_value=content-width,400,150-expected.txt rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value_value=content-width,400,150-expected.txt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/w3c-import.log index 7bc2e805a213..429f8beb76df 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/w3c-import.log @@ -14,24 +14,37 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-fallback.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-no-match-element.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin-not-embedded-sized.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-cross-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dom-content-loaded.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-append.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-name-change.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-remove.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-dynamic-write.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-icb.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-after-head.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-meta-in-body.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation-unsized.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-navigation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-no-match-element-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-no-match-element.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-not-embedded-sized.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-ref.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-error.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-request-resize.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-unsized-ref.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.tentative.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe-value.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/responsive-iframe/responsive-iframe.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative-expected.txt index 9e7d139ffae5..6dd82a029c67 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative-expected.txt @@ -6,50 +6,124 @@ -PASS [data-expected-height] 1 -PASS [data-expected-height] 2 -PASS [data-expected-height] 3 -PASS [data-expected-height] 4 -PASS [data-expected-height] 5 -PASS [data-expected-height] 6 -PASS [data-expected-height] 7 +FAIL [data-expected-height] 1 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 2 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 3 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 4 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 5 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 6 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 7 assert_equals: +
    +height expected 55 but got 50 PASS [data-expected-height] 8 -PASS [data-expected-height] 9 -PASS [data-expected-height] 10 -PASS [data-expected-height] 11 -PASS [data-expected-height] 12 -PASS [data-expected-height] 13 -PASS [data-expected-height] 14 -PASS [data-expected-height] 15 -PASS [data-expected-height] 16 -PASS [data-expected-height] 17 -PASS [data-expected-height] 18 +FAIL [data-expected-height] 9 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 10 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 11 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 12 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 13 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 14 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 15 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 16 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 17 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 18 assert_equals: +
    +height expected 10 but got 50 PASS [data-expected-height] 19 PASS [data-expected-height] 20 PASS [data-expected-height] 21 PASS [data-expected-height] 22 -PASS [data-expected-height] 23 -PASS [data-expected-height] 24 -PASS [data-expected-height] 25 -PASS [data-expected-height] 26 -PASS [data-expected-height] 27 -PASS [data-expected-height] 28 -PASS [data-expected-height] 29 -PASS [data-expected-height] 30 -PASS [data-expected-height] 31 -PASS [data-expected-height] 32 -PASS [data-expected-height] 33 -PASS [data-expected-height] 34 -PASS [data-expected-height] 35 -PASS [data-expected-height] 36 -PASS [data-expected-height] 37 -PASS [data-expected-height] 38 -PASS [data-expected-height] 39 -PASS [data-expected-height] 40 -PASS [data-expected-height] 41 +FAIL [data-expected-height] 23 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 24 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 25 assert_equals: + +height expected 45 but got 40 +FAIL [data-expected-height] 26 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 27 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 28 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 29 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 30 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 31 assert_equals: +
    +height expected 50 but got 40 +FAIL [data-expected-height] 32 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 33 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 34 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 35 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 36 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 37 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 38 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 39 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 40 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 41 assert_equals: +
    +height expected 10 but got 40 PASS [data-expected-height] 42 PASS [data-expected-height] 43 PASS [data-expected-height] 44 PASS [data-expected-height] 45 -PASS [data-expected-height] 46 +FAIL [data-expected-height] 46 assert_equals: +
    +height expected 45 but got 50 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative-expected.txt index f6d06a4c04b8..f99022d48d69 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative-expected.txt @@ -6,49 +6,125 @@ -PASS [data-expected-height] 1 -PASS [data-expected-height] 2 -PASS [data-expected-height] 3 -PASS [data-expected-height] 4 -PASS [data-expected-height] 5 -PASS [data-expected-height] 6 -PASS [data-expected-height] 7 +FAIL [data-expected-height] 1 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 2 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 3 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 4 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 5 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 6 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 7 assert_equals: +
    +height expected 55 but got 50 PASS [data-expected-height] 8 -PASS [data-expected-height] 9 -PASS [data-expected-height] 10 -PASS [data-expected-height] 11 -PASS [data-expected-height] 12 -PASS [data-expected-height] 13 -PASS [data-expected-height] 14 -PASS [data-expected-height] 15 -PASS [data-expected-height] 16 -PASS [data-expected-height] 17 -PASS [data-expected-height] 18 +FAIL [data-expected-height] 9 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 10 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 11 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 12 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 13 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 14 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 15 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 16 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 17 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 18 assert_equals: +
    +height expected 10 but got 50 PASS [data-expected-height] 19 PASS [data-expected-height] 20 PASS [data-expected-height] 21 -PASS [data-expected-height] 22 -PASS [data-expected-height] 23 -PASS [data-expected-height]:not([skip-second-pass]) 24 -PASS [data-expected-height]:not([skip-second-pass]) 25 -PASS [data-expected-height]:not([skip-second-pass]) 26 -PASS [data-expected-height]:not([skip-second-pass]) 27 -PASS [data-expected-height]:not([skip-second-pass]) 28 -PASS [data-expected-height]:not([skip-second-pass]) 29 -PASS [data-expected-height]:not([skip-second-pass]) 30 -PASS [data-expected-height]:not([skip-second-pass]) 31 -PASS [data-expected-height]:not([skip-second-pass]) 32 -PASS [data-expected-height]:not([skip-second-pass]) 33 -PASS [data-expected-height]:not([skip-second-pass]) 34 -PASS [data-expected-height]:not([skip-second-pass]) 35 -PASS [data-expected-height]:not([skip-second-pass]) 36 -PASS [data-expected-height]:not([skip-second-pass]) 37 -PASS [data-expected-height]:not([skip-second-pass]) 38 -PASS [data-expected-height]:not([skip-second-pass]) 39 -PASS [data-expected-height]:not([skip-second-pass]) 40 -PASS [data-expected-height]:not([skip-second-pass]) 41 +FAIL [data-expected-height] 22 assert_equals: +
    +height expected 30 but got 50 +FAIL [data-expected-height] 23 assert_equals: +
    +height expected 65 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 24 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 25 assert_equals: + +height expected 45 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 26 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 27 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 28 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 29 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height]:not([skip-second-pass]) 30 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 31 assert_equals: +
    +height expected 50 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 32 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 33 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 34 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 35 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 36 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 37 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 38 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 39 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 40 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height]:not([skip-second-pass]) 41 assert_equals: +
    +height expected 10 but got 40 PASS [data-expected-height]:not([skip-second-pass]) 42 PASS [data-expected-height]:not([skip-second-pass]) 43 PASS [data-expected-height]:not([skip-second-pass]) 44 -PASS [data-expected-height]:not([skip-second-pass]) 45 +FAIL [data-expected-height]:not([skip-second-pass]) 45 assert_equals: +
    +height expected 30 but got 50 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative-expected.txt index 9e7d139ffae5..2963b27bbb1f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative-expected.txt @@ -6,50 +6,132 @@ -PASS [data-expected-height] 1 -PASS [data-expected-height] 2 -PASS [data-expected-height] 3 -PASS [data-expected-height] 4 -PASS [data-expected-height] 5 -PASS [data-expected-height] 6 -PASS [data-expected-height] 7 +FAIL [data-expected-height] 1 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 2 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 3 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 4 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 5 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 6 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 7 assert_equals: +
    +height expected 55 but got 50 PASS [data-expected-height] 8 -PASS [data-expected-height] 9 -PASS [data-expected-height] 10 -PASS [data-expected-height] 11 -PASS [data-expected-height] 12 -PASS [data-expected-height] 13 -PASS [data-expected-height] 14 -PASS [data-expected-height] 15 -PASS [data-expected-height] 16 -PASS [data-expected-height] 17 -PASS [data-expected-height] 18 +FAIL [data-expected-height] 9 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 10 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 11 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 12 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 13 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 14 assert_equals: +
    +height expected 55 but got 50 +FAIL [data-expected-height] 15 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 16 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 17 assert_equals: +
    +height expected 10 but got 50 +FAIL [data-expected-height] 18 assert_equals: +
    +height expected 10 but got 50 PASS [data-expected-height] 19 -PASS [data-expected-height] 20 +FAIL [data-expected-height] 20 assert_equals: +
    +height expected 45 but got 50 PASS [data-expected-height] 21 -PASS [data-expected-height] 22 -PASS [data-expected-height] 23 -PASS [data-expected-height] 24 -PASS [data-expected-height] 25 -PASS [data-expected-height] 26 -PASS [data-expected-height] 27 -PASS [data-expected-height] 28 -PASS [data-expected-height] 29 -PASS [data-expected-height] 30 -PASS [data-expected-height] 31 -PASS [data-expected-height] 32 -PASS [data-expected-height] 33 -PASS [data-expected-height] 34 -PASS [data-expected-height] 35 -PASS [data-expected-height] 36 -PASS [data-expected-height] 37 -PASS [data-expected-height] 38 -PASS [data-expected-height] 39 -PASS [data-expected-height] 40 -PASS [data-expected-height] 41 +FAIL [data-expected-height] 22 assert_equals: +
    +height expected 30 but got 50 +FAIL [data-expected-height] 23 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 24 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 25 assert_equals: + +height expected 45 but got 40 +FAIL [data-expected-height] 26 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 27 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 28 assert_equals: + +height expected 45 but got 50 +FAIL [data-expected-height] 29 assert_equals: +
    +height expected 45 but got 50 +FAIL [data-expected-height] 30 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 31 assert_equals: +
    +height expected 50 but got 40 +FAIL [data-expected-height] 32 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 33 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 34 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 35 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 36 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 37 assert_equals: +
    +height expected 55 but got 40 +FAIL [data-expected-height] 38 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 39 assert_equals: +
    +height expected 45 but got 40 +FAIL [data-expected-height] 40 assert_equals: +
    +height expected 10 but got 40 +FAIL [data-expected-height] 41 assert_equals: +
    +height expected 10 but got 40 PASS [data-expected-height] 42 -PASS [data-expected-height] 43 +FAIL [data-expected-height] 43 assert_equals: +
    +height expected 45 but got 50 PASS [data-expected-height] 44 -PASS [data-expected-height] 45 -PASS [data-expected-height] 46 +FAIL [data-expected-height] 45 assert_equals: +
    +height expected 30 but got 50 +FAIL [data-expected-height] 46 assert_equals: +
    +height expected 45 but got 50 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-ref.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-ref.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-ref.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling-ref.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float-with-sibling.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch-float.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/w3c-import.log index 4d316af744f8..f6e8fa922634 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/w3c-import.log @@ -50,6 +50,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/fixed-table-1-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/fixed-table-1.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-basis-1.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-item-height-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-item-height-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-item-height-003.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-line-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-line-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flex-line-003.html @@ -68,10 +71,13 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flexbox-stretch-minimum-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flexbox-stretch-minimum-002-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/flexbox-stretch-minimum-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/grid-item-height-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-1.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-3.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-4.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-5.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/indefinite-6.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/min-width-1-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/min-width-1.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/parsing.html @@ -94,9 +100,18 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-block-size-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-block-size-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-block-size-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float-with-sibling.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-float.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-inline-size-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-inline-size-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-inline-size-003.html @@ -107,4 +122,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-table-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/w3c-import.log index bb68483c434c..3f756315751c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/w3c-import.log @@ -16,6 +16,8 @@ None List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/dynamic-available-size-iframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/min-content-max-content.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/ratio-2-1.svg +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/ratio-3-1.svg /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/replaced-min-max-1.png /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/replaced-min-max-10.png /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/support/replaced-min-max-11.png diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-003-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-003-expected.txt index 917064a9b5d6..4d3a0b9fd97c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-003-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-003-expected.txt @@ -8,7 +8,5 @@ PASS svg 1 PASS svg 2 PASS svg 3 PASS svg 4 -FAIL svg 5 assert_equals: - -clientWidth expected 600 but got 300 +PASS svg 5 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008-expected.txt new file mode 100644 index 000000000000..096eb14cbd9f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008-expected.txt @@ -0,0 +1,14 @@ +No intrinsic attributes: +viewBox and width: +viewBox and height: +viewBox, width, height: +Just viewBox: + +PASS svg 1 +PASS svg 2 +PASS svg 3 +PASS svg 4 +FAIL svg 5 assert_equals: + +clientWidth expected 400 but got 300 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008.html new file mode 100644 index 000000000000..c3fabb5dd512 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + No intrinsic attributes: +
    + +
    + + viewBox and width: +
    + +
    + + viewBox and height: +
    + +
    + + viewBox, width, height: +
    + +
    + + Just viewBox: +
    + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/w3c-import.log index 13c2e185e99a..d3b4b5d5f36a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/w3c-import.log @@ -32,7 +32,18 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-auto-sizing-fit-content-percentage-007.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-auto-sizing-fit-content-percentage-008-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-auto-sizing-fit-content-percentage-008.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-intrinsic-height-inset-percentage-child.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio-affects-container-width-when-height-changes.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio-automatic-minimum.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio-percentage-height-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio-percentage-height-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio-percentage-height.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/auto-scrollbar-inside-stf-abspos-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/auto-scrollbar-inside-stf-abspos-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/auto-scrollbar-inside-stf-abspos.html @@ -112,6 +123,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-fieldset-legend.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-flex-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-flex.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-percent-flex-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-percent-flex.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-table-caption-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/calc-margins-table-caption.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/canvas-intrinsic-dynamic-expected.html @@ -295,6 +308,20 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-fixed-width-with-max-content-height.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-fixed-width-with-min-content-height-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-fixed-width-with-min-content-height.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-004-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-percentage-child.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-stretch-percentage-child-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-stretch-percentage-child-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-abspos-stretch-percentage-child.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-fixedpos-percentage-child-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-height-fixedpos-percentage-child.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-001.html @@ -310,6 +337,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-005-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-005.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-006.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-007-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-007-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-007.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-008-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-008-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-non-replaced-008.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-002-expected.html @@ -372,6 +405,11 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-030.tentative-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-031-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-031.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-032-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-032.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-033.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-dynamic-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-dynamic-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/intrinsic-percent-replaced-dynamic-002-expected.html @@ -430,6 +468,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-min-width-000-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-min-width-000.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-crash.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-content-negative-margin-inline-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-max-content-orthogonal-flow-crash-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/min-width-max-width-precedence.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/nested-flexbox-image-percentage-max-height-computes-as-none-expected.html @@ -464,6 +503,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-aspect-ratio-stretch-fit-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-aspect-ratio-stretch-fit-003-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-aspect-ratio-stretch-fit-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-element-intrinsic-sizing-keywords-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-element-intrinsic-sizing-keywords-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-element-intrinsic-sizing-keywords.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-element-transferred-size-flex.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-fractional-height-from-aspect-ratio-2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-fractional-height-from-aspect-ratio.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-height-min-content-expected.html @@ -472,6 +515,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-size-saturation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-min-content-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-min-content.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-fit-content-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-fit-content-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-fit-content.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-max-content-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-max-content-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-max-content.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-min-content-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-min-content-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-max-width-with-height-min-content.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-min-height-min-content-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-min-height-min-content.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/replaced-min-width-min-content-expected.html @@ -499,6 +551,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-006.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-007.tentative-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-007.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-intrinsic-size-008.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-no-ar-max-height-min-content-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-no-ar-max-height-min-content.html /LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/svg-no-ar-min-height-min-content-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/WEB_FEATURES.yml index db75fe44cd4f..d5f36d8c3162 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/WEB_FEATURES.yml @@ -5,3 +5,13 @@ features: - name: text-underline-offset files: - text-underline-offset-* +- name: text-decoration + files: + - "*text-decoration-*" + - "!text-decoration-color-selection-*" +- name: text-decoration-selection + files: + - "text-decoration-color-selection-*" +- name: text-underline-position + files: + - text-underline-position-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/animations/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/animations/WEB_FEATURES.yml index 15436a1fca4d..4cccb2ebe9b1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/animations/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/animations/WEB_FEATURES.yml @@ -2,3 +2,6 @@ features: - name: text-underline-offset files: - text-underline-offset-* +- name: text-decoration + files: + - "text-decoration-*" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/WEB_FEATURES.yml new file mode 100644 index 000000000000..ab77329eedd2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: text-decoration + files: + - "*text-decoration-*" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/w3c-import.log index ee141fc9c249..e36823139de2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/pseudo-element-text-decoration-under-pseudo-first-line-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/text-decoration-animation-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/crashtests/text-decoration-first-line-child-display-none-crash.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/WEB_FEATURES.yml new file mode 100644 index 000000000000..4726ffb72ffb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: text-decoration + files: "**" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/w3c-import.log index 11b8fe50f040..c104eb29bd96 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/text-decoration-decorating-box-thickness-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/text-decoration-decorating-box-thickness-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/decorating-box/text-decoration-decorating-box-thickness-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/WEB_FEATURES.yml new file mode 100644 index 000000000000..3779b44442b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/WEB_FEATURES.yml @@ -0,0 +1,7 @@ +features: +- name: text-decoration-selection + files: + - "selection-pseudo-with-decoration-invalidation-*" +- name: text-decoration + files: + - "text-decoration-*" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/w3c-import.log index af0d1e969e4e..7cbc69aad266 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/selection-pseudo-with-decoration-invalidation-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/selection-pseudo-with-decoration-invalidation-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/invalidation/selection-pseudo-with-decoration-invalidation-002-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/WEB_FEATURES.yml index bc8409c24dd3..2cbfa47f8e1a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/WEB_FEATURES.yml @@ -2,3 +2,11 @@ features: - name: text-emphasis files: - "*" + - "!text-decoration-*" + - "!text-underline-position-*" +- name: text-decoration + files: + - "text-decoration-*" +- name: text-underline-position + files: + - text-underline-position-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed-expected.txt new file mode 100644 index 000000000000..007652014e8b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed-expected.txt @@ -0,0 +1,12 @@ + +FAIL Property text-decoration-inset value '0px' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '0' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '0px 0px' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '0.5em' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '-1em' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '-1ch -1ch' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '1px 2px' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value '1ch -1ch' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value 'calc(1em / 4) calc(-1ch)' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-inset value 'auto' assert_true: text-decoration-inset doesn't seem to be supported in the computed style expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed.html new file mode 100644 index 000000000000..692d6b95e246 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed.html @@ -0,0 +1,32 @@ + + +CSS Text Decoration Test: Computed value of text-decoration-inset + + + + + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid-expected.txt new file mode 100644 index 000000000000..5fbfbfdfb75d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid-expected.txt @@ -0,0 +1,11 @@ + +PASS e.style['text-decoration-inset'] = "none" should not set the property value +PASS e.style['text-decoration-inset'] = "normal" should not set the property value +PASS e.style['text-decoration-inset'] = "auto auto" should not set the property value +PASS e.style['text-decoration-inset'] = "0 auto" should not set the property value +PASS e.style['text-decoration-inset'] = "auto none" should not set the property value +PASS e.style['text-decoration-inset'] = "1px auto" should not set the property value +PASS e.style['text-decoration-inset'] = "auto -1px" should not set the property value +PASS e.style['text-decoration-inset'] = "10%" should not set the property value +PASS e.style['text-decoration-inset'] = "45deg" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid.html new file mode 100644 index 000000000000..aecc8e35767b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid.html @@ -0,0 +1,20 @@ + + +CSS Text Decoration Test: Parsing text-decoration-inset with invalid values + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid-expected.txt new file mode 100644 index 000000000000..e392322573bf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid-expected.txt @@ -0,0 +1,12 @@ + +FAIL e.style['text-decoration-inset'] = "0px" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "0" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "0px 0px" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "0.5em" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "-1em" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "-1ch -1ch" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "1px 2px" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "1ch -1ch" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "calc(1em / 4) calc(-1ch)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-inset'] = "auto" should set the property value assert_not_equals: property should be set got disallowed value "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid.html new file mode 100644 index 000000000000..59ea5632865c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid.html @@ -0,0 +1,21 @@ + + +CSS Text Decoration Test: Parsing text-decoration-inset with valid values + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed-expected.txt index 85c7b9c3d507..ad9d6e539e51 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed-expected.txt @@ -1,4 +1,5 @@ PASS Property text-decoration-skip-ink value 'auto' PASS Property text-decoration-skip-ink value 'none' +PASS Property text-decoration-skip-ink value 'all' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed.html index 0b4807cec08a..f0891a374bd5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed.html @@ -14,6 +14,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid-expected.txt index b592caafd783..b889446283c7 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid-expected.txt @@ -1,6 +1,8 @@ PASS e.style['text-decoration-skip-ink'] = "edges" should not set the property value PASS e.style['text-decoration-skip-ink'] = "auto none" should not set the property value +PASS e.style['text-decoration-skip-ink'] = "auto all" should not set the property value +PASS e.style['text-decoration-skip-ink'] = "none all" should not set the property value PASS e.style['text-decoration-skip-ink'] = "10px" should not set the property value PASS e.style['text-decoration-skip-ink'] = "-5em" should not set the property value PASS e.style['text-decoration-skip-ink'] = "otto" should not set the property value @@ -8,4 +10,6 @@ PASS e.style['text-decoration-skip-ink'] = "20%" should not set the property val PASS e.style['text-decoration-skip-ink'] = "-13%" should not set the property value PASS e.style['text-decoration-skip-ink'] = "0" should not set the property value PASS e.style['text-decoration-skip-ink'] = "non" should not set the property value +PASS e.style['text-decoration-skip-ink'] = "al" should not set the property value +PASS e.style['text-decoration-skip-ink'] = "invalid" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid.html index a259aa8eccd4..f82c26be5974 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid.html @@ -2,13 +2,15 @@ CSS Text Decoration Test: Parsing text-decoration-skip-ink with invalid values - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid-expected.txt index 8c67f5435270..6088e131340c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid-expected.txt @@ -1,4 +1,5 @@ PASS e.style['text-decoration-skip-ink'] = "auto" should set the property value PASS e.style['text-decoration-skip-ink'] = "none" should set the property value +PASS e.style['text-decoration-skip-ink'] = "all" should set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid.html index bc694490d4ab..bef827d418c7 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid.html @@ -2,11 +2,12 @@ CSS Text Decoration Test: Parsing text-decoration-skip-ink with valid values - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed-expected.txt new file mode 100644 index 000000000000..773c3d87dc5a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed-expected.txt @@ -0,0 +1,7 @@ + +FAIL Property text-decoration-skip-spaces value 'none' assert_true: text-decoration-skip-spaces doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-skip-spaces value 'all' assert_true: text-decoration-skip-spaces doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-skip-spaces value 'start' assert_true: text-decoration-skip-spaces doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-skip-spaces value 'end' assert_true: text-decoration-skip-spaces doesn't seem to be supported in the computed style expected true got false +FAIL Property text-decoration-skip-spaces value 'start end' assert_true: text-decoration-skip-spaces doesn't seem to be supported in the computed style expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed.html new file mode 100644 index 000000000000..cbb1f51a3b8a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed.html @@ -0,0 +1,22 @@ + + + + +CSS Text Decoration Test: getComputedStyle().textDecorationSkipSpaces + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid-expected.txt new file mode 100644 index 000000000000..6966b3069928 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid-expected.txt @@ -0,0 +1,21 @@ + +PASS e.style['text-decoration-skip-spaces'] = "none start" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "none end" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "none all" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "start none" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "all start" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "all end" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "start all" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "end all" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "start end all" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "auto" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "underline" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "edges" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "box-decoration" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "10px" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "20%" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "0" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "star" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "ends" should not set the property value +PASS e.style['text-decoration-skip-spaces'] = "invalid" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid.html new file mode 100644 index 000000000000..eb73f2031878 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid.html @@ -0,0 +1,29 @@ + + +CSS Text Decoration Test: Parsing text-decoration-skip-spaces with invalid values + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid-expected.txt new file mode 100644 index 000000000000..7b1cb8a7ce67 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid-expected.txt @@ -0,0 +1,8 @@ + +FAIL e.style['text-decoration-skip-spaces'] = "none" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-skip-spaces'] = "all" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-skip-spaces'] = "start" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-skip-spaces'] = "end" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-skip-spaces'] = "start end" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-decoration-skip-spaces'] = "end start" should set the property value assert_not_equals: property should be set got disallowed value "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid.html new file mode 100644 index 000000000000..70dffa041e2e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid.html @@ -0,0 +1,16 @@ + + +CSS Text Decoration Test: Parsing text-decoration-skip-spaces with valid values + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/w3c-import.log index ae4f61dca235..a489dfb241a5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/w3c-import.log @@ -19,6 +19,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-color-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-color-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-inset-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-line-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-line-invalid.html @@ -27,6 +30,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-ink-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-skip-spaces-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-style-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-style-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-decoration-style-valid.html @@ -35,6 +41,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-emphasis-position-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-emphasis-position-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-emphasis-position-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-emphasis-style-computed-vertical-lr.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-emphasis-style-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/ruby-text-decoration-01-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/ruby-text-decoration-01-ref.html index 2450b6a9690c..c1b08d05c3e2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/ruby-text-decoration-01-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/ruby-text-decoration-01-ref.html @@ -16,7 +16,12 @@

    - けいおうじゅくだいがく + けいおうじゅくだいがく

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-001-ref.html new file mode 100644 index 000000000000..48ee1e321d7b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-001-ref.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px to the right:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-002-ref.html new file mode 100644 index 000000000000..46ac4d4e6e14 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-002-ref.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be extended by 0.5em at each end:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-003-ref.html new file mode 100644 index 000000000000..1f8e28bb31bd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-003-ref.html @@ -0,0 +1,42 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be trimmed by 0.25em at each end:

    + +
    +

    + the quick brown fox +

    +

    + the quick brownbrown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-004-ref.html new file mode 100644 index 000000000000..a844816e7de0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-004-ref.html @@ -0,0 +1,40 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end, but not at the line-break:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-005-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-005-ref.html new file mode 100644 index 000000000000..5a8e8396da93 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-005-ref.html @@ -0,0 +1,38 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-006-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-006-ref.html new file mode 100644 index 000000000000..dc52c5f2f9f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-006-ref.html @@ -0,0 +1,38 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-007-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-007-ref.html new file mode 100644 index 000000000000..60073d53a12d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-007-ref.html @@ -0,0 +1,36 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "جلدي brown" should be offset by 10px to the right, and not interrupted at the direction boundary:

    + +
    +

    + the جلدي brown fox +

    +

    + the جلدي brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-008-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-008-ref.html new file mode 100644 index 000000000000..9aac9ffd5c50 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-008-ref.html @@ -0,0 +1,45 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "quick براؤن" should be trimmed by 10px at each end, and not interrupted at the direction boundary:

    + +
    +

    + the quick براؤن fox +

    +

    + the quick براؤنquick براؤن fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-009-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-009-ref.html new file mode 100644 index 000000000000..672c9cef5fba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-009-ref.html @@ -0,0 +1,51 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +the additional green underline for "quick" should be extended by .5em at each end:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-010-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-010-notref.html new file mode 100644 index 000000000000..ecb9166f47fc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-010-notref.html @@ -0,0 +1,33 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underlines for "石井" and for "艾俐俐" should be visibly separate:

    + +
    +

    + 石井艾俐俐 +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-011-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-011-ref.html new file mode 100644 index 000000000000..d7360ac8643d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-011-ref.html @@ -0,0 +1,64 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline of the first phrase should be trimmed by 10px at both ends; +the underline of the second should be offset by 10px to the left at both start and end:

    + +
    +

    صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت —
    يَحظى الضَجيعُ بِها نَجلاءَ مِعطارِ

    +

    صِفصِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَتبَزَغَت

    +

    صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت —
    + يَحظىيَحظى الضَجيعُ بِها نَجلاءَ مِعطارِمِعطارِمِعطارِ

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-012-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-012-ref.html new file mode 100644 index 000000000000..a2e1caf2fecc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-012-ref.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px downwards:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-013-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-013-ref.html new file mode 100644 index 000000000000..a4f36385d317 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-013-ref.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px upwards:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-014-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-014-ref.html new file mode 100644 index 000000000000..cab9d5723542 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-014-ref.html @@ -0,0 +1,45 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by 0.5ch at each end of each fragment:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-015-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-015-ref.html new file mode 100644 index 000000000000..f0b1be7a5e47 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-015-ref.html @@ -0,0 +1,28 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be entirely trimmed away:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-016-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-016-ref.html new file mode 100644 index 000000000000..ec636bca5ad8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-016-ref.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10em to the right, and lengthened by 2em:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-017-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-017-ref.html new file mode 100644 index 000000000000..772a456b5308 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-017-ref.html @@ -0,0 +1,91 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-018-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-018-ref.html new file mode 100644 index 000000000000..2c6d5b79bd09 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-018-ref.html @@ -0,0 +1,92 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-019-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-019-ref.html new file mode 100644 index 000000000000..34331a64049d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-019-ref.html @@ -0,0 +1,92 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-020-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-020-ref.html new file mode 100644 index 000000000000..1dc5e84fd91f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-020-ref.html @@ -0,0 +1,94 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-021-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-021-ref.html new file mode 100644 index 000000000000..62f4d61181c7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-021-ref.html @@ -0,0 +1,96 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-022-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-022-ref.html new file mode 100644 index 000000000000..37be38ca8aca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-022-ref.html @@ -0,0 +1,94 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-023-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-023-ref.html new file mode 100644 index 000000000000..f8ff20d10721 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-023-ref.html @@ -0,0 +1,96 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-024-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-024-ref.html new file mode 100644 index 000000000000..7b10ec9550f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-024-ref.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 20px to the right:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-025-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-025-ref.html new file mode 100644 index 000000000000..a6e189a46964 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-025-ref.html @@ -0,0 +1,76 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +
    +

    Reference case:

    +
    + now testing text-decoration inset +
    +
    + +

    All the following lines should have the same shortened underline and extended overline:

    + +
    + +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-orthogonal-block-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-orthogonal-block-001-ref.html new file mode 100644 index 000000000000..2433b96db765 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-orthogonal-block-001-ref.html @@ -0,0 +1,21 @@ + + + +CSS Text Decoration reference + + +
    vertical
    horizontal
    text diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-003-ref.html new file mode 100644 index 000000000000..ad1cecb18382 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-003-ref.html @@ -0,0 +1,20 @@ + + + +Test reference + + + +

    Test passes if there is an blue underline below orange letters A through F below, but no further. + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-004-ref.html new file mode 100644 index 000000000000..dc6688a59827 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-004-ref.html @@ -0,0 +1,20 @@ + + + +Test reference + + + +

    Test passes if there is an blue underline below orange letters A through F below, but no further. + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-005-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-005-ref.html new file mode 100644 index 000000000000..ae03d099d770 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-005-ref.html @@ -0,0 +1,34 @@ + + + +Test reference + + + +

    Test passes if this page renders the same as the reference page (underline stops at F's right edge, no trailing 20px gap). + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-007-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-007-ref.html new file mode 100644 index 000000000000..270185d8f6ca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-007-ref.html @@ -0,0 +1,28 @@ + + + +Test reference + + + +

    Test passes if this page renders the same as the reference page (underline only under AB, CDE, FG — not under the spaces between them). + +

    AB CDE FG
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-008-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-008-ref.html new file mode 100644 index 000000000000..00799b313eb5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-008-ref.html @@ -0,0 +1,32 @@ + + + +Test reference + + + +

    Test passes if the blue underline appears only under ABCDEF, not under the surrounding spaces, even when selected. + +

    ABCDEF
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-009-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-009-ref.html new file mode 100644 index 000000000000..a66c984f1fca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-009-ref.html @@ -0,0 +1,32 @@ + + + +Test reference + + + +

    Test passes if the blue underline appears only under AB, CDE, and FG — not under the spaces between them — even when selected. + +

    AB CDE FG
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-color-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-color-001-ref.xht index b38d04110e36..fc6160f3f13f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-color-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-color-001-ref.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } .ref1 rt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-002-ref.html index 3a137ab708d3..627ae004b862 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-002-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-002-ref.html @@ -7,6 +7,6 @@

    Test passes if "filled dot" is above every single character of "Text sample".

    -
    Text sample
    +
    Text sample
    \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-007.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-007.html index 1ae8e1832424..1ce419d751fa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-007.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-007.html @@ -7,7 +7,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html index 12ed40ee6d5c..8f6c693abeb1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html @@ -8,10 +8,10 @@ -

    Test passes if "◉" is above every single character of "Text sample"

    -
    - Text - sample. +

    Test passes if "◉" is above every single character of "Text sample"

    +
    + Text + sample.
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html index 3eef63f5a871..d4ca0620d17c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html @@ -7,7 +7,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html index 868fa39906f0..49d07e18ab4e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html @@ -6,7 +6,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html index d09acdf64b9e..1b50e7be2cb8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html @@ -7,7 +7,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht index 39be9c25697b..1fe1e743d488 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht index de908e0cd85a..4ea6345ab0e5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht index 41e53b93df2c..b53c6aaa90ef 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht index e24c86abeb1e..57392a0193f5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht @@ -8,7 +8,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/w3c-import.log index 90280d8c6caa..2cdf7444f3d6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/w3c-import.log @@ -23,6 +23,32 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-decorating-box-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-dotted-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-dotted-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-001-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-003-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-004-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-005-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-006-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-007-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-008-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-009-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-010-notref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-011-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-012-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-013-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-014-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-015-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-016-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-017-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-018-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-019-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-020-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-021-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-022-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-023-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-024-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-025-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-inset-orthogonal-block-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-line-010-ref.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-line-011-ref.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-line-012-ref.xht @@ -55,6 +81,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-ink-vertical-002-notref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-002-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-003-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-004-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-005-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-007-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-008-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-skip-spaces-009-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-style-multiple-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-style-recalc-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/reference/text-decoration-subelements-001-notref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01-expected.html index 2450b6a9690c..c1b08d05c3e2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01-expected.html @@ -16,7 +16,12 @@

    - けいおうじゅくだいがく + けいおうじゅくだいがく

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01.html index 9d26e1774270..8fc0911985b5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/ruby-text-decoration-01.html @@ -18,7 +18,12 @@

    - けいおうじゅくだいがく + けいおうじゅくだいがく

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001-expected.html new file mode 100644 index 000000000000..48ee1e321d7b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001-expected.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px to the right:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001.html new file mode 100644 index 000000000000..fcb75739988d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be offset by 10px to the right:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002-expected.html new file mode 100644 index 000000000000..46ac4d4e6e14 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002-expected.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be extended by 0.5em at each end:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002.html new file mode 100644 index 000000000000..98e7a5ab442a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be extended by 0.5em at each end:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003-expected.html new file mode 100644 index 000000000000..1f8e28bb31bd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003-expected.html @@ -0,0 +1,42 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be trimmed by 0.25em at each end:

    + +
    +

    + the quick brown fox +

    +

    + the quick brownbrown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003.html new file mode 100644 index 000000000000..e73f8fa6e48d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be trimmed by 0.25em at each end:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004-expected.html new file mode 100644 index 000000000000..a844816e7de0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004-expected.html @@ -0,0 +1,40 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end, but not at the line-break:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004.html new file mode 100644 index 000000000000..d931404d6314 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end, but not at the line-break:

    + +
    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005-expected.html new file mode 100644 index 000000000000..5a8e8396da93 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005-expected.html @@ -0,0 +1,38 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005.html new file mode 100644 index 000000000000..7a3ed42859e9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "ultra-quick brown" should be extended by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006-expected.html new file mode 100644 index 000000000000..dc52c5f2f9f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006-expected.html @@ -0,0 +1,38 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006.html new file mode 100644 index 000000000000..1a10d1e3d232 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +super- and sub-scripts should be unaffected:

    + +
    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007-expected.html new file mode 100644 index 000000000000..60073d53a12d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007-expected.html @@ -0,0 +1,36 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "جلدي brown" should be offset by 10px to the right, and not interrupted at the direction boundary:

    + +
    +

    + the جلدي brown fox +

    +

    + the جلدي brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007.html new file mode 100644 index 000000000000..7ee28f7db301 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "جلدي brown" should be offset by 10px to the right, and not interrupted at the direction boundary:

    + +
    +

    + the جلدي brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008-expected.html new file mode 100644 index 000000000000..9aac9ffd5c50 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008-expected.html @@ -0,0 +1,45 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "quick براؤن" should be trimmed by 10px at each end, and not interrupted at the direction boundary:

    + +
    +

    + the quick براؤن fox +

    +

    + the quick براؤنquick براؤن fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008.html new file mode 100644 index 000000000000..ba2f8a22da85 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008.html @@ -0,0 +1,40 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "quick براؤن" should be trimmed by 10px at each end, and not interrupted at the direction boundary:

    + +
    +

    + the quick براؤن fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009-expected.html new file mode 100644 index 000000000000..672c9cef5fba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009-expected.html @@ -0,0 +1,51 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +the additional green underline for "quick" should be extended by .5em at each end:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009.html new file mode 100644 index 000000000000..3f4c229e67d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009.html @@ -0,0 +1,40 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "ultra-quick brown" should be trimmed by .25em at each end; +the additional green underline for "quick" should be extended by .5em at each end:

    + +
    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010-expected-mismatch.html new file mode 100644 index 000000000000..ecb9166f47fc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010-expected-mismatch.html @@ -0,0 +1,33 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underlines for "石井" and for "艾俐俐" should be visibly separate:

    + +
    +

    + 石井艾俐俐 +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010.html new file mode 100644 index 000000000000..fa3eeb10ef22 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underlines for "石井" and for "艾俐俐" should be visibly separate:

    + +
    +

    + 石井艾俐俐 +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011-expected.html new file mode 100644 index 000000000000..d7360ac8643d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011-expected.html @@ -0,0 +1,64 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline of the first phrase should be trimmed by 10px at both ends; +the underline of the second should be offset by 10px to the left at both start and end:

    + +
    +

    صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت —
    يَحظى الضَجيعُ بِها نَجلاءَ مِعطارِ

    +

    صِفصِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَتبَزَغَت

    +

    صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت —
    + يَحظىيَحظى الضَجيعُ بِها نَجلاءَ مِعطارِمِعطارِمِعطارِ

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011.html new file mode 100644 index 000000000000..f9bcbafadd3b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011.html @@ -0,0 +1,45 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline of the first phrase should be trimmed by 10px at both ends; +the underline of the second should be offset by 10px to the left at both start and end:

    + +
    +

    + صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت
    يَحظى الضَجيعُ بِها نَجلاءَ مِعطارِ +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012-expected.html new file mode 100644 index 000000000000..a2e1caf2fecc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012-expected.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px downwards:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012.html new file mode 100644 index 000000000000..2e86001d7409 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be offset by 10px downwards:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013-expected.html new file mode 100644 index 000000000000..a4f36385d317 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013-expected.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10px upwards:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013.html new file mode 100644 index 000000000000..cc3642addaf2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be offset by 10px upwards:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014-expected.html new file mode 100644 index 000000000000..cab9d5723542 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014-expected.html @@ -0,0 +1,45 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "ultra-quick brown" should be extended by 0.5ch at each end of each fragment:

    + +
    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014.html new file mode 100644 index 000000000000..ea33cea453e5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "ultra-quick brown" should be extended by 0.5ch at each end of each fragment:

    + +
    +

    + the ultra-quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015-expected.html new file mode 100644 index 000000000000..f0b1be7a5e47 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015-expected.html @@ -0,0 +1,28 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be entirely trimmed away:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015.html new file mode 100644 index 000000000000..7a79456f6167 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be entirely trimmed away:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016-expected.html new file mode 100644 index 000000000000..ec636bca5ad8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016-expected.html @@ -0,0 +1,37 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 10em to the right, and lengthened by 2em:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016.html new file mode 100644 index 000000000000..7544041cb41d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016.html @@ -0,0 +1,34 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be offset by 10em to the right, and lengthened by 2em:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017-expected.html new file mode 100644 index 000000000000..772a456b5308 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017-expected.html @@ -0,0 +1,91 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017.html new file mode 100644 index 000000000000..516aef2cab06 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017.html @@ -0,0 +1,82 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018-expected.html new file mode 100644 index 000000000000..2c6d5b79bd09 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018-expected.html @@ -0,0 +1,92 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018.html new file mode 100644 index 000000000000..5bafe8ddc074 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018.html @@ -0,0 +1,84 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019-expected.html new file mode 100644 index 000000000000..34331a64049d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019-expected.html @@ -0,0 +1,92 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019.html new file mode 100644 index 000000000000..68fc71895f0f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019.html @@ -0,0 +1,83 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020-expected.html new file mode 100644 index 000000000000..1dc5e84fd91f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020-expected.html @@ -0,0 +1,94 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020.html new file mode 100644 index 000000000000..ca4a85ee0429 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020.html @@ -0,0 +1,84 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021-expected.html new file mode 100644 index 000000000000..62f4d61181c7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021-expected.html @@ -0,0 +1,96 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo  
    a b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021.html new file mode 100644 index 000000000000..0a10d06f25be --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021.html @@ -0,0 +1,86 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022-expected.html new file mode 100644 index 000000000000..37be38ca8aca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022-expected.html @@ -0,0 +1,94 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a b c bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022.html new file mode 100644 index 000000000000..e5f31c1fc252 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022.html @@ -0,0 +1,84 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023-expected.html new file mode 100644 index 000000000000..f8ff20d10721 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023-expected.html @@ -0,0 +1,96 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    + +
    +
    +

    foo a b c bar

    +

    foo a  
    b c  
    bar  

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023.html new file mode 100644 index 000000000000..fdb93a7dfeb8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023.html @@ -0,0 +1,86 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + + +

    The text "foo a b c bar" should have an underline that is offset 2ch forward in each case, +applied separately to each line:

    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    + +
    +
    +

    foo a b c bar

    +
    +
    + +
    +
    +

    foo a b c bar

    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024-expected.html new file mode 100644 index 000000000000..7b10ec9550f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024-expected.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4 reference: text-decoration-inset + + + + + + +

    The underline for "brown" should be offset by 20px to the right:

    + +
    +

    + the quick brown fox +

    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024.html new file mode 100644 index 000000000000..e0cb7415d481 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024.html @@ -0,0 +1,35 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +

    The underline for "brown" should be offset by 20px to the right:

    + +
    +

    + the quick brown fox +

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025-expected.html new file mode 100644 index 000000000000..a6e189a46964 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025-expected.html @@ -0,0 +1,76 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + +
    +

    Reference case:

    +
    + now testing text-decoration inset +
    +
    + +

    All the following lines should have the same shortened underline and extended overline:

    + +
    + +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    +
    + now testing text-decoration inset +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025.html new file mode 100644 index 000000000000..dd8d7355783e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025.html @@ -0,0 +1,104 @@ + + + +CSS Text Decoration 4: text-decoration-inset + + + + + + + + +
    +

    Reference case:

    +
    + now testing text-decoration inset +
    +
    + +

    All the following lines should have the same shortened underline and extended overline:

    + +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    + now testing text-decoration inset +
    + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001-expected.html new file mode 100644 index 000000000000..2433b96db765 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001-expected.html @@ -0,0 +1,21 @@ + + + +CSS Text Decoration reference + + +
    vertical
    horizontal
    text diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001.html new file mode 100644 index 000000000000..e66983b5dfb4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001.html @@ -0,0 +1,22 @@ + + + +CSS Text Decoration test: decoration inset and text-indent in an orthogonal block + + + + + +vertical
    horizontal
    text
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative-expected.txt deleted file mode 100644 index 4f12b9c75f01..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative-expected.txt +++ /dev/null @@ -1,3 +0,0 @@ - -FAIL text-decoration shorthand serialization assert_equals: expected "underline rgb(0, 0, 0)" but got "underline" - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative.html deleted file mode 100644 index 73cb5cc5cea7..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative.html +++ /dev/null @@ -1,18 +0,0 @@ - -text-decoration shorthand serialization - - - - -
    - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-ink-sidewayslr-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-ink-sidewayslr-001.html index c17f152d0665..48d427e23825 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-ink-sidewayslr-001.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-ink-sidewayslr-001.html @@ -10,8 +10,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-003.html index bde91c76051f..fd716d588bae 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-003.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-003.html @@ -6,7 +6,7 @@ - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004.html index 39f6d329a5a1..83e1a777a75f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004.html @@ -6,7 +6,7 @@ - + + +

    Test passes if this page renders the same as the reference page (underline stops at F's right edge, no trailing 20px gap). + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-005.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-005.html new file mode 100644 index 000000000000..00ba05e3c868 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-005.html @@ -0,0 +1,25 @@ + + + +Decoration skipping spaces: all value trims trailing letter-spacing + + + + + + + +

    Test passes if this page renders the same as the reference page (underline stops at F's right edge, no trailing 20px gap). + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006-expected.html new file mode 100644 index 000000000000..3da02d95f470 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006-expected.html @@ -0,0 +1,25 @@ + + + +Test reference + + + +

    Test passes if there is an blue underline below orange letters A through F below, but no further. + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006.html new file mode 100644 index 000000000000..88c34474c418 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006.html @@ -0,0 +1,24 @@ + + + +Decoration skipping spaces: all value with preserved spaces + + + + + + + +

    Test passes if there is an blue underline below orange letters A through F below, but no further. + +

    ABCDEF
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007-expected.html new file mode 100644 index 000000000000..270185d8f6ca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007-expected.html @@ -0,0 +1,28 @@ + + + +Test reference + + + +

    Test passes if this page renders the same as the reference page (underline only under AB, CDE, FG — not under the spaces between them). + +

    AB CDE FG
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007.html new file mode 100644 index 000000000000..53332c8a352a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007.html @@ -0,0 +1,24 @@ + + + +Decoration skipping spaces: all value skips interior spaces + + + + + + + +

    Test passes if this page renders the same as the reference page (underline only under AB, CDE, FG — not under the spaces between them). + +

    AB CDE FG
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008-expected.html new file mode 100644 index 000000000000..00799b313eb5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008-expected.html @@ -0,0 +1,32 @@ + + + +Test reference + + + +

    Test passes if the blue underline appears only under ABCDEF, not under the surrounding spaces, even when selected. + +

    ABCDEF
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008.html new file mode 100644 index 000000000000..b43197da4cb3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008.html @@ -0,0 +1,36 @@ + + + +Decoration skipping spaces: skip preserved when selected (start end) + + + + + + + +

    Test passes if the blue underline appears only under ABCDEF, not under the surrounding spaces, even when selected. + +

    ABCDEF
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009-expected.html new file mode 100644 index 000000000000..a66c984f1fca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009-expected.html @@ -0,0 +1,32 @@ + + + +Test reference + + + +

    Test passes if the blue underline appears only under AB, CDE, and FG — not under the spaces between them — even when selected. + +

    AB CDE FG
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009.html new file mode 100644 index 000000000000..faaf493a6e5d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009.html @@ -0,0 +1,36 @@ + + + +Decoration skipping spaces: all skips interior spaces when selected + + + + + + + +

    Test passes if the blue underline appears only under AB, CDE, and FG — not under the spaces between them — even when selected. + +

    AB CDE FG
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-atomic-inline-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-atomic-inline-crash.html new file mode 100644 index 000000000000..758eba04ff8d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-atomic-inline-crash.html @@ -0,0 +1,19 @@ + + + + +CSS Text Decoration: text-decoration-skip-spaces with atomic inline crash test + + + + + + +

    hello world

    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-from-font-variable.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-from-font-variable.html index 025f910e1248..7f10681f1ea5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-from-font-variable.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-from-font-variable.html @@ -7,6 +7,7 @@ + + + + +

    + Test passes if text-decoration-thickness length is rounded to 2px +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Line Type + + Line Style +
    + Solid + + Double + + Dotted + + Dashed + + Wavy +
    + Underline + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + Line-through + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + Overline + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002-expected.html similarity index 100% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative-expected.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002.html new file mode 100644 index 000000000000..96f661fb098d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002.html @@ -0,0 +1,163 @@ + + + + + CSS Text Decoration Test: text-decoration-thickness length rounding up + + + + + + + + + + + + + +

    + Test passes if text-decoration-thickness length is rounded to 2px +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Line Type + + Line Style +
    + Solid + + Double + + Dotted + + Dashed + + Wavy +
    + Underline + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + Line-through + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + Overline + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. + + Thickness test. +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-down.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-down.tentative.html deleted file mode 100644 index 54f303b3983f..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-down.tentative.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - CSS Text Decoration Test: text-decoration-thickness length rounding down - - - - - - - - - - - - -

    - Test passes if text-decoration-thickness length is rounded to 2px -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Line Type - - Line Style -
    - Solid - - Double - - Dotted - - Dashed - - Wavy -
    - Underline - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - Line-through - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - Overline - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative.html deleted file mode 100644 index 2afc8232532d..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - CSS Text Decoration Test: text-decoration-thickness length rounding up - - - - - - - - - - - - -

    - Test passes if text-decoration-thickness length is rounded to 2px -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Line Type - - Line Style -
    - Solid - - Double - - Dotted - - Dashed - - Wavy -
    - Underline - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - Line-through - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - Overline - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. - - Thickness test. -
    - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-expected.html new file mode 100644 index 000000000000..09945e038929 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-expected.html @@ -0,0 +1,16 @@ + + + + + Reference: line-through thickness on a descendant block + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-ref.html new file mode 100644 index 000000000000..09945e038929 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001-ref.html @@ -0,0 +1,16 @@ + + + + + Reference: line-through thickness on a descendant block + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001.html new file mode 100644 index 000000000000..ad13c670d428 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-block-001.html @@ -0,0 +1,19 @@ + + + + + text-decoration: line-through thickness applies over a descendant block + + + + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-expected.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-expected.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-ref.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001-ref.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001.html new file mode 100644 index 000000000000..c382cc860c44 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-001.html @@ -0,0 +1,30 @@ + + + + + text-decoration: line-through thickness applies over a descendant inline box + + + + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-expected.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-expected.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-ref.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002-ref.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002.html new file mode 100644 index 000000000000..63c533ec769e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-002.html @@ -0,0 +1,32 @@ + + + + + text-decoration: line-through thickness ignores a descendant's own text-decoration-thickness + + + + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-expected.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-expected.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-ref.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003-ref.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003.html new file mode 100644 index 000000000000..08a1fd97030f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-003.html @@ -0,0 +1,28 @@ + + + + + text-decoration: line-through thickness applies through nested inline boxes + + + + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-expected.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-expected.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-ref.html new file mode 100644 index 000000000000..14d1219001c8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004-ref.html @@ -0,0 +1,21 @@ + + + + + Reference case for text-decoration-thickness + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXXXXXXXXXXXXXXXXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004.html new file mode 100644 index 000000000000..3f3bc3fa8379 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-descendant-004.html @@ -0,0 +1,33 @@ + + + + + text-decoration: an ancestor line-through is painted over a descendant that has its own line-through + + + + + + + +

    Test passes if there is a wide green block, fails if there is any red visible

    +
    XXXX
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-expected.html new file mode 100644 index 000000000000..5c5ac0104d3f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-expected.html @@ -0,0 +1,16 @@ + + + + + Reference: overline thickness on a descendant block + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-ref.html new file mode 100644 index 000000000000..5c5ac0104d3f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001-ref.html @@ -0,0 +1,16 @@ + + + + + Reference: overline thickness on a descendant block + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001.html new file mode 100644 index 000000000000..028398a567cd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-overline-block-001.html @@ -0,0 +1,19 @@ + + + + + text-decoration: overline thickness applies over a descendant block + + + + + + + +
    X
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001-expected.xht index b38d04110e36..fc6160f3f13f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001-expected.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001-expected.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } .ref1 rt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001.xht index 344200f2bbe0..4513a225896d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-color-001.xht @@ -20,7 +20,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } .ref1 rt diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001-ref.html index 6f02e05bdd98..17d9d17c9efa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001-ref.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, top - + +

    Pass if the emphasis marks are below the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a-expected.html index 6f02e05bdd98..17d9d17c9efa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, top - + +

    Pass if the emphasis marks are below the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a.html index ea9589516dc4..5b0c0ea6098a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001a.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are below the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b-expected.html index 6f02e05bdd98..17d9d17c9efa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, top - + +

    Pass if the emphasis marks are below the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b.html index d6468cb6c9cd..dced07ab143c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001b.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are below the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z-expected.html index 6f02e05bdd98..17d9d17c9efa 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, top - + +

    Pass if the emphasis marks are below the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z.html index dded6094e35b..3cbd2031e779 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-001z.html @@ -6,9 +6,11 @@ + + +

    Pass if the emphasis marks are over the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a-expected.html index abff3e9e5534..9e1ac6516b68 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, bottom - + +

    Pass if the emphasis marks are over the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a.html index f4a47467a155..4a12c4b9ce82 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002a.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are over the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b-expected.html index abff3e9e5534..9e1ac6516b68 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, bottom - + +

    Pass if the emphasis marks are over the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b.html index 28a14cf4792b..472347854b8d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-002b.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are over the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003-ref.html index d427c76c9697..f5c3f6ec1645 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003-ref.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, right - + +

    Pass if the emphasis marks are to the left of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a-expected.html index d427c76c9697..f5c3f6ec1645 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, right - + +

    Pass if the emphasis marks are to the left of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a.html index 2b0684a78d10..3cbb9c847826 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003a.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the left of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b-expected.html index d427c76c9697..f5c3f6ec1645 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, right - + +

    Pass if the emphasis marks are to the left of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b.html index a8a6e1f6c1d1..7429474aa517 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003b.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the left of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c-expected.html index d427c76c9697..f5c3f6ec1645 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, right - + +

    Pass if the emphasis marks are to the left of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c.html index 35589cb8d7b2..fa6f6ee0afba 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003c.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the left of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d-expected.html index d427c76c9697..f5c3f6ec1645 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, right - + +

    Pass if the emphasis marks are to the left of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d.html index b02990774e23..20ed3acd7cee 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-003d.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the left of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004-ref.html index b88ca7c3a35a..bca033f3a3cd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004-ref.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, left - + +

    Pass if the emphasis marks are to the right of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a-expected.html index b88ca7c3a35a..bca033f3a3cd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, left - + +

    Pass if the emphasis marks are to the right of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a.html index e8922e97d2a3..bc8ed59adabf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004a.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the right of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b-expected.html index b88ca7c3a35a..bca033f3a3cd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, left - + +

    Pass if the emphasis marks are to the right of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b.html index f6ad46dec426..18a0dd97c156 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004b.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the right of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c-expected.html index b88ca7c3a35a..bca033f3a3cd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, left - + +

    Pass if the emphasis marks are to the right of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c.html index d572de3f18b9..a98fc9a55cb6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004c.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the right of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d-expected.html index b88ca7c3a35a..bca033f3a3cd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d-expected.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, left - + +

    Pass if the emphasis marks are to the right of the black line:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d.html index 3010b9510eb5..d73e9cefafcb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-line-height-004d.html @@ -8,5 +8,9 @@ + +

    Pass if the emphasis marks are to the right of the black line:

    試験テスト
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002-expected.html new file mode 100644 index 000000000000..2a50e4561122 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002-expected.html @@ -0,0 +1,39 @@ + + +text-emphasis-position auto value + + +
    +

    你好 +

    + +
    +

    今日は

    +
    + +
    +

    안녕하세요

    +
    + +
    +

    你好 +

    + +
    +

    今日は

    +
    + +
    +

    안녕하세요

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002.html new file mode 100644 index 000000000000..44c1ef6ac1f4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002.html @@ -0,0 +1,43 @@ + + +text-emphasis-position auto value + + + + + +
    +

    你好 +

    + +
    +

    今日は

    +
    + +
    +

    안녕하세요

    +
    + +
    +

    你好 +

    + +
    +

    今日は

    +
    + +
    +

    안녕하세요

    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-expected.html index 9cfcb247afef..89ff477e82da 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-expected.html @@ -4,7 +4,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html index 9cfcb247afef..89ff477e82da 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html @@ -4,7 +4,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1.html index e34e66007f77..8e93220ea76e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-1.html @@ -7,7 +7,7 @@

    The punctuation should not have emphasis marks:

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-expected.html index 735b0304b118..60c3bff0f95a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-expected.html @@ -4,9 +4,12 @@

    The punctuation should not have emphasis marks:

    -

    1948年12月10日联合国大会通过并颁布世界人权宣言》。这一具有历史意义的宣言颁布后大会要求所有会员国广为宣传并且不分国家或领土的政治地位,主要在各级学校和其他教育机构加以传播展示阅读和阐述。”《宣言全文如下

    +

    1948年12月10日联合国大会通过并颁布世界人权宣言》。这一具有历史意义的宣言颁布后大会要求所有会员国广为宣传并且不分国家或领土的政治地位,主要在各级学校和其他教育机构加以传播展示阅读和阐述。”《宣言全文如下

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html index 735b0304b118..60c3bff0f95a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html @@ -4,9 +4,12 @@

    The punctuation should not have emphasis marks:

    -

    1948年12月10日联合国大会通过并颁布世界人权宣言》。这一具有历史意义的宣言颁布后大会要求所有会员国广为宣传并且不分国家或领土的政治地位,主要在各级学校和其他教育机构加以传播展示阅读和阐述。”《宣言全文如下

    +

    1948年12月10日联合国大会通过并颁布世界人权宣言》。这一具有历史意义的宣言颁布后大会要求所有会员国广为宣传并且不分国家或领土的政治地位,主要在各级学校和其他教育机构加以传播展示阅读和阐述。”《宣言全文如下

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2.html index 53d261e9c8c1..890cedca4bbc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-punctuation-2.html @@ -7,6 +7,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002-expected.html index 3a137ab708d3..627ae004b862 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002-expected.html @@ -7,6 +7,6 @@

    Test passes if "filled dot" is above every single character of "Text sample".

    -
    Text sample
    +
    Text sample
    \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002.html index 8189df238398..bae119deb5b5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-002.html @@ -8,6 +8,9 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-007.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-007.html index d78a7e20b81c..1cd1123ee49d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-007.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-007.html @@ -9,7 +9,7 @@ -

    Test passes if "◉" is above every single character of "Text sample"

    -
    +

    Test passes if "◉" is above every single character of "Text sample"

    +
    Text sample.
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010-expected.html index 3eef63f5a871..d4ca0620d17c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010-expected.html @@ -7,7 +7,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010.html index 3b83a16c3092..52f94858067a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-010.html @@ -9,7 +9,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-012.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-012.html index da7febb0dacd..bcd5eb98627f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-012.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-012.html @@ -9,7 +9,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-021.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-021.html index 285d26075dc3..8c1e2b54d346 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-021.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-021.html @@ -9,7 +9,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-filled-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-filled-001.xht index 63cf4f4c80a6..6e786ae276ce 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-filled-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-filled-001.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } #test1 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001-expected.xht index de908e0cd85a..4ea6345ab0e5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001-expected.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001-expected.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001.xht index fb1655845b48..78019bea93f8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-open-001.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } #test1 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001-expected.xht index 41e53b93df2c..b53c6aaa90ef 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001-expected.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001-expected.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001.xht index ef6220db2963..c2ab583b6dc6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-shape-001.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } #test1 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001-expected.xht index e24c86abeb1e..57392a0193f5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001-expected.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001-expected.xht @@ -8,7 +8,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001.xht index 8cb320d627b6..70ea1a56f788 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-style-string-001.xht @@ -12,7 +12,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } #test diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/WEB_FEATURES.yml new file mode 100644 index 000000000000..83cf8996ded3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: text-shadow + files: "**" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/w3c-import.log index c897b5f2707c..01c4e7ef6bb6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/basic-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/basic-negcoord-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-shadow/basic-negcoord-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py index e2a4457f38e4..11b7cfc6accb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py @@ -19,6 +19,10 @@ + +

    Pass if the emphasis marks are {dir} the black line:

    {start}試験テスト{end} ''' @@ -31,7 +35,11 @@ CSS Reference: text-emphasis line height, {pos} - + +

    Pass if the emphasis marks are {dir} the black line:

    ''' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/w3c-import.log index 3f5f7ad7b462..06cd8872a6ba 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/w3c-import.log @@ -9,7 +9,7 @@ Do NOT modify or remove this file. ------------------------------------------------------------------------ Properties requiring vendor prefixes: -None +box-decoration-break Property values requiring vendor prefixes: None ------------------------------------------------------------------------ @@ -39,6 +39,58 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-dotted-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-dotted-002-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-dotted-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-002.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-005.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-006.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-007.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-008.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-009.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010-expected-mismatch.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-010.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-011.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-012.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-013.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-014.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-015.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-016.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-017.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-018.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-019.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-020.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-021.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-022.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-023.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-024.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-025.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-inset-orthogonal-block-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-line-010-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-line-010.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-line-011-expected.xht @@ -80,7 +132,6 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-propagation-dynamic-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-propagation-shadow-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-propagation-shadow.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-serialization.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-shorthands-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-shorthands-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-shorthands-002-expected.html @@ -123,6 +174,17 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-003.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-004.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-005-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-005.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-006.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-007.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-008.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-009.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-skip-spaces-atomic-inline-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-style-multiple-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-style-recalc-expected.html @@ -153,12 +215,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-ink-skip-dilation-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-ink-skip-dilation.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-invalid.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-down.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-down.tentative.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-001-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-min-val-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-min-val.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-length-rounding-up.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-decoration-thickness-non-inherit-expected.html @@ -239,6 +301,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-auto-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-default-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-default-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text-decor/text-emphasis-position-default-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance-expected.txt index 8dee0b4af8eb..2e5fd90ac2ca 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance-expected.txt @@ -17,6 +17,8 @@ FAIL Property text-align-all has initial value start assert_true: text-align-all FAIL Property text-align-all inherits assert_true: text-align-all doesn't seem to be supported in the computed style expected true got false PASS Property text-align-last has initial value auto PASS Property text-align-last inherits +FAIL Property text-fit has initial value none assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit inherits assert_true: text-fit doesn't seem to be supported in the computed style expected true got false PASS Property text-indent has initial value 0px PASS Property text-indent inherits PASS Property text-justify has initial value auto diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance.html index f41a5edcaf59..6679d16e8e86 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance.html @@ -24,6 +24,7 @@ assert_inherited('text-align', 'start', 'right'); assert_inherited('text-align-all', 'start', 'right'); assert_inherited('text-align-last', 'auto', 'right'); +assert_inherited('text-fit', 'none', 'grow'); assert_inherited('text-indent', '0px', '10px'); assert_inherited('text-justify', 'auto', 'inter-character'); assert_inherited('text-transform', 'none', 'uppercase'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed-expected.txt new file mode 100644 index 000000000000..31d2a6b6bbc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed-expected.txt @@ -0,0 +1,12 @@ + +FAIL Property text-fit value 'none' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'shrink' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow consistent' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow per-line' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow per-line-all' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow per-line 200%' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'grow consistent 300%' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'shrink per-line 40%' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false +FAIL Property text-fit value 'shrink consistent 20%' assert_true: text-fit doesn't seem to be supported in the computed style expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed.html new file mode 100644 index 000000000000..3d5451ba3885 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed.html @@ -0,0 +1,24 @@ + +getComputedStyle().textFit + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid-expected.txt new file mode 100644 index 000000000000..92a7699f71e2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid-expected.txt @@ -0,0 +1,8 @@ + +PASS e.style['text-fit'] = "larger" should not set the property value +PASS e.style['text-fit'] = "smaller" should not set the property value +PASS e.style['text-fit'] = "stretch per-line" should not set the property value +PASS e.style['text-fit'] = "grow 150% consistent" should not set the property value +PASS e.style['text-fit'] = "consistent 100%" should not set the property value +PASS e.style['text-fit'] = "grow consistent 1.0" should not set the property value + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid.html new file mode 100644 index 000000000000..6a8c9c2f1279 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid.html @@ -0,0 +1,18 @@ + +Parsing text-fit with invalid values + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid-expected.txt new file mode 100644 index 000000000000..43780df00823 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid-expected.txt @@ -0,0 +1,12 @@ + +FAIL e.style['text-fit'] = "none" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "shrink" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow consistent" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow per-line" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow per-line-all" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow per-line 132%" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "grow consistent 300%" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "shrink per-line 4%" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['text-fit'] = "shrink consistent 50%" should set the property value assert_not_equals: property should be set got disallowed value "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid.html new file mode 100644 index 000000000000..61b4db986854 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid.html @@ -0,0 +1,23 @@ + +Parsing text-fit with valid values + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/w3c-import.log index 910a4cf29557..73cc8e89420b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/w3c-import.log @@ -50,6 +50,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-autospace-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-autospace-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-autospace-valid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-computed.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-invalid.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-fit-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-group-align-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-group-align-valid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/parsing/text-indent-computed.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-autospace/text-autospace-preformatted-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-autospace/text-autospace-preformatted-001-expected.html index d3679fc164be..3d8234f2ea30 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-autospace/text-autospace-preformatted-001-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-autospace/text-autospace-preformatted-001-expected.html @@ -3,7 +3,7 @@ + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image-ref.html new file mode 100644 index 000000000000..20bc96099d38 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image-ref.html @@ -0,0 +1,44 @@ + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image.html new file mode 100644 index 000000000000..bdcff5809d74 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image.html @@ -0,0 +1,49 @@ + + + + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-expected.html new file mode 100644 index 000000000000..47a5d69bb6a2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-expected.html @@ -0,0 +1,34 @@ + + + + + +
    +
    AAAAA BpB
    +
    + +
    +AA
    p +
    + +
    +AA
    p +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-ref.html new file mode 100644 index 000000000000..47a5d69bb6a2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-ref.html @@ -0,0 +1,34 @@ + + + + + +
    +
    AAAAA BpB
    +
    + +
    +AA
    p +
    + +
    +AA
    p +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent.html new file mode 100644 index 000000000000..9e9dc89ef27f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent.html @@ -0,0 +1,44 @@ + + + + + + + + +
    +
    AAAAA BpB
    +
    + +
    +
    AA
    p
    +
    + +
    +AA
    p +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-crash.html new file mode 100644 index 000000000000..35658fcdc3ce --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-crash.html @@ -0,0 +1,14 @@ + + + + +
    A0AA00AAA
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-expected.html new file mode 100644 index 000000000000..804c0385a046 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-expected.html @@ -0,0 +1,44 @@ + + + + + + + +
    xxxx
    + +
    xxxx + +xx
    + +
    xxxxxxxx + +xxxx
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-ref.html new file mode 100644 index 000000000000..804c0385a046 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-ref.html @@ -0,0 +1,44 @@ + + + + + + + +
    xxxx
    + +
    xxxx + +xx
    + +
    xxxxxxxx + +xxxx
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line.html new file mode 100644 index 000000000000..fe5d97ce1cf8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line.html @@ -0,0 +1,49 @@ + + + + + + + + + +
    xxxx
    + +
    xxxx + +xx
    + +
    xxxxxxxx + +xxxx
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-expected.html new file mode 100644 index 000000000000..a7f5e9313876 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-expected.html @@ -0,0 +1,20 @@ + + + + +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-ref.html new file mode 100644 index 000000000000..a7f5e9313876 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-ref.html @@ -0,0 +1,20 @@ + + + + +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent.html new file mode 100644 index 000000000000..cf8301fadd44 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent.html @@ -0,0 +1,23 @@ + + + + + + + +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-expected.html new file mode 100644 index 000000000000..7b3e49fede84 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-expected.html @@ -0,0 +1,41 @@ + + + + + + +
    ABCDEF +GHI
    + +
    ABCDEF +GHI
    + +
    ABCDEF +GHI
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-ref.html new file mode 100644 index 000000000000..7b3e49fede84 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-ref.html @@ -0,0 +1,41 @@ + + + + + + +
    ABCDEF +GHI
    + +
    ABCDEF +GHI
    + +
    ABCDEF +GHI
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic.html new file mode 100644 index 000000000000..c403a3f44d65 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic.html @@ -0,0 +1,50 @@ + + + + + + + + + +
    ABCDEF +GHI
    + + +
    ABCDEF +GHI
    + + +
    ABCDEF +GHI
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-expected.html new file mode 100644 index 000000000000..2bc5949885b6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-expected.html @@ -0,0 +1,27 @@ + + + + +
    ABCDEF
    + +
    GHIJ +KLM
    + + +
    +
    ABC
    +
    DEFGHI
    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-expected.html new file mode 100644 index 000000000000..f758d10fd087 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-expected.html @@ -0,0 +1,20 @@ + + + + +
    ABCDE
    + +
    AB +CDEFG
    + +
    +
    AB
    +
    CDEFG
    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-ref.html new file mode 100644 index 000000000000..f758d10fd087 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-ref.html @@ -0,0 +1,20 @@ + + + + +
    ABCDE
    + +
    AB +CDEFG
    + +
    +
    AB
    +
    CDEFG
    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height.html new file mode 100644 index 000000000000..df1e17bee11b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height.html @@ -0,0 +1,24 @@ + + + + + + + +
    ABCDE
    + + +
    AB +CDEFG
    + + +
    AB +CDEFG
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-ref.html new file mode 100644 index 000000000000..2bc5949885b6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-ref.html @@ -0,0 +1,27 @@ + + + + +
    ABCDEF
    + +
    GHIJ +KLM
    + + +
    +
    ABC
    +
    DEFGHI
    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all.html new file mode 100644 index 000000000000..f642ffed6dda --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all.html @@ -0,0 +1,29 @@ + + + + + + + +
    ABCDEF
    + +
    GHIJ +KLM
    + + +
    ABC +DEFGHI
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-expected.html new file mode 100644 index 000000000000..daf3b7277ed4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-expected.html @@ -0,0 +1,18 @@ + + + + + +
    ABCD EFGHIJ
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-ref.html new file mode 100644 index 000000000000..daf3b7277ed4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-ref.html @@ -0,0 +1,18 @@ + + + + + +
    ABCD EFGHIJ
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line.html new file mode 100644 index 000000000000..a7046ce8924c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line.html @@ -0,0 +1,22 @@ + + + + + + + + +
    ABCD EFGHIJ
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest-expected.txt new file mode 100644 index 000000000000..fbb8e4848374 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest-expected.txt @@ -0,0 +1,5 @@ +123 +4567 + +FAIL Text selection by a pointer device should work correctly assert_equals: expected "67" but got "" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest.html new file mode 100644 index 000000000000..b1faa9c1c2bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest.html @@ -0,0 +1,35 @@ + + + + + + + + + + + +
    123 +4567
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height-expected.txt new file mode 100644 index 000000000000..4bb3bfb14edf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height-expected.txt @@ -0,0 +1,14 @@ +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx + +FAIL line-height:normal should be scaled assert_greater_than: expected a number greater than 18 but got 18 +FAIL line-height: should be scaled assert_greater_than: expected a number greater than 26 but got 26 +PASS line-height: should not be scaled +PASS line-height: should not be scaled + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height.html new file mode 100644 index 000000000000..ad2235ab0e89 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height.html @@ -0,0 +1,89 @@ + + + + + + + + + +
    xxxx
    +
    xxxx
    +
    xxxx
    +
    xxxx
    +
    xxxx
    +
    xxxx
    +
    xxxx
    +
    xxxx
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-expected.html new file mode 100644 index 000000000000..d17d0f6213ba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-expected.html @@ -0,0 +1,71 @@ + + + + + +
    ppp +pppp
    + +
    pp +pppp
    + +
    ppp +pppppppp
    + +
    pppp +pppppppp
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-ref.html new file mode 100644 index 000000000000..d17d0f6213ba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-ref.html @@ -0,0 +1,71 @@ + + + + + +
    ppp +pppp
    + +
    pp +pppp
    + +
    ppp +pppppppp
    + +
    pppp +pppppppp
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting.html new file mode 100644 index 000000000000..935aed1fd550 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting.html @@ -0,0 +1,74 @@ + + + + + + + + +
    ppp +pppp
    + +
    pp +pppp
    + +
    ppp +pppppppp
    + +
    pppp +pppppppp
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-expected.html new file mode 100644 index 000000000000..c91a6a47a99d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-expected.html @@ -0,0 +1,20 @@ + + + + +
    ABCDEFGH +ABCD
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-ref.html new file mode 100644 index 000000000000..c91a6a47a99d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-ref.html @@ -0,0 +1,20 @@ + + + + +
    ABCDEFGH +ABCD
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent.html new file mode 100644 index 000000000000..36f63cdf66a1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent.html @@ -0,0 +1,23 @@ + + + + + + + +
    ABCDEFGH +ABCD
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-expected.html new file mode 100644 index 000000000000..9317b6666356 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-expected.html @@ -0,0 +1,40 @@ + + + + + + +
    ABCDEFGH +ABCDEF
    + +
    ABCDEFGH +ABCDEF
    + +
    ABCDEFGH +ABCDEF
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-ref.html new file mode 100644 index 000000000000..9317b6666356 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-ref.html @@ -0,0 +1,40 @@ + + + + + + +
    ABCDEFGH +ABCDEF
    + +
    ABCDEFGH +ABCDEF
    + +
    ABCDEFGH +ABCDEF
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic.html new file mode 100644 index 000000000000..9a8a5e6ae8fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic.html @@ -0,0 +1,49 @@ + + + + + + + + + +
    ABCDEFGH +ABCDEF
    + + +
    ABCDEFGH +ABCDEF
    + + +
    ABCDEFGH +ABCDEF
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-expected.html new file mode 100644 index 000000000000..870840d627fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-expected.html @@ -0,0 +1,16 @@ + + + + +
    ABCDEABCDE
    + +
    ABCDEABCDE
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-ref.html new file mode 100644 index 000000000000..870840d627fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-ref.html @@ -0,0 +1,16 @@ + + + + +
    ABCDEABCDE
    + +
    ABCDEABCDE
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all.html new file mode 100644 index 000000000000..01b33e015735 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all.html @@ -0,0 +1,20 @@ + + + + + + + +
    ABCDEABCDE
    + +
    ABCDEABCDE
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-expected.html new file mode 100644 index 000000000000..51f54ea79574 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-expected.html @@ -0,0 +1,27 @@ + + + + + +
    AA
    + +
    AA
    + +
    A A
    + +
    A A
    + +
    AA
    +
    AA
    +
    A A
    +
    A A
    + +
    ApAp
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-ref.html new file mode 100644 index 000000000000..51f54ea79574 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-ref.html @@ -0,0 +1,27 @@ + + + + + +
    AA
    + +
    AA
    + +
    A A
    + +
    A A
    + +
    AA
    +
    AA
    +
    A A
    +
    A A
    + +
    ApAp
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing.html new file mode 100644 index 000000000000..8cf219dc14da --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing.html @@ -0,0 +1,36 @@ + + + + + + + + +
    AA
    +
    AA
    +
    A A
    +
    A A
    + +
    AA
    +
    AA
    +
    A A
    +
    A A
    + +
    ApAp
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-expected.html new file mode 100644 index 000000000000..5622b3529842 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-expected.html @@ -0,0 +1,22 @@ + + + + + + +
    +ABCDE FGHI +
    + +
    +ABCDE FGHIJKLM +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-ref.html new file mode 100644 index 000000000000..5622b3529842 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-ref.html @@ -0,0 +1,22 @@ + + + + + + +
    +ABCDE FGHI +
    + +
    +ABCDE FGHIJKLM +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align.html new file mode 100644 index 000000000000..837d5df7b1d1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align.html @@ -0,0 +1,24 @@ + + + + + + + + +
    +ABCDE FGHI +
    + +
    +ABCDE FGHIJKLM +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace-expected.txt new file mode 100644 index 000000000000..85ba3fc0d439 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace-expected.txt @@ -0,0 +1,8 @@ +高輪Gateway +高輪Gateway +高輪Gateway +高輪Gateway + +FAIL "text-autospace" and "consistent" work fine assert_approx_equals: The last letter aligns with the right edge expected 399 +/- 1 but got 106.97599792480469 +FAIL "text-autospace" and "per-line-all" work fine assert_approx_equals: The last letter aligns with the right edge expected 399 +/- 1 but got 106.97599792480469 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace.html new file mode 100644 index 000000000000..2cdf3efa2649 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace.html @@ -0,0 +1,60 @@ + + + + + + + + +
    高輪Gateway
    +
    高輪Gateway
    + +
    高輪Gateway
    +
    高輪Gateway
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-expected.html new file mode 100644 index 000000000000..9d98ced5a66d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-expected.html @@ -0,0 +1,25 @@ + + + + + +
    a b +bc +def +
    + +
    abc abc abcd +bc m +def +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-ref.html new file mode 100644 index 000000000000..9d98ced5a66d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-ref.html @@ -0,0 +1,25 @@ + + + + + +
    a b +bc +def +
    + +
    abc abc abcd +bc m +def +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box.html new file mode 100644 index 000000000000..e8d51b4f3148 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box.html @@ -0,0 +1,27 @@ + + + + + + + +
    a b +bc +def +
    + +
    abc abc abcd +bc m +def +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-expected.html new file mode 100644 index 000000000000..fcd5a36894fd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-expected.html @@ -0,0 +1,36 @@ + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-ref.html new file mode 100644 index 000000000000..fcd5a36894fd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-ref.html @@ -0,0 +1,36 @@ + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink.html new file mode 100644 index 000000000000..3f6c2fef57bc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink.html @@ -0,0 +1,42 @@ + + + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-expected.html new file mode 100644 index 000000000000..346708177747 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-expected.html @@ -0,0 +1,35 @@ + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-ref.html new file mode 100644 index 000000000000..346708177747 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-ref.html @@ -0,0 +1,35 @@ + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness.html new file mode 100644 index 000000000000..1ab25a3ddf57 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness.html @@ -0,0 +1,41 @@ + + + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-expected.html new file mode 100644 index 000000000000..dec1ef463ced --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-expected.html @@ -0,0 +1,48 @@ + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + +
    ÉpÉ +pÉpÉpÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-ref.html new file mode 100644 index 000000000000..dec1ef463ced --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-ref.html @@ -0,0 +1,48 @@ + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + +
    ÉpÉ +pÉpÉpÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis.html new file mode 100644 index 000000000000..94f0d1975886 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis.html @@ -0,0 +1,51 @@ + + + + + + + + + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + +
    ÉpÉ +pÉpÉpÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width-expected.txt new file mode 100644 index 000000000000..8bcbdb142ae3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width-expected.txt @@ -0,0 +1,8 @@ +(テスト +(テスト +(テスト +(テスト + +FAIL [consistent] Check that text-spacing-trim: trim-start scales larger than none because of trimmed start margin assert_true: trimLineHeight (22px) should be greater than noneLineHeight (22px) expected true got false +FAIL [per-line-all] Check that text-spacing-trim: trim-start scales larger than none because of trimmed start margin assert_true: trimLineHeight (22px) should be greater than noneLineHeight (22px) expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width.html new file mode 100644 index 000000000000..81fb1982ab3c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width.html @@ -0,0 +1,65 @@ + + +text-fit and text-spacing-trim interaction + + + + + + + +
    (テスト
    +
    (テスト
    +
    (テスト
    +
    (テスト
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-expected.html new file mode 100644 index 000000000000..59f3c4bd8961 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-expected.html @@ -0,0 +1,73 @@ + + + + + + + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-ref.html new file mode 100644 index 000000000000..59f3c4bd8961 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-ref.html @@ -0,0 +1,73 @@ + + + + + + + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset.html new file mode 100644 index 000000000000..14e94c977b42 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset.html @@ -0,0 +1,80 @@ + + + + + + + + + + + + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + +
    + +
    ÉpÉ +pÉpÉ
    +
    ÉpÉp +pÉpÉpÉpÉ
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-expected.html new file mode 100644 index 000000000000..cff75f064ffa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-expected.html @@ -0,0 +1,43 @@ + + + + +CSS Text Reference: text-fit with vertical-align + + + + + +

    Test passes if the rendering matches the reference file (which uses equivalent font-size instead of text-fit).

    + +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-ref.html new file mode 100644 index 000000000000..cff75f064ffa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-ref.html @@ -0,0 +1,43 @@ + + + + +CSS Text Reference: text-fit with vertical-align + + + + + +

    Test passes if the rendering matches the reference file (which uses equivalent font-size instead of text-fit).

    + +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align.html new file mode 100644 index 000000000000..9d164fb6bf76 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align.html @@ -0,0 +1,46 @@ + + + + +CSS Text Test: text-fit with vertical-align + + + + + + + +

    Test passes if the rendering matches the reference file (which uses equivalent font-size instead of text-fit).

    + +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    +
    AAABC
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/w3c-import.log new file mode 100644 index 000000000000..4814d09e0800 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/w3c-import.log @@ -0,0 +1,84 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/background-image.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-consistent.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/columns-crash.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/consistent-blank-line.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-consistent.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-dynamic.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-line-height.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-all.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/grow-per-line.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/hittest.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/line-height.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/selection-highlight-painting.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-consistent.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-dynamic.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/shrink-per-line-all.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/spacing.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-align.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-autospace.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-box.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-skip-ink.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-decoration-thickness.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-emphasis.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-spacing-trim-fit-width.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/text-underline-offset.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/vertical-align.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-expected.html new file mode 100644 index 000000000000..87321f990811 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-expected.html @@ -0,0 +1,23 @@ + + + + +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-ref.html new file mode 100644 index 000000000000..87321f990811 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode-ref.html @@ -0,0 +1,23 @@ + + + + +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode.html new file mode 100644 index 000000000000..99e2bb792680 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-fit/writing-mode.html @@ -0,0 +1,28 @@ + + + + + + + +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    +
    ABCDEF +GHI
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/w3c-import.log index c2a42f9818df..ba94247f63e9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/w3c-import.log @@ -36,6 +36,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-and-trailing-spaces-005.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-and-trailing-spaces-006-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-and-trailing-spaces-006.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-distribute-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-distribute-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-inter-character-001-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/first-line-text-transform-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/first-line-text-transform-crash.html new file mode 100644 index 000000000000..39931d9e392f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/first-line-text-transform-crash.html @@ -0,0 +1,12 @@ + +Crash when text-transform increases length before a control character in ::first-line + + +
    ß
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/w3c-import.log new file mode 100644 index 000000000000..59c796945647 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/w3c-import.log @@ -0,0 +1,17 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/crashtests/first-line-text-transform-crash.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-001-ref.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-001-ref.xht index e8a5f1acc3ce..26ca13334fbb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-001-ref.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-001-ref.xht @@ -208,61 +208,61 @@
     ゚
     ゚
    -
    []
    []
    -

    +
    []
    []
    +


    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +


    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    +

    +

    +


    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-document-lang-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-document-lang-dynamic-ref.html new file mode 100644 index 000000000000..24708d03bb89 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-document-lang-dynamic-ref.html @@ -0,0 +1,7 @@ + + +CSS Reference: text-transform: capitalize, Dutch IJ digraph + +
    IJsland
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-dynamic-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-dynamic-ref.html new file mode 100644 index 000000000000..b4f464b6cea9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/reference/text-transform-tailoring-dynamic-ref.html @@ -0,0 +1,13 @@ + + +CSS Reference: text-transform locale-tailored casing + +
    IJsland
    +
    +
    IJsland
    +
    +
    IJsland
    +
    Ijsland
    +
    İSTANBUL
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001-expected.xht index e8a5f1acc3ce..26ca13334fbb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001-expected.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001-expected.xht @@ -208,61 +208,61 @@
     ゚
     ゚
    -
    []
    []
    -

    +
    []
    []
    +


    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +


    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    +

    +

    +


    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001.xht index 355aace0a8e9..153000397e91 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-001.xht @@ -216,61 +216,61 @@
     ゚
     ゚
    -
    []
    []
    -

    +
    []
    []
    +


    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    -

    -

    -

    +

    +

    +

    +

    +

    +

    -

    -

    -

    +

    +

    +


    ¢
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic-expected.html new file mode 100644 index 000000000000..24708d03bb89 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic-expected.html @@ -0,0 +1,7 @@ + + +CSS Reference: text-transform: capitalize, Dutch IJ digraph + +
    IJsland
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic.html new file mode 100644 index 000000000000..df4a777da9b0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-document-lang-dynamic.html @@ -0,0 +1,20 @@ + + + +CSS Text, text-transform: capitalize reacts to dynamic lang change on the document element + + + + + +
    ijsland
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic-expected.html new file mode 100644 index 000000000000..b4f464b6cea9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic-expected.html @@ -0,0 +1,13 @@ + + +CSS Reference: text-transform locale-tailored casing + +
    IJsland
    +
    +
    IJsland
    +
    +
    IJsland
    +
    Ijsland
    +
    İSTANBUL
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic.html new file mode 100644 index 000000000000..e7b0be0be258 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-transform/text-transform-tailoring-dynamic.html @@ -0,0 +1,32 @@ + + + +CSS Text, text-transform reacts to dynamic lang changes for locale-tailored casing + + + + + +
    ijsland
    +
    +
    ijsland
    +
    +
    ijsland
    +
    ijsland
    +
    istanbul
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-wrap-style/crashtests/text-wrap-style-pretty-block-in-inline-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-wrap-style/crashtests/text-wrap-style-pretty-block-in-inline-crash.html new file mode 100644 index 000000000000..61d0438e9c65 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-wrap-style/crashtests/text-wrap-style-pretty-block-in-inline-crash.html @@ -0,0 +1,10 @@ + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting.html new file mode 100644 index 000000000000..2e934225ec4e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting.html @@ -0,0 +1,92 @@ + + + + + + + + + + Auto-nesting + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-expected.html new file mode 100644 index 000000000000..c75f9d235297 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-expected.html @@ -0,0 +1,38 @@ + + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-ref.html new file mode 100644 index 000000000000..c75f9d235297 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-ref.html @@ -0,0 +1,38 @@ + + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting.html new file mode 100644 index 000000000000..2c3a831a3e56 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting.html @@ -0,0 +1,61 @@ + + + + + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/callback-order.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/callback-order.tentative.html index f803cc7084f3..fbc1ba28377b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/callback-order.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/callback-order.tentative.html @@ -9,10 +9,16 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-expected.html new file mode 100644 index 000000000000..50637f985529 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-expected.html @@ -0,0 +1,17 @@ + + + + + + +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-ref.html new file mode 100644 index 000000000000..50637f985529 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-ref.html @@ -0,0 +1,17 @@ + + + + + + +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset.html new file mode 100644 index 000000000000..216075914c00 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset.html @@ -0,0 +1,38 @@ + + + + + + + + + + +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-expected.html new file mode 100644 index 000000000000..274bc40ac469 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-expected.html @@ -0,0 +1,28 @@ + +View Transitions: Clip on target in callback does not clip root (Ref) + + + + +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-ref.html new file mode 100644 index 000000000000..274bc40ac469 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-ref.html @@ -0,0 +1,28 @@ + +View Transitions: Clip on target in callback does not clip root (Ref) + + + + +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2.html new file mode 100644 index 000000000000..a5378a2bc7f8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2.html @@ -0,0 +1,61 @@ + + +View Transitions: Fade out of clipped content + + + + + + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-expected.html new file mode 100644 index 000000000000..ed03306b41f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-expected.html @@ -0,0 +1,22 @@ + +View Transitions: Clip on target in callback does not clip root (Ref) + + + + +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-ref.html new file mode 100644 index 000000000000..ed03306b41f0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-ref.html @@ -0,0 +1,22 @@ + +View Transitions: Clip on target in callback does not clip root (Ref) + + + + +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback.html new file mode 100644 index 000000000000..834e1a54f0ac --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback.html @@ -0,0 +1,59 @@ + + +View Transitions: Clip on target in callback does not clip root + + + + + + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-expected.html new file mode 100644 index 000000000000..7368ec81c112 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-expected.html @@ -0,0 +1,15 @@ + + + + + + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html new file mode 100644 index 000000000000..7368ec81c112 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html @@ -0,0 +1,15 @@ + + + + + + + + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block.html new file mode 100644 index 000000000000..4d3f41b36713 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block.html @@ -0,0 +1,52 @@ + + + + + + + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/collision.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/collision.html new file mode 100644 index 000000000000..76c9dc8305b9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/collision.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    +
    +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/contain-view-transition-name-discovery.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/contain-view-transition-name-discovery.html deleted file mode 100644 index 10a1a1197b10..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/contain-view-transition-name-discovery.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Contain and name discovery - - - - - -
    -
    -
    - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-after-capture.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-after-capture.html new file mode 100644 index 000000000000..4e7fad93f8c5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-after-capture.html @@ -0,0 +1,46 @@ + + + + + + + + + + +
    +
    Content
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-contents-after-capture.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-contents-after-capture.html new file mode 100644 index 000000000000..9b15b2a4d508 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-contents-after-capture.html @@ -0,0 +1,46 @@ + + + + + + + + + + +
    +
    Content
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-none-animation-on-group.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-none-animation-on-group.html new file mode 100644 index 000000000000..6a81cc989fe6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-none-animation-on-group.html @@ -0,0 +1,64 @@ + + + + + + + + Nested display none + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/first-letter-pseudo.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/first-letter-pseudo.html new file mode 100644 index 000000000000..52b858846a6f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/first-letter-pseudo.html @@ -0,0 +1,32 @@ + + + + + + + Test name capture when DOM order does not match layout order + + + + +
    +
    A
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/replace-html.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/replace-html.html new file mode 100644 index 000000000000..ca9e9e54405e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/replace-html.html @@ -0,0 +1,18 @@ + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/scroll-marker.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/scroll-marker.html new file mode 100644 index 000000000000..238faba5cfcf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/scroll-marker.html @@ -0,0 +1,81 @@ + + + + + + + Test name capture on elements with scroll markers + + + +
    +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/w3c-import.log index 63d03bc2944a..cd9bc40538fd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/w3c-import.log @@ -15,9 +15,16 @@ None ------------------------------------------------------------------------ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/container-query.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-after-capture.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-change-contents-after-capture.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-inline.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/display-none-animation-on-group.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/first-letter-pseudo.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/implicit-stacking-context.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/mask-image.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/participating-scope.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/replace-html.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/scroll-marker.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/shuffle.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/zindex-part.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/zindex-part.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/zindex-part.html new file mode 100644 index 000000000000..694a6c9f6ca1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/crashtests/zindex-part.html @@ -0,0 +1,30 @@ + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-expected.html new file mode 100644 index 000000000000..11b8d382449d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-expected.html @@ -0,0 +1,38 @@ + + + + + + + + + +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html new file mode 100644 index 000000000000..11b8d382449d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html @@ -0,0 +1,38 @@ + + + + + + + + + +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition.html new file mode 100644 index 000000000000..2ab5cdb2d13f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/document-element-start-view-transition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/document-element-start-view-transition.html index 380b67213a6a..819802ad0f09 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/document-element-start-view-transition.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/document-element-start-view-transition.html @@ -44,7 +44,7 @@ const verifyAbortedTransition = (promise) => { return promise.then( - () => { assert_not_reached('transition aborted') }, + () => { assert_unreached('transition aborted') }, (reason) => { assert_true(reason instanceof DOMException); assert_equals(reason.code, DOMException.ABORT_ERR); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/element-active-view-transition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/element-active-view-transition.html new file mode 100644 index 000000000000..f1fba29dada0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/element-active-view-transition.html @@ -0,0 +1,48 @@ + + +View Transition: element.activeViewTransition attribute + + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-expected.html new file mode 100644 index 000000000000..176fc2a13414 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-expected.html @@ -0,0 +1,16 @@ + + +View transitions: fractional border shift (ref) + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-ref.html new file mode 100644 index 000000000000..176fc2a13414 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-ref.html @@ -0,0 +1,16 @@ + + +View transitions: fractional border shift (ref) + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift.html new file mode 100644 index 000000000000..b055d46a0880 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift.html @@ -0,0 +1,36 @@ + + +View transitions: scoped fractional border shift + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-test-vt-overlay.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-test-vt-overlay.html new file mode 100644 index 000000000000..55957aed819e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-test-vt-overlay.html @@ -0,0 +1,62 @@ + + + + + + + + + +
    +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-testing.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-testing.html new file mode 100644 index 000000000000..0befd56d2370 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-testing.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-expected.html new file mode 100644 index 000000000000..4eb3938b2a29 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-expected.html @@ -0,0 +1,23 @@ + + + + + + + + + +
    Hello
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-ref.html new file mode 100644 index 000000000000..4eb3938b2a29 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-ref.html @@ -0,0 +1,23 @@ + + + + + + + + + +
    Hello
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target.html new file mode 100644 index 000000000000..b6cd86c38832 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target.html @@ -0,0 +1,50 @@ + + + + + + + + + + + +
    Hello
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/nested-scope.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/nested-scope.html index 93091bc2bbef..998757864352 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/nested-scope.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/nested-scope.html @@ -7,7 +7,7 @@ + + +
    0,0
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-ref.html new file mode 100644 index 000000000000..2b1d6856aa9d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-ref.html @@ -0,0 +1,15 @@ + + + + + + +
    0,0
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo.html new file mode 100644 index 000000000000..839337d9b733 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-expected.html new file mode 100644 index 000000000000..6d049f7aa2e2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-expected.html @@ -0,0 +1,32 @@ + + +
    +
    +
    +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-ref.html new file mode 100644 index 000000000000..6d049f7aa2e2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-ref.html @@ -0,0 +1,32 @@ + + +
    +
    +
    +
    +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order.html new file mode 100644 index 000000000000..243758b7eb2b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order.html @@ -0,0 +1,57 @@ + + + + + + + + + + +
    +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-expected.html new file mode 100644 index 000000000000..e8435f0e1129 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-expected.html @@ -0,0 +1,23 @@ + + + + + + +
    +
    +
    +

    TRANSITIONING

    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-ref.html new file mode 100644 index 000000000000..e8435f0e1129 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-ref.html @@ -0,0 +1,23 @@ + + + + + + +
    +
    +
    +

    TRANSITIONING

    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-expected.html new file mode 100644 index 000000000000..2141ff36ebd8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-expected.html @@ -0,0 +1,22 @@ + + + + + + +
    SCOPE
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-ref.html new file mode 100644 index 000000000000..2141ff36ebd8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-ref.html @@ -0,0 +1,22 @@ + + + + + + +
    SCOPE
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize.html new file mode 100644 index 000000000000..98ac53470c5a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize.html @@ -0,0 +1,59 @@ + + + + + + + + + + +
    SCOPE
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering.html new file mode 100644 index 000000000000..f920129ce06a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering.html @@ -0,0 +1,69 @@ + + + + + + + + + + +
    +
    +
    +

    OVERLAY

    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-expected.html new file mode 100644 index 000000000000..c825b7b51d21 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-expected.html @@ -0,0 +1,19 @@ + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-ref.html new file mode 100644 index 000000000000..c825b7b51d21 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-ref.html @@ -0,0 +1,19 @@ + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element.html new file mode 100644 index 000000000000..ec6130fda3d2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element.html @@ -0,0 +1,40 @@ + + + + + + + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-1.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-1.html new file mode 100644 index 000000000000..1cd785b00f6f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-1.html @@ -0,0 +1,76 @@ + + + + + + + Apply view-transition-scope: all during transition + + + + + +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-expected.html new file mode 100644 index 000000000000..d25b386db3c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-expected.html @@ -0,0 +1,35 @@ + + + + + + + + +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-ref.html new file mode 100644 index 000000000000..d25b386db3c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-ref.html @@ -0,0 +1,35 @@ + + + + + + + + +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2.html new file mode 100644 index 000000000000..897fa8e64bff --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2.html @@ -0,0 +1,77 @@ + + + + + + + + View-transition-scope: all applied during view transition + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-expected.html new file mode 100644 index 000000000000..dc1826553bdc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-expected.html @@ -0,0 +1,37 @@ + + +View Transitions: Scrolled target capture position (ref) + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-ref.html new file mode 100644 index 000000000000..dc1826553bdc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-ref.html @@ -0,0 +1,37 @@ + + +View Transitions: Scrolled target capture position (ref) + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-expected.html new file mode 100644 index 000000000000..78ded6f74e50 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-expected.html @@ -0,0 +1,38 @@ + + +View Transitions: Scrolled target capture position (ref) + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-ref.html new file mode 100644 index 000000000000..78ded6f74e50 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-ref.html @@ -0,0 +1,38 @@ + + +View Transitions: Scrolled target capture position (ref) + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl.html new file mode 100644 index 000000000000..e7466c01a763 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl.html @@ -0,0 +1,54 @@ + + +View Transitions: Scrolled target capture position + + + + + + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position.html new file mode 100644 index 000000000000..4902ee4d627e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position.html @@ -0,0 +1,53 @@ + + +View Transitions: Scrolled target capture position + + + + + + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-expected.html new file mode 100644 index 000000000000..f3bbc969390c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-expected.html @@ -0,0 +1,32 @@ + + + + + + +
    World +
    +
    + +
    child
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-ref.html new file mode 100644 index 000000000000..f3bbc969390c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-ref.html @@ -0,0 +1,32 @@ + + + + + + +
    World +
    +
    + +
    child
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child.html new file mode 100644 index 000000000000..43646c08df7a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child.html @@ -0,0 +1,45 @@ + + + + + + + + + + +
    Hello +
    child
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-expected.html new file mode 100644 index 000000000000..2e9bc85dd856 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-expected.html @@ -0,0 +1,11 @@ + + +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-ref.html new file mode 100644 index 000000000000..2e9bc85dd856 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-ref.html @@ -0,0 +1,11 @@ + + +
    +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom.html new file mode 100644 index 000000000000..e14f823c25eb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-expected.html new file mode 100644 index 000000000000..531c2d9b02c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-expected.html @@ -0,0 +1,36 @@ + + +View Transitions: Target in scrolled container capture position (ref) + + + + +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-ref.html new file mode 100644 index 000000000000..531c2d9b02c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-ref.html @@ -0,0 +1,36 @@ + + +View Transitions: Target in scrolled container capture position (ref) + + + + +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container.html new file mode 100644 index 000000000000..b0b19d93e084 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container.html @@ -0,0 +1,45 @@ + + +View Transitions: Target in scrolled container capture position + + + + + + + +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-added-during-callback.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-added-during-callback.html new file mode 100644 index 000000000000..558996da8fe5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-added-during-callback.html @@ -0,0 +1,66 @@ + + + + + + + view-transition-scope: all + display: contents + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-display-contents.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-display-contents.html new file mode 100644 index 000000000000..a71dc46b0739 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-display-contents.html @@ -0,0 +1,77 @@ + + + + + + + view-transition-scope: all + display: contents + + + + + +
    +
    +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-name-discovery.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-name-discovery.html new file mode 100644 index 000000000000..3b4e849ab22b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-name-discovery.html @@ -0,0 +1,107 @@ + + + + + + + + Contain and name discovery + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/w3c-import.log index 052d4c74bde7..d5e2da690fac 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/w3c-import.log @@ -14,27 +14,61 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/active-pseudo-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/active-pseudo.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ancestor-display-change-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ancestor-display-change-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ancestor-display-change.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-name-on-descendant.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-name.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/auto-nesting.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/box-decoration-painting.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/callback-order.tentative.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/capture.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/contain-view-transition-name-discovery.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/centered-paint-offset.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-2.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clip-on-target-in-callback.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/clipper-non-containing-block.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/collision.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/content-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-during-transition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-change.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-inline-block.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/display-none-during-transition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/document-element-start-view-transition.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/element-active-view-transition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/empty-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fill-forwards.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/fractional-border-shift.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/from-scale-zero-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/from-scale-zero-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/from-scale-zero.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-test-vt-overlay.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/hit-testing.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/implicit-contain-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/implicit-contain-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/implicit-contain.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/ink-overflow-on-target.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/missing-view-transition-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/negative-playback-rate.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/nested-scope-expected.html @@ -44,10 +78,47 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/new-content.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/old-content-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/old-content.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/overflow-excludes-pseudo.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/paint-order.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering-resize.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/pause-rendering.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/rotation-on-scoped-element.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/run_in_parallel.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-1.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scope-during-transition-2.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position-rtl.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scrolled-target-position.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/scroller-with-child.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/shadow-dom.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/start-view-transition.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/target-in-scrolled-container.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/to-scale-zero-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/to-scale-zero.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/transform-clip-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/transform-clip-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/transform-clip.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-added-during-callback.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-display-contents.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/scoped/view-transition-scope-name-discovery.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/snapshot-containing-block-static.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/snapshot-containing-block-static.html index fcea95e6efdb..7f109af47206 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/snapshot-containing-block-static.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/snapshot-containing-block-static.html @@ -10,7 +10,8 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html index b2479b60ad4d..01ed7b444791 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html @@ -14,7 +14,7 @@ body { background: pink; - font: 12px/1 Ahem; + font: 20px/1 Ahem; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html index c22fda0f797c..52d3386b2cb2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html @@ -11,7 +11,7 @@ + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe.html new file mode 100644 index 000000000000..48ddcdaa9422 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe.html @@ -0,0 +1,31 @@ + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/w3c-import.log index f25d6274bcef..dfde57b77295 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/w3c-import.log @@ -14,6 +14,8 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/backdrop-filter-while-promise-pending-iframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/cat.png /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/common.js /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/support/dialog-in-rtl-iframe-child.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-root-transition-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-root-transition-crash.html new file mode 100644 index 000000000000..48fe0f273bac --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-root-transition-crash.html @@ -0,0 +1,8 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe-expected.txt new file mode 100644 index 000000000000..e5b2a771d6c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe-expected.txt @@ -0,0 +1,3 @@ + +FAIL A view transition in a removed iframe should return a skipped transition object and not return null assert_not_equals: startViewTransition should not return null got disallowed value null + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe.html new file mode 100644 index 000000000000..d9fe14a6420f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe.html @@ -0,0 +1,40 @@ + + + + View transitions: startViewTransition in a removed iframe + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe-expected.txt new file mode 100644 index 000000000000..1d7cf95caf74 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe-expected.txt @@ -0,0 +1,3 @@ + +FAIL Using a callback from a detached iframe should not crash assert_equals: finished promise should reject with AbortError expected "AbortError" but got "Error" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe.html new file mode 100644 index 000000000000..e47a960c907f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe.html @@ -0,0 +1,43 @@ + + + + View transitions: callback from detached iframe + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection-expected.txt new file mode 100644 index 000000000000..559cb634fdaa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection-expected.txt @@ -0,0 +1,8 @@ + +Harness Error (TIMEOUT), message = null + +PASS Reject ready promise due to skipping a view-transition with an AbortError +PASS Unhandled rejection of ready promise due to skipping a view-transition throws an DOMException +TIMEOUT If the promise returned by updateCallback rejects, the transition is skipped. Test timed out +NOTRUN Reference error in callback triggers rejection of view-transition promises + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection.html new file mode 100644 index 000000000000..27bf49efc6b8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection.html @@ -0,0 +1,109 @@ + + +View transitions: test unhandled promise rejection + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-expected.txt index 17b51e6fd9e2..187dd28cc256 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-expected.txt @@ -1,6 +1,4 @@ -Harness Error (FAIL), message = Unhandled rejection: Old view transition aborted by new view transition. - PASS ViewTransition.types is a ViewTransitionTypeSet PASS ViewTransitionTypeSet behaves like an ordinary Set of strings PASS ViewTransitionTypeSet should reflect its members for a non-active transition diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html index 3ac946b273ba..a93be15e590d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html @@ -14,6 +14,7 @@ } + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise-expected.txt new file mode 100644 index 000000000000..3e073c346e16 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise-expected.txt @@ -0,0 +1,7 @@ + +Harness Error (FAIL), message = Unhandled rejection: Old view transition aborted by new view transition. + +FAIL View transition finished promise is delayed by waitUntil assert_implements: ViewTransition.waitUntil is not available undefined +FAIL View transition finished promise is delayed by multiple waitUntil calls promise_test: Unhandled rejection with value: object "TypeError: transition.waitUntil is not a function. (In 'transition.waitUntil(promise1)', 'transition.waitUntil' is undefined)" +FAIL View transition finished promise is delayed by a rejecting waitUntil promise promise_test: Unhandled rejection with value: object "TypeError: transition.waitUntil is not a function. (In 'transition.waitUntil(promise1)', 'transition.waitUntil' is undefined)" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise.html new file mode 100644 index 000000000000..8d4b6fd95c81 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise.html @@ -0,0 +1,100 @@ + + +View Transition: waitUntil delays the finished promise + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/w3c-import.log index 82c5a8db65a2..883dc2964067 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/w3c-import.log @@ -9,9 +9,9 @@ Do NOT modify or remove this file. ------------------------------------------------------------------------ Properties requiring vendor prefixes: -None +user-select Property values requiring vendor prefixes: -None +box ------------------------------------------------------------------------ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/3d-transform-incoming-expected.html @@ -50,6 +50,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-captured-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-captured-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-captured.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-while-promise-pending-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-while-promise-pending-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/backdrop-filter-while-promise-pending.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/block-with-overflowing-text-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/block-with-overflowing-text-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/block-with-overflowing-text.html @@ -81,6 +84,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/column-span-during-transition-doesnt-skip-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/column-span-during-transition-doesnt-skip-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/column-span-during-transition-doesnt-skip.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/composite-accumulate.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/computed-style-no-active-transition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-escapes-clip-with-abspos-child-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-object-fit-fill-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-object-fit-none-ref.html @@ -90,6 +95,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-visibility-auto-shared-element-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-visibility-auto-shared-element-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-visibility-auto-shared-element.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-visibility-hidden-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-with-child-with-transparent-background-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-with-child-with-transparent-background-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/content-with-child-with-transparent-background.html @@ -145,10 +151,14 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/element-with-overflow-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/element-with-overflow-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/element-with-overflow.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/elements-at-point.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/empty-render-target-capture-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/empty-render-target-capture-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/empty-render-target-capture.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/empty-render-target-crash.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/escaped-name-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/escaped-name-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/escaped-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/event-pseudo-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/exit-transition-with-anonymous-layout-object-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/exit-transition-with-anonymous-layout-object-ref.html @@ -187,6 +197,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/fragmented-during-transition-skips.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/get-computed-style-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/group-animation-for-root-transition.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/group-transform-preserves-subpixel.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-unpainted-element-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html @@ -195,6 +206,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-unrelated-element-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-unrelated-element-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/hit-test-unrelated-element.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/html-becomes-fixed-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/html-becomes-fixed-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/html-becomes-fixed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/idlharness.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/iframe-and-main-frame-transition-new-main-new-iframe-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/iframe-and-main-frame-transition-new-main-new-iframe-ref.html @@ -240,7 +254,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/inline-with-offset-from-containing-block-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/inline-with-offset-from-containing-block-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/inline-with-offset-from-containing-block.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/input-pointer-capture-while-render-blocked.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/input-targets-root-while-render-blocked.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/input-touch-while-render-blocked.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/intrinsic-aspect-ratio-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/japanese-tag-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/japanese-tag-ref.html @@ -664,6 +680,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-caption-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-caption-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-caption.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/table-root-transition-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/to-keyframe-values.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transform-origin-view-transition-group-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transform-origin-view-transition-group-ref.html @@ -675,8 +692,11 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-empty-iframe-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-empty-iframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-hidden-page.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-in-removed-iframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-after-animation-started.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-callback-from-detached-iframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/transition-skipped-from-invalid-callback.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unhandled-rejection.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/unset-and-initial-view-transition-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/update-callback-called-once-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/update-callback-called-once.html @@ -720,6 +740,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-reserved.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-stay-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-types-stay.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-animation-manipulation-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-animation-manipulation-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-animation-manipulation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/view-transition-waituntil-finished-promise.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/web-animation-pseudo-incorrect-name.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/web-animations-api-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/web-animations-api-parse-pseudo-argument-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/window-resize-aborts-transition-before-ready.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/window-resize-aborts-transition-before-ready.html index 09e6e6cc1c9c..8b9fddffd1dd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/window-resize-aborts-transition-before-ready.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-view-transitions/window-resize-aborts-transition-before-ready.html @@ -13,9 +13,10 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/page-descriptors-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/page-descriptors-expected.txt index 8ed1e5ad4e2e..53e43332e71a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/page-descriptors-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/page-descriptors-expected.txt @@ -1,3 +1,3 @@ -FAIL CSSPageDescriptors properties tests assert_equals: computed style should not have size property expected (undefined) undefined but got (string) "" +FAIL CSSPageDescriptors properties tests assert_own_property: CSSPageDescriptors should have property page-orientation expected property "page-orientation" missing diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values-expected.txt index ea73b7a840ba..dba095979bbe 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values-expected.txt @@ -348,13 +348,13 @@ PASS content: counter(par-num, decimal) PASS content: counter(par-num, upper-roman) PASS content: attr(foo-bar) PASS content: attr(foo_bar) -FAIL content: attr(|bar) assert_equals: content raw inline style declaration expected "attr(bar)" but got "attr(|bar)" -FAIL content: attr( |bar ) assert_equals: content raw inline style declaration expected "attr(bar)" but got "attr( |bar )" +PASS content: attr(|bar) +PASS content: attr( |bar ) PASS content: attr(foo-bar, "fallback") PASS content: attr(foo_bar, "fallback") -FAIL content: attr(|bar, "fallback") assert_equals: content raw inline style declaration expected "attr(bar, \"fallback\")" but got "attr(|bar, \"fallback\")" -FAIL content: attr(foo, "") assert_equals: content raw inline style declaration expected "attr(foo, \"\")" but got "attr(foo)" -FAIL content: attr( |foo , "" ) assert_equals: content raw inline style declaration expected "attr(foo)" but got "attr( |foo , \"\" )" +PASS content: attr(|bar, "fallback") +PASS content: attr(foo, "") +PASS content: attr( |foo , "" ) PASS content: inherit PASS cursor: auto PASS cursor: crosshair diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values.html index f1a49565e7e3..071becc9669e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-values.html @@ -98,16 +98,16 @@ function attr() { var values = ['attr(foo-bar)', 'attr(foo_bar)', - {actual: "attr(|bar)", serialized: "attr(bar)"}, - {actual: "attr( |bar )", serialized: "attr(bar)"}]; + {actual: "attr(|bar)", serialized: "attr(|bar)"}, + {actual: "attr( |bar )", serialized: "attr( |bar )"}]; return iterable(values); } function attr_fallback() { var values = ['attr(foo-bar, "fallback")', 'attr(foo_bar, "fallback")', - {actual: 'attr(|bar, "fallback")', serialized: 'attr(bar, "fallback")'}, + {actual: 'attr(|bar, "fallback")', serialized: 'attr(|bar, "fallback")'}, {actual: 'attr(foo, "")', serialized: 'attr(foo, "")'}, - {actual: 'attr( |foo , "" )', serialized: 'attr(foo)'}]; + {actual: 'attr( |foo , "" )', serialized: 'attr( |foo , "" )'}]; return iterable(values); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-expected.html new file mode 100644 index 000000000000..d40c50c7365b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-expected.html @@ -0,0 +1,3 @@ + +
    What color am I
    +
    What color am I
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-ref.html new file mode 100644 index 000000000000..d40c50c7365b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-ref.html @@ -0,0 +1,3 @@ + +
    What color am I
    +
    What color am I
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone.html new file mode 100644 index 000000000000..aece703e05f3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone.html @@ -0,0 +1,14 @@ + +Style mutations on cloned element don't affect the original element + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/w3c-import.log index aa4a4c808a04..3b93a6540a12 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/w3c-import.log @@ -25,6 +25,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSKeyframeRule.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSKeyframesRule.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSNamespaceRule.html +/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSRuleList-appendRule-keyframe-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSRuleList.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleRule-set-selectorText-namespace.html @@ -233,6 +234,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/cssom/setproperty-null-undefined.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/shorthand-serialization.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/shorthand-values.html +/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-clone.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-attr-update-across-documents.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-sheet-interfaces-001.html /LayoutTests/imported/w3c/web-platform-tests/css/cssom/style-sheet-interfaces-002.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/css-filters-animation-opacity.html b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/css-filters-animation-opacity.html index a7c1a1235fae..e9b83da02e95 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/css-filters-animation-opacity.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/css-filters-animation-opacity.html @@ -10,6 +10,7 @@ + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero-ref.html new file mode 100644 index 000000000000..ce79874c1b00 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero-ref.html @@ -0,0 +1,18 @@ + + +feGaussianBlur: blur is applied along the non-zero axis when stdDeviation is "0 X" or "X 0" - reference + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero.html b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero.html new file mode 100644 index 000000000000..44b20a34978c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/feGaussianBlur-stdDeviation-axis-zero.html @@ -0,0 +1,21 @@ + + +feGaussianBlur: blur is applied along the non-zero axis when stdDeviation is "0 X" or "X 0" + + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-coord-box-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-coord-box-interpolation-expected.txt index a38d72d3c76b..9f35e436e011 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-coord-box-interpolation-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-coord-box-interpolation-expected.txt @@ -1,146 +1,146 @@ -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from - 0.1px - 0.1px , line to 9px 9px ) " +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0.4px 0.4px , line to 14px 14px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 0.5px 0.5px , line to 15px 15px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1px 1px , line to 20px 20px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1.5px 1.5px , line to 25px 25px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from - 0.1px - 0.1px , line to 9px 9px ) " +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0.4px 0.4px , line to 14px 14px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 0.5px 0.5px , line to 15px 15px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1px 1px , line to 20px 20px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1.5px 1.5px , line to 25px 25px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from - 0.1px - 0.1px , line to 9px 9px ) " +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0.4px 0.4px , line to 14px 14px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 0.5px 0.5px , line to 15px 15px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1px 1px , line to 20px 20px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1.5px 1.5px , line to 25px 25px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from - 0.1px - 0.1px , line to 9px 9px ) " +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0.4px 0.4px , line to 14px 14px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 0.5px 0.5px , line to 15px 15px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1px 1px , line to 20px 20px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] assert_equals: expected "shape ( from 1px 1px , line to 20px 20px ) content - box " but got "shape ( from 1.5px 1.5px , line to 25px 25px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 9px 9px ) " +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (0.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) border-box] to [shape(from 1px 1px, line to 20px 20px) content-box] at (1.5) should be [shape(from 1px 1px, line to 20px 20px) content-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 14px 14px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 15px 15px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 20px 20px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 25px 25px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 9px 9px ) " +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 14px 14px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 15px 15px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 20px 20px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 25px 25px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 9px 9px ) " +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 14px 14px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 15px 15px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 20px 20px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 25px 25px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 9px 9px ) " +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (-0.1) should be [shape(from 0px 0px, line to 10px 10px)] PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0) should be [shape(from 0px 0px, line to 10px 10px)] -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) " but got "shape ( from 0px 0px , line to 14px 14px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 15px 15px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 20px 20px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] assert_equals: expected "shape ( from 0px 0px , line to 20px 20px ) padding - box " but got "shape ( from 0px 0px , line to 25px 25px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] assert_equals: expected "shape ( from - 1px - 1px , line to 9px 9px ) view - box " but got "shape ( from - 1px - 1px , line to 9px 9px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) view - box " but got "shape ( from 0px 0px , line to 10px 10px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] assert_equals: expected "shape ( from 4px 4px , line to 14px 14px ) view - box " but got "shape ( from 4px 4px , line to 14px 14px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] assert_equals: expected "shape ( from 5px 5px , line to 15px 15px ) view - box " but got "shape ( from 5px 5px , line to 15px 15px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] assert_equals: expected "shape ( from 10px 10px , line to 20px 20px ) view - box " but got "shape ( from 10px 10px , line to 20px 20px ) " -FAIL CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] assert_equals: expected "shape ( from 15px 15px , line to 25px 25px ) view - box " but got "shape ( from 15px 15px , line to 25px 25px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] assert_equals: expected "shape ( from - 1px - 1px , line to 9px 9px ) view - box " but got "shape ( from - 1px - 1px , line to 9px 9px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) view - box " but got "shape ( from 0px 0px , line to 10px 10px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] assert_equals: expected "shape ( from 4px 4px , line to 14px 14px ) view - box " but got "shape ( from 4px 4px , line to 14px 14px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] assert_equals: expected "shape ( from 5px 5px , line to 15px 15px ) view - box " but got "shape ( from 5px 5px , line to 15px 15px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] assert_equals: expected "shape ( from 10px 10px , line to 20px 20px ) view - box " but got "shape ( from 10px 10px , line to 20px 20px ) " -FAIL CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] assert_equals: expected "shape ( from 15px 15px , line to 25px 25px ) view - box " but got "shape ( from 15px 15px , line to 25px 25px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] assert_equals: expected "shape ( from - 1px - 1px , line to 9px 9px ) view - box " but got "shape ( from - 1px - 1px , line to 9px 9px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) view - box " but got "shape ( from 0px 0px , line to 10px 10px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] assert_equals: expected "shape ( from 4px 4px , line to 14px 14px ) view - box " but got "shape ( from 4px 4px , line to 14px 14px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] assert_equals: expected "shape ( from 5px 5px , line to 15px 15px ) view - box " but got "shape ( from 5px 5px , line to 15px 15px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] assert_equals: expected "shape ( from 10px 10px , line to 20px 20px ) view - box " but got "shape ( from 10px 10px , line to 20px 20px ) " -FAIL CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] assert_equals: expected "shape ( from 15px 15px , line to 25px 25px ) view - box " but got "shape ( from 15px 15px , line to 25px 25px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] assert_equals: expected "shape ( from - 1px - 1px , line to 9px 9px ) view - box " but got "shape ( from - 1px - 1px , line to 9px 9px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] assert_equals: expected "shape ( from 0px 0px , line to 10px 10px ) view - box " but got "shape ( from 0px 0px , line to 10px 10px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] assert_equals: expected "shape ( from 4px 4px , line to 14px 14px ) view - box " but got "shape ( from 4px 4px , line to 14px 14px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] assert_equals: expected "shape ( from 5px 5px , line to 15px 15px ) view - box " but got "shape ( from 5px 5px , line to 15px 15px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] assert_equals: expected "shape ( from 10px 10px , line to 20px 20px ) view - box " but got "shape ( from 10px 10px , line to 20px 20px ) " -FAIL Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] assert_equals: expected "shape ( from 15px 15px , line to 25px 25px ) view - box " but got "shape ( from 15px 15px , line to 25px 25px ) " -FAIL CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 8px ) " +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.4) should be [shape(from 0px 0px, line to 10px 10px)] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (0.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px)] to [shape(from 0px 0px, line to 20px 20px) padding-box] at (1.5) should be [shape(from 0px 0px, line to 20px 20px) padding-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] +PASS CSS Transitions: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] +PASS CSS Transitions with transition: all: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] +PASS CSS Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (-0.1) should be [shape(from -1px -1px, line to 9px 9px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0) should be [shape(from 0px 0px, line to 10px 10px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.4) should be [shape(from 4px 4px, line to 14px 14px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (0.5) should be [shape(from 5px 5px, line to 15px 15px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1) should be [shape(from 10px 10px, line to 20px 20px) view-box] +PASS Web Animations: property from [shape(from 0px 0px, line to 10px 10px) view-box] to [shape(from 10px 10px, line to 20px 20px) view-box] at (1.5) should be [shape(from 15px 15px, line to 25px 25px) view-box] +PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (0) should be [circle(10px)] -FAIL CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 18px ) " -FAIL CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 20px ) " -FAIL CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 30px ) " -FAIL CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 40px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 8px ) " +PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] +PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] +PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] +PASS CSS Transitions: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] +PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (0) should be [circle(10px)] -FAIL CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 18px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 20px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 30px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 40px ) " -FAIL CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 8px ) " +PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] +PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] +PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] +PASS CSS Transitions with transition: all: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] +PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0) should be [circle(10px)] -FAIL CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 18px ) " -FAIL CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 20px ) " -FAIL CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 30px ) " -FAIL CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 40px ) " -FAIL Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 8px ) " +PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] +PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] +PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] +PASS CSS Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] +PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (-0.1) should be [circle(10px)] PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0) should be [circle(10px)] -FAIL Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] assert_equals: expected "circle ( 10px ) " but got "circle ( 18px ) " -FAIL Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 20px ) " -FAIL Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 30px ) " -FAIL Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] assert_equals: expected "circle ( 30px ) content - box " but got "circle ( 40px ) " +PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.4) should be [circle(10px)] +PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (0.5) should be [circle(30px) content-box] +PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1) should be [circle(30px) content-box] +PASS Web Animations: property from [circle(10px) border-box] to [circle(30px) content-box] at (1.5) should be [circle(30px) content-box] PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (-0.1) should be [circle(20px)] PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (0) should be [circle(20px)] PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (0.4) should be [circle(20px)] -FAIL CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " +PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] +PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] +PASS CSS Transitions: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (-0.1) should be [circle(20px)] PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (0) should be [circle(20px)] PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (0.4) should be [circle(20px)] -FAIL CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " +PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] +PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] +PASS CSS Transitions with transition: all: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (-0.1) should be [circle(20px)] PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0) should be [circle(20px)] PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.4) should be [circle(20px)] -FAIL CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " +PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] +PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] +PASS CSS Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (-0.1) should be [circle(20px)] PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0) should be [circle(20px)] PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.4) should be [circle(20px)] -FAIL Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] assert_equals: expected "circle ( 20px ) padding - box " but got "circle ( 20px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] assert_equals: expected "circle ( 8px ) view - box " but got "circle ( 8px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] assert_equals: expected "circle ( 10px ) view - box " but got "circle ( 10px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] assert_equals: expected "circle ( 18px ) view - box " but got "circle ( 18px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] assert_equals: expected "circle ( 20px ) view - box " but got "circle ( 20px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] assert_equals: expected "circle ( 30px ) view - box " but got "circle ( 30px ) " -FAIL CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] assert_equals: expected "circle ( 40px ) view - box " but got "circle ( 40px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] assert_equals: expected "circle ( 8px ) view - box " but got "circle ( 8px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] assert_equals: expected "circle ( 10px ) view - box " but got "circle ( 10px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] assert_equals: expected "circle ( 18px ) view - box " but got "circle ( 18px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] assert_equals: expected "circle ( 20px ) view - box " but got "circle ( 20px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] assert_equals: expected "circle ( 30px ) view - box " but got "circle ( 30px ) " -FAIL CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] assert_equals: expected "circle ( 40px ) view - box " but got "circle ( 40px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] assert_equals: expected "circle ( 8px ) view - box " but got "circle ( 8px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] assert_equals: expected "circle ( 10px ) view - box " but got "circle ( 10px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] assert_equals: expected "circle ( 18px ) view - box " but got "circle ( 18px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] assert_equals: expected "circle ( 20px ) view - box " but got "circle ( 20px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] assert_equals: expected "circle ( 30px ) view - box " but got "circle ( 30px ) " -FAIL CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] assert_equals: expected "circle ( 40px ) view - box " but got "circle ( 40px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] assert_equals: expected "circle ( 8px ) view - box " but got "circle ( 8px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] assert_equals: expected "circle ( 10px ) view - box " but got "circle ( 10px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] assert_equals: expected "circle ( 18px ) view - box " but got "circle ( 18px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] assert_equals: expected "circle ( 20px ) view - box " but got "circle ( 20px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] assert_equals: expected "circle ( 30px ) view - box " but got "circle ( 30px ) " -FAIL Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] assert_equals: expected "circle ( 40px ) view - box " but got "circle ( 40px ) " +PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (0.5) should be [circle(20px) padding-box] +PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1) should be [circle(20px) padding-box] +PASS Web Animations: property from [circle(20px)] to [circle(20px) padding-box] at (1.5) should be [circle(20px) padding-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] +PASS CSS Transitions: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] +PASS CSS Transitions with transition: all: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] +PASS CSS Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (-0.1) should be [circle(8px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0) should be [circle(10px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.4) should be [circle(18px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (0.5) should be [circle(20px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1) should be [circle(30px) view-box] +PASS Web Animations: property from [circle(10px) view-box] to [circle(30px) view-box] at (1.5) should be [circle(40px) view-box] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-interpolation-006-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-interpolation-006-expected.txt index daa150115dda..533ffb752f24 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-interpolation-006-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/motion/animation/offset-path-interpolation-006-expected.txt @@ -378,25 +378,25 @@ PASS Web Animations: property from [xywh(10px 10px 200px 100px)] t FAIL Web Animations: property from [xywh(10px 10px 200px 100px)] to [inset(50px)] at (1) should be [inset(50px calc(0% + 50px) calc(0% + 50px) 50px)] assert_equals: expected "inset ( 50px calc ( 0 % + 50px ) calc ( 0 % + 50px ) 50px ) " but got "inset ( 50px ) " PASS Web Animations: property from [xywh(10px 10px 200px 100px)] to [inset(50px)] at (2) should be [inset(90px calc(-100% + 310px) calc(-100% + 210px) 90px)] PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Transitions with transition: all: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] PASS CSS Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (2) should be [inset(90px calc(200% - 150px) calc(40% - 10px) calc(40% - 10px))] PASS Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (-1) should be [inset(-30px calc(-100% + 90px) calc(-20% + 20px) calc(-20% + 20px)] -FAIL Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] assert_equals: expected "inset ( 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " but got "inset ( 10px 10px calc ( 0 % + 10px ) calc ( 0 % + 10px ) ) " +PASS Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0) should be [inset(10px calc(0% + 10px) calc(0% + 10px))] PASS Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.125) should be [inset(15px 12.5% calc(2.5% + 8.75px) calc(2.5% + 8.75px))] PASS Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (0.875) should be [inset(45px calc(87.5% - 60px) calc(17.5% + 1.25px) calc(17.5% + 1.25px))] PASS Web Animations: property from [inset(10px)] to [rect(50px 70px 80% 20%)] at (1) should be [inset(50px calc(100% - 70px) 20% 20%)] diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-028-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-028-expected.txt index 8e951b8203be..f3413b750fb5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-028-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-028-expected.txt @@ -7,5 +7,5 @@ If any button within the group has a blue outline after using either arrow key, Click me I will be focused programmatically. Button 2 Button 3 -FAIL Programmatic focus after click and keyboard interaction should match :focus-visible assert_equals: outlineColor for BUTTON#btn2 is blue expected "rgb(0, 0, 255)" but got "rgba(0, 0, 0, 0.847)" +PASS Programmatic focus after click and keyboard interaction should match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed-expected.txt new file mode 100644 index 000000000000..0b796425b26f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed-expected.txt @@ -0,0 +1,8 @@ + +PASS :heading(1) matches in the HTML namespace +PASS :heading(2) matches in the HTML namespace +PASS :heading(3) matches in the HTML namespace +PASS :heading(4) matches in the HTML namespace +PASS :heading(5) matches in the HTML namespace +PASS :heading(6) matches in the HTML namespace + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed.html b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed.html new file mode 100644 index 000000000000..d1307d3876b0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/heading-prefixed.html @@ -0,0 +1,22 @@ + + +:heading(N) matches prefixed HTML headings + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-loading-state.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-loading-state.sub.html index 53cb9b4f67f4..05639e174d45 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-loading-state.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-loading-state.sub.html @@ -29,12 +29,9 @@ video.src = `support/stall-resume.py?key=${key}`; }); const promise = video.play(); - assert_equals( - document.querySelector("video:stalled"), - video, - "video is stalled" - ); + assert_true(video.matches(":stalled"), ":stalled matches"); video.src = ""; + assert_false(video.matches(":stalled"), ":stalled stops matching"); // Wait for the video to abort trying to play try { await promise; @@ -51,12 +48,9 @@ }); video.currentTime = 10; const promise = video.play(); - assert_equals( - document.querySelector("video:buffering"), - video, - "video is buffering" - ); + assert_true(video.matches(":buffering"), ":buffering matches"); video.src = ""; + assert_false(video.matches(":buffering"), ":buffering stops matching"); // Wait for the video to abort trying to play try { await promise; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation-expected.txt new file mode 100644 index 000000000000..40c61f57dc5e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation-expected.txt @@ -0,0 +1,6 @@ + + +PASS CSS invalidation fires for :playing when no :paused rule is present +PASS CSS invalidation fires for :paused when no :playing rule is present +PASS CSS invalidation fires for both :playing and :paused rules + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation.html b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation.html new file mode 100644 index 000000000000..a853e656bc2d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation.html @@ -0,0 +1,71 @@ + +CSS style invalidation for :playing and :paused pseudo-classes + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/w3c-import.log index ecf8819735c0..39b3c569f708 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/w3c-import.log @@ -19,4 +19,5 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-loading-state.sub.html /LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playback-state-timing.html /LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playback-state.html +/LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/media-playing-paused-style-invalidation.html /LayoutTests/imported/w3c/web-platform-tests/css/selectors/media/sound-state.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https-expected.txt new file mode 100644 index 000000000000..2a7c72c7c16a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https-expected.txt @@ -0,0 +1,5 @@ + +PASS non-fully active document behavior for navigator.credentials.create() +FAIL Promise rejects with DOMException when the document becomes non-fully active promise_rejects_dom: Expect promise to reject if the document becomes non-fully active function "function() { throw e; }" threw object "NotSupportedError: No credential type was specified." that is not a DOMException AbortError: property "code" is equal to 9, expected 20 +FAIL Aborted Digital Credentials create() requests do not leave a subsequent request stuck in an invalid state assert_equals: Iteration 0: should reject with the exact abort reason expected object "Error: Aborted iteration 0" but got object "NotSupportedError: No credential type was specified." + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https.html new file mode 100644 index 000000000000..91ec98e59389 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https.html @@ -0,0 +1,106 @@ + + +Digital Credentials Test: navigator.credentials.create() non-fully active document + + + + + + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.tentative.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.tentative.https.html index 916d5778d109..6a48524c943b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.tentative.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.tentative.https.html @@ -1,6 +1,6 @@ Digital Credential API tests for create. - + @@ -236,6 +236,7 @@ for (const badValue of throwingValues) { const options = makeCreateOptions({ data: badValue }); + await test_driver.bless("user activation"); await promise_rejects_js( t, TypeError, @@ -256,4 +257,30 @@ "Should throw for invalid form element" ); }, "Throws when form element does not contain password."); + + promise_test(async (t) => { + const controller = new AbortController(); + const signal = controller.signal; + + const options = { + digital: { + requests: [ + { + protocol: "unknown-protocol", + data: BigInt(1), // malformed/non-serializable + }, + { + protocol: "openid4vci", + data: { some: "data" }, // proper data + }, + ], + }, + signal, + }; + + await test_driver.bless("user activation"); + const promise = navigator.credentials.create(options); + controller.abort(); + await promise_rejects_dom(t, "AbortError", promise); + }, "navigator.credentials.create() with one unknown protocol with malformed data and one known protocol with proper data should skip the unknown one and not fail."); diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https-expected.txt index 1bf8c21f50e1..56cd96742040 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https-expected.txt @@ -1,4 +1,3 @@ PASS check default isConditionalMediationAvailable() behavior, inherited from Credential interface. -FAIL check default willRequestConditionalCreation() behavior, inherited from Credential interface promise_test: Unhandled rejection with value: object "TypeError: DigitalCredential.willRequestConditionalCreation is not a function. (In 'DigitalCredential.willRequestConditionalCreation()', 'DigitalCredential.willRequestConditionalCreation' is undefined)" diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https.html index 5e00861124fd..bb5e6ce2acbc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https.html @@ -1,6 +1,6 @@ Digital Credential static methods. - + @@ -14,11 +14,4 @@ assert_equals(result, false); }, "check default isConditionalMediationAvailable() behavior, inherited from Credential interface."); - /** - * @see https://www.w3.org/TR/credential-management/#dom-credential-willrequestconditionalcreation - */ - promise_test(async (t) => { - const result = await DigitalCredential.willRequestConditionalCreation(); - assert_equals(result, undefined); - }, "check default willRequestConditionalCreation() behavior, inherited from Credential interface"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https-expected.txt new file mode 100644 index 000000000000..c1742b218fd7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https-expected.txt @@ -0,0 +1,5 @@ + +PASS non-fully active document behavior for navigator.credentials.get() +FAIL Promise rejects with DOMException when the document becomes non-fully active promise_rejects_dom: Expect promise to reject if the document becomes non-fully active function "function() { throw e; }" threw object "TypeError: No supported document requests to present." that is not a DOMException AbortError: property "code" is equal to undefined, expected 20 +PASS Aborted Digital Credentials get() requests do not leave a subsequent request stuck in an invalid state + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https.html new file mode 100644 index 000000000000..3e2211e31693 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https.html @@ -0,0 +1,106 @@ + + +Digital Credentials Test: navigator.credentials.get() non-fully active document + + + + + + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https-expected.txt new file mode 100644 index 000000000000..285a5290351b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https-expected.txt @@ -0,0 +1,22 @@ + + +PASS Type conversion happens on the data member of the DigitalCredentialGetRequest object. +PASS Calling navigator.credentials.get() without a digital member same origin. +PASS navigator.credentials.get() API rejects if there are no credential request. +FAIL navigator.credentials.get() API rejects if there are no credential request for same-origin iframe. promise_rejects_js: function "function() { throw e; }" threw object "NotAllowedError: The document is not focused." ("NotAllowedError") expected instance of function "function TypeError() { + [native code] +}" ("TypeError") +PASS navigator.credentials.get() API rejects if there are no credential request in cross-origin iframe. +PASS navigator.credentials.get() promise is rejected if called with an aborted controller. +PASS navigator.credentials.get() promise is rejected if called with an aborted controller in same-origin iframe. +PASS navigator.credentials.get() promise is rejected if called with an aborted signal in cross-origin iframe. +FAIL navigator.credentials.get() promise is rejected if abort controller is aborted after call to get(). promise_rejects_dom: function "function() { throw e; }" threw object "NotAllowedError: The document is not focused." that is not a DOMException AbortError: property "code" is equal to 0, expected 20 +PASS navigator.credentials.get() promise is rejected if abort controller is aborted after call to get() in cross-origin iframe. +PASS Mediation is implicitly required and hence ignored. Request is aborted regardless. +PASS Throws TypeError when request data is not JSON stringifiable. +PASS `requests` field is required in the options object. +FAIL navigator.credentials.get() with one unknown protocol with malformed data and one known protocol with proper data should skip the unknown one and not fail. promise_rejects_dom: function "function() { throw e; }" threw object "TypeError: Type error" that is not a DOMException AbortError: property "code" is equal to undefined, expected 20 +PASS navigator.credentials.get() with only bogus requests should reject with TypeError. +FAIL navigator.credentials.get() with good requests at the start and end should skip the bogus ones and not fail. promise_rejects_dom: function "function() { throw e; }" threw object "TypeError: Type error" that is not a DOMException AbortError: property "code" is equal to undefined, expected 20 +FAIL navigator.credentials.get() with bogus requests at both ends should skip them and not fail. promise_rejects_dom: function "function() { throw e; }" threw object "TypeError: Type error" that is not a DOMException AbortError: property "code" is equal to undefined, expected 20 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https.html new file mode 100644 index 000000000000..8593bf2fb0bb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https.html @@ -0,0 +1,347 @@ + +Digital Credential tests. + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https-expected.txt deleted file mode 100644 index ee765b285b6d..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https-expected.txt +++ /dev/null @@ -1,18 +0,0 @@ - - -PASS Type conversion happens on the data member of the DigitalCredentialGetRequest object. -PASS Calling navigator.credentials.get() without a digital member same origin. -PASS navigator.credentials.get() API rejects if there are no credential request. -FAIL navigator.credentials.get() API rejects if there are no credential request for same-origin iframe. promise_rejects_js: function "function() { throw e; }" threw object "NotAllowedError: The document is not focused." ("NotAllowedError") expected instance of function "function TypeError() { - [native code] -}" ("TypeError") -PASS navigator.credentials.get() API rejects if there are no credential request in cross-origin iframe. -PASS navigator.credentials.get() promise is rejected if called with an aborted controller. -PASS navigator.credentials.get() promise is rejected if called with an aborted controller in same-origin iframe. -PASS navigator.credentials.get() promise is rejected if called with an aborted signal in cross-origin iframe. -PASS navigator.credentials.get() promise is rejected if abort controller is aborted after call to get(). -PASS navigator.credentials.get() promise is rejected if abort controller is aborted after call to get() in cross-origin iframe. -PASS Mediation is implicitly required and hence ignored. Request is aborted regardless. -PASS Throws TypeError when request data is not JSON stringifiable. -PASS `requests` field is required in the options object. - diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https.html deleted file mode 100644 index fca206902f6a..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https.html +++ /dev/null @@ -1,261 +0,0 @@ - -Digital Credential tests. - - - - - - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https-expected.txt deleted file mode 100644 index 6674e288aa8e..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https-expected.txt +++ /dev/null @@ -1,5 +0,0 @@ - -PASS non-fully active document behavior for CredentialsContainer -FAIL Promise rejects with DOMException when the document becomes non-fully active promise_rejects_dom: Expect promise to reject if the document becomes non-fully active function "function() { throw e; }" threw object "TypeError: No supported document requests to present." that is not a DOMException AbortError: property "code" is equal to undefined, expected 20 -PASS Aborted Digital Credentials requests do not leave a subsequent request stuck in an invalid state. - diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https.html deleted file mode 100644 index 84bf85653493..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https.html +++ /dev/null @@ -1,116 +0,0 @@ - - -Digital Credentials Test: non-fully active document - - - - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http-expected.txt new file mode 100644 index 000000000000..39241f4476b2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http-expected.txt @@ -0,0 +1,3 @@ + +PASS When in a non-secure context, there is no access to digital credentials. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http.html new file mode 100644 index 000000000000..97d58e6e1162 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http.html @@ -0,0 +1,12 @@ + + +Digital Credentials: non-secure contexts + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/support/helper.js b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/support/helper.js index 697d737c1c50..f8153defe73f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/support/helper.js +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/support/helper.js @@ -21,13 +21,107 @@ const CANONICAL_REQUEST_OBJECTS = { /* Canonical object coming soon */ }, "openid4vp-v1-unsigned": { - /* Canonical object coming soon */ + "dcql_query": { + "credentials": [ + { + "id": "pid", + "format": "dc+sd-jwt", + "meta": { + "vct_values": [ + "urn:eudi:pid:1" + ] + }, + "claims": [ + { + "path": [ + "family_name" + ] + }, + { + "path": [ + "given_name" + ] + } + ] + } + ] + }, + "nonce": "GGGRdhww2TFQM4dw6wgGc0suML49-._~", + "client_metadata": { + "vp_formats_supported": { + "dc+sd-jwt": { + "sd-jwt_alg_values": [ + "RS256", + "RS384", + "RS512", + "PS256", + "PS384", + "PS512", + "ES256", + "ES256K", + "ES384", + "ES512", + "EdDSA", + "Ed25519", + "Ed448" + ], + "kb-jwt_alg_values": [ + "RS256", + "RS384", + "RS512", + "PS256", + "PS384", + "PS512", + "ES256", + "ES256K", + "ES384", + "ES512", + "EdDSA", + "Ed25519", + "Ed448" + ] + } + }, + "jwks": { + "keys": [ + { + "kty": "EC", + "use": "enc", + "crv": "P-256", + "kid": "A541J5yUqazgE8WBFkIyeh2OtK-udqUR_OC0kB7l3oU", + "x": "cwYyuS94hcOtcPlrMMtGtflCfbZUwz5Mf1Gfa2m0AM8", + "y": "KB7sJkFQyB8jZHO9vmWS5LNECL4id3OJO9HX9ChNonA", + "alg": "ECDH-ES" + } + ] + }, + "encrypted_response_enc_values_supported": [ + "A128GCM" + ] + }, + "response_type": "vp_token", + "response_mode": "dc_api.jwt", + "O4Li4bl8jqjimxUt": "TarZDlUChNKhLCkv" }, "openid4vp-v1-signed": { - /* Canonical object coming soon */ + "request": "eyJ4NWMiOlsiTUlJSVZUQ0NCL3VnQXdJQkFnSVVHZmxJbEZ5dFk1clQ1aUI2RGRIMm9ZSS85L3N3Q2dZSUtvWkl6ajBFQXdJd0lURUxNQWtHQTFVRUJoTUNSMEl4RWpBUUJnTlZCQU1NQ1U5SlJFWWdWR1Z6ZERBZUZ3MHlOREV4TWpjeU1EUXdORGhhRncwek5ERXhNalV5TURRd05EaGFNQ0V4Q3pBSkJnTlZCQVlUQWtkQ01SSXdFQVlEVlFRRERBbFBTVVJHSUZSbGMzUXdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBVFQvZExzZDUxTExCckdWNlIyM282dnltUnhIWGVGQm9JOHlxMzF5NWtGVjJWVjBnaTl4NVp6RUZpcThETWlBSHVjTEFDRm5keEx0Wm9yQ2hhOXp6blFvNElIRHpDQ0J3c3dIUVlEVlIwT0JCWUVGTGx4dDJBQjR3R0xuREdsdW5BaElhRktFQllSTUI4R0ExVWRJd1FZTUJhQUZMbHh0MkFCNHdHTG5ER2x1bkFoSWFGS0VCWVJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnZ2EyQmdOVkhSRUVnZ2F0TUlJR3FZSVFkM2QzTG1obFpXNWhiaTV0WlM1MWE0SUpiRzlqWVd4b2IzTjBnaFpzYjJOaGJHaHZjM1F1WlcxdlltbDRMbU52TG5WcmdoMWtaVzF2TG1ObGNuUnBabWxqWVhScGIyNHViM0JsYm1sa0xtNWxkSUljZDNkM0xtTmxjblJwWm1sallYUnBiMjR1YjNCbGJtbGtMbTVsZElJZ2MzUmhaMmx1Wnk1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDSW1SbGJXOHVjR2xrTFdsemMzVmxjaTVpZFc1a1pYTmtjblZqYTJWeVpXa3VaR1dDTUhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHhMbU5sY25ScFptbGpZWFJwYjI0dWIzQmxibWxrTG01bGRJSXdjbVYyYVdWM0xXRndjQzFrWlhZdFluSmhibU5vTFRJdVkyVnlkR2xtYVdOaGRHbHZiaTV2Y0dWdWFXUXVibVYwZ2pCeVpYWnBaWGN0WVhCd0xXUmxkaTFpY21GdVkyZ3RNeTVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNSEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMwMExtTmxjblJwWm1sallYUnBiMjR1YjNCbGJtbGtMbTVsZElJd2NtVjJhV1YzTFdGd2NDMWtaWFl0WW5KaGJtTm9MVFV1WTJWeWRHbG1hV05oZEdsdmJpNXZjR1Z1YVdRdWJtVjBnakJ5WlhacFpYY3RZWEJ3TFdSbGRpMWljbUZ1WTJndE5pNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01ISmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzAzTG1ObGNuUnBabWxqWVhScGIyNHViM0JsYm1sa0xtNWxkSUl3Y21WMmFXVjNMV0Z3Y0Mxa1pYWXRZbkpoYm1Ob0xUZ3VZMlZ5ZEdsbWFXTmhkR2x2Ymk1dmNHVnVhV1F1Ym1WMGdqQnlaWFpwWlhjdFlYQndMV1JsZGkxaWNtRnVZMmd0T1M1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHhNQzVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweE1TNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB4TWk1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHhNeTVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweE5DNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB4TlM1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHhOaTVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweE55NWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB4T0M1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHhPUzVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweU1DNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB5TVM1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHlNaTVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweU15NWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB5TkM1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHlOUzVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweU5pNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB5Tnk1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFNDTVhKbGRtbGxkeTFoY0hBdFpHVjJMV0p5WVc1amFDMHlPQzVqWlhKMGFXWnBZMkYwYVc5dUxtOXdaVzVwWkM1dVpYU0NNWEpsZG1sbGR5MWhjSEF0WkdWMkxXSnlZVzVqYUMweU9TNWpaWEowYVdacFkyRjBhVzl1TG05d1pXNXBaQzV1WlhTQ01YSmxkbWxsZHkxaGNIQXRaR1YyTFdKeVlXNWphQzB6TUM1alpYSjBhV1pwWTJGMGFXOXVMbTl3Wlc1cFpDNXVaWFF3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnRGhrekYrS1hWdWFvNVo5bFUycU1TY21rZ3JQUTVNQnRVUFZkcXRUdFpwd0NJUURNVWw1b2ZqcDEvNG1OWHorZ3BTejVvcW1oVzloUzRJaFJoQXMvQWxSNDB3PT0iXSwia2lkIjoiNUgxV0xlU3g1NXRNVzZKTmx2cU1mZzNPX0UwZVFQcUI4akRTb1VuNm9pSSIsInR5cCI6Im9hdXRoLWF1dGh6LXJlcStqd3QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3NlbGYtaXNzdWVkLm1lL3YyIiwiclVMYXNsejVQczhuUW5qbiI6IjJFNjJSb0g0Z09Ua2RCNTEiLCJyZXNwb25zZV90eXBlIjoidnBfdG9rZW4iLCJleHBlY3RlZF9vcmlnaW5zIjpbImh0dHBzOi8vZGVtby5jZXJ0aWZpY2F0aW9uLm9wZW5pZC5uZXQiXSwiZGNxbF9xdWVyeSI6eyJjcmVkZW50aWFscyI6W3siaWQiOiJtZGwiLCJmb3JtYXQiOiJtc29fbWRvYyIsIm1ldGEiOnsiZG9jdHlwZV92YWx1ZSI6Im9yZy5pc28uMTgwMTMuNS4xLm1ETCJ9LCJjbGFpbXMiOlt7InBhdGgiOlsib3JnLmlzby4xODAxMy41LjEiLCJmYW1pbHlfbmFtZSJdfSx7InBhdGgiOlsib3JnLmlzby4xODAxMy41LjEiLCJnaXZlbl9uYW1lIl19XX1dfSwibm9uY2UiOiJhdnVyOExxNFFTWXFCS1ZVVWpScUhQY3haTDhmLS5ffiIsImNsaWVudF9pZCI6Ing1MDlfaGFzaDpOMklqYlM5cS1lM0JWTUViZHEyNTJicFVIcUpmeVExdWRUVzNNTk9sLUU0IiwiY2xpZW50X21ldGFkYXRhIjp7InZwX2Zvcm1hdHNfc3VwcG9ydGVkIjp7Im1zb19tZG9jIjp7ImFsZyI6WyJFUzI1NiJdfX0sImp3a3MiOnsia2V5cyI6W3sia3R5IjoiRUMiLCJ1c2UiOiJlbmMiLCJjcnYiOiJQLTI1NiIsImtpZCI6IkE1NDFKNXlVcWF6Z0U4V0JGa0l5ZWgyT3RLLXVkcVVSX09DMGtCN2wzb1UiLCJ4IjoiY3dZeXVTOTRoY090Y1Bsck1NdEd0ZmxDZmJaVXd6NU1mMUdmYTJtMEFNOCIsInkiOiJLQjdzSmtGUXlCOGpaSE85dm1XUzVMTkVDTDRpZDNPSk85SFg5Q2hOb25BIiwiYWxnIjoiRUNESC1FUyJ9XX0sImVuY3J5cHRlZF9yZXNwb25zZV9lbmNfdmFsdWVzX3N1cHBvcnRlZCI6WyJBMTI4R0NNIl19LCJyZXNwb25zZV9tb2RlIjoiZGNfYXBpLmp3dCJ9.-LExZpyxOuwtwu2l7fiDJL1mf5ZLTBEkVfXFQeLvp9A95qwUYqEsJ81vZEtztnNZHKhLwL8AeQsPDujW3EQUFg" }, "openid4vp-v1-multisigned": { - /* Canonical object coming soon */ + "signatures": [ + { + "signature": "__lsLh09iG2M569VWsm7r89pycGuhefGa66bbj7baitszgWYQkY_qELtqjdxioZ2sR2VulIHphc7qm9IhOOUpg", + "protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImRlbW8ta2V5LTEtZXMyNTYifQ" + }, + { + "signature": "Ra1GZSjOvJXDpO15Yy6hZzv-ZT-aLtCPdBt7_QNw2L-bDMRp64qgPzjDco4-w4DqvrTBWczsO9Za7gR768ks5G4ZzhnzCHnTyp3CqZJIo1ZpPNtVk6Pkk2xN5AqQx9idDzPmc57BCP6bE02iOcnTh4KUNfuZwW2Dmw5WWtMDr1aCpX_AEGsdc5rn7lSKCAtyF_mjrgLdHDS-i2jtnJGPxEtr586e9JvApQc_D-a1KKHN4iubNmerAZwhUks-ATM7rEnvvSGy9mDX9dQdAg_3Lrkha4B3Rtpmn8cq45mBII4xxt49rwi8VgWgd1gRBgwyQuycsiXpZwaWKmIxA7sqPw", + "protected": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImRlbW8ta2V5LTItcnMyNTYifQ" + }, + { + "signature": "h_ro8GMqMeq5C2e0oJqktenk1Yc5uO3plZxq-a4dl45jT_1jTONRpRmqrl_YakKtkPFoGfx7oavdi1_qdTcUCw", + "protected": "eyJhbGciOiJFZERTQSIsImtpZCI6ImRlbW8ta2V5LTMtZWRkc2EifQ" + } + ], + "payload": "eyJkY3FsX3F1ZXJ5Ijp7ImNyZWRlbnRpYWxzIjpbeyJpZCI6InBpZCIsImZvcm1hdCI6ImRjK3NkLWp3dCIsIm1ldGEiOnsidmN0X3ZhbHVlcyI6WyJ1cm46ZXVkaTpwaWQ6MSJdfSwiY2xhaW1zIjpbeyJwYXRoIjpbImZhbWlseV9uYW1lIl19LHsicGF0aCI6WyJnaXZlbl9uYW1lIl19XX1dfSwibm9uY2UiOiJHR0dSZGh3dzJURlFNNGR3NndnR2Mwc3VNTDQ5LS5ffiIsImNsaWVudF9tZXRhZGF0YSI6eyJ2cF9mb3JtYXRzX3N1cHBvcnRlZCI6eyJkYytzZC1qd3QiOnsic2Qtand0X2FsZ192YWx1ZXMiOlsiUlMyNTYiLCJSUzM4NCIsIlJTNTEyIiwiUFMyNTYiLCJQUzM4NCIsIlBTNTEyIiwiRVMyNTYiLCJFUzI1NksiLCJFUzM4NCIsIkVTNTEyIiwiRWREU0EiLCJFZDI1NTE5IiwiRWQ0NDgiXSwia2Itand0X2FsZ192YWx1ZXMiOlsiUlMyNTYiLCJSUzM4NCIsIlJTNTEyIiwiUFMyNTYiLCJQUzM4NCIsIlBTNTEyIiwiRVMyNTYiLCJFUzI1NksiLCJFUzM4NCIsIkVTNTEyIiwiRWREU0EiLCJFZDI1NTE5IiwiRWQ0NDgiXX19LCJqd2tzIjp7ImtleXMiOlt7Imt0eSI6IkVDIiwidXNlIjoiZW5jIiwiY3J2IjoiUC0yNTYiLCJraWQiOiJBNTQxSjV5VXFhemdFOFdCRmtJeWVoMk90Sy11ZHFVUl9PQzBrQjdsM29VIiwieCI6ImN3WXl1Uzk0aGNPdGNQbHJNTXRHdGZsQ2ZiWlV3ejVNZjFHZmEybTBBTTgiLCJ5IjoiS0I3c0prRlF5QjhqWkhPOXZtV1M1TE5FQ0w0aWQzT0pPOUhYOUNoTm9uQSIsImFsZyI6IkVDREgtRVMifV19LCJlbmNyeXB0ZWRfcmVzcG9uc2VfZW5jX3ZhbHVlc19zdXBwb3J0ZWQiOlsiQTEyOEdDTSJdfSwicmVzcG9uc2VfdHlwZSI6InZwX3Rva2VuIiwicmVzcG9uc2VfbW9kZSI6ImRjX2FwaS5qd3QiLCJPNExpNGJsOGpxamlteFV0IjoiVGFyWkRsVUNoTktoTENrdiJ9" }, /** @type MobileDocumentRequest **/ "org-iso-mdoc": { @@ -136,7 +230,7 @@ function makeCredentialOptionsFromConfig(config, mapping) { } /** @type {TRequest[]} */ - const allRequests = []; + const allRequests = []; allRequests.push(.../** @type {TRequest[]} */ (requests)); diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-create.tentative.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-create.tentative.https.html index 4a986630fb59..b34adc02eaf3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-create.tentative.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-create.tentative.https.html @@ -22,6 +22,19 @@ ); }, "navigator.credentials.create() calling the API without user activation should reject with NotAllowedError."); + promise_test(async (t) => { + assert_false( + navigator.userActivation.isActive, + "User activation should not be active", + ); + const options = makeCreateOptions({ data: BigInt(1) }); + await promise_rejects_dom( + t, + "NotAllowedError", + navigator.credentials.create(options), + ); + }, "navigator.credentials.create() with non-serializable data and no user activation should reject with NotAllowedError."); + promise_test(async (t) => { assert_false( navigator.userActivation.isActive, diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https-expected.txt index 1b84c65dbe31..883206e60529 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https-expected.txt @@ -1,5 +1,6 @@ PASS navigator.credentials.get() calling the API without user activation should reject with NotAllowedError. +FAIL navigator.credentials.get() with non-serializable data and no user activation should reject with NotAllowedError. promise_rejects_dom: function "function() { throw e; }" threw object "TypeError: Type error" that is not a DOMException NotAllowedError: property "code" is equal to undefined, expected 0 PASS navigator.credentials.get() with empty protocol array and no user activation needed should reject with TypeError. PASS navigator.credentials.get() with early abort does not consume user activation. PASS navigator.credentials.get() with late abort consumes user activation. diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https.html b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https.html index ab7f03a31812..516f9b4cc95b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https.html @@ -22,6 +22,19 @@ ); }, "navigator.credentials.get() calling the API without user activation should reject with NotAllowedError."); + promise_test(async (t) => { + assert_false( + navigator.userActivation.isActive, + "User activation should not be active", + ); + const options = makeGetOptions({ data: BigInt(1) }); + await promise_rejects_dom( + t, + "NotAllowedError", + navigator.credentials.get(options), + ); + }, "navigator.credentials.get() with non-serializable data and no user activation should reject with NotAllowedError."); + promise_test(async (t) => { assert_false( navigator.userActivation.isActive, diff --git a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/w3c-import.log index 13eacfa3902d..c0b02cb3882e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/w3c-import.log @@ -19,6 +19,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/allow-attribute-with-get.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-enabled-on-self-origin-by-permissions-policy.https.sub.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-enabled-on-self-origin-by-permissions-policy.https.sub.html.headers +/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create-non-fully-active.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.disabled-by-permissions-policy.https.sub.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.disabled-by-permissions-policy.https.sub.html.headers /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/create.tentative.https.html @@ -28,11 +29,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/digital-credentials-static-methods.tentative.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-enabled-on-self-origin-by-permissions-policy.https.sub.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-enabled-on-self-origin-by-permissions-policy.https.sub.html.headers +/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get-non-fully-active.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.disabled-by-permissions-policy.https.sub.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.disabled-by-permissions-policy.https.sub.html.headers -/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.tentative.https.html +/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/get.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/historical.any.js -/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-fully-active.https.html +/LayoutTests/imported/w3c/web-platform-tests/digital-credentials/non-secure-contexts.http.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/tsconfig.json /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-create.tentative.https.html /LayoutTests/imported/w3c/web-platform-tests/digital-credentials/user-activation-get.https.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/live-range-updates-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/live-range-updates-expected.txt index 3e5d91ac9acd..adfca3edb17a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/live-range-updates-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/live-range-updates-expected.txt @@ -2,12 +2,7 @@ RangeStartTarget Middle RangeEndTarget -FAIL moveBefore still results in range startContainer snapping up to parent when startContainer is moved assert_equals: startContainer updates during move expected Element node
    - - Midd... but got Element node RangeStartTarget -FAIL moveBefore still causes range startContainer to snap up to parent, when startContainer ancestor is moved assert_equals: startContainer still updates during move, to snap to parent expected Element node
    - - RangeEn... but got Element node RangeStartTarget -FAIL moveBefore still causes range endContainer to snap up to parent, when endContainer ancestor is moved assert_equals: endContainer still snaps up to parent after move expected Element node
    - RangeStartTa... but got Element node RangeEndTarget +PASS moveBefore still results in range startContainer snapping up to parent when startContainer is moved +PASS moveBefore still causes range startContainer to snap up to parent, when startContainer ancestor is moved +PASS moveBefore still causes range endContainer to snap up to parent, when endContainer ancestor is moved diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator-expected.txt new file mode 100644 index 000000000000..d121985ac1d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator-expected.txt @@ -0,0 +1,3 @@ + +PASS moveBefore() runs NodeIterator pre-remove steps + diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator.html b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator.html new file mode 100644 index 000000000000..77853b9b9839 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/moveBefore/moveBefore-nodeiterator.html @@ -0,0 +1,39 @@ + + + + + +NodeIterator + moveBefore() pre-remove steps + +
    +
    +
    +
    +
    +
    +
    + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any-expected.txt new file mode 100644 index 000000000000..4471325df263 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any-expected.txt @@ -0,0 +1,3 @@ + +PASS new Request(clone) preserves a ReadableStream body that came from clone() + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.html b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.html new file mode 100644 index 000000000000..9ec70b26b7dd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.html @@ -0,0 +1 @@ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.js b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.js new file mode 100644 index 000000000000..167715aeb985 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.js @@ -0,0 +1,22 @@ +// META: global=window,worker + +promise_test(async () => { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode("hello")); + controller.close(); + } + }); + + const r1 = new Request("https://example.com/", { method: "POST", body: stream, duplex: "half" }); + const r2 = r1.clone(); + assert_false(r2.bodyUsed, "clone should not be marked as used"); + assert_not_equals(r2.body, null, "clone should have a body"); + + // Constructing a new Request from the clone should preserve the body. + const r3 = new Request(r2); + assert_not_equals(r3.body, null, "Request constructed from clone should have a body"); + + const text = await r3.text(); + assert_equals(text, "hello", "body content should be preserved through clone() and new Request()"); +}, "new Request(clone) preserves a ReadableStream body that came from clone()"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker-expected.txt new file mode 100644 index 000000000000..4471325df263 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker-expected.txt @@ -0,0 +1,3 @@ + +PASS new Request(clone) preserves a ReadableStream body that came from clone() + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker.html new file mode 100644 index 000000000000..9ec70b26b7dd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-clone-readable-stream-body.any.worker.html @@ -0,0 +1 @@ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/focus/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/focus/WEB_FEATURES.yml new file mode 100644 index 000000000000..37a85ce6e8f4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/focus/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: focus-events + files: + - focus-event-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href-expected.txt new file mode 100644 index 000000000000..3b90bb038d78 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href-expected.txt @@ -0,0 +1,4 @@ +anchor tag + +PASS anchor element should remain focused after removing href attribute. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href.html b/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href.html new file mode 100644 index 000000000000..25ace9ff67f7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href.html @@ -0,0 +1,27 @@ + + + + + + +anchor tag + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/focus/synthetic-focus-event-crash.html b/LayoutTests/imported/w3c/web-platform-tests/focus/synthetic-focus-event-crash.html new file mode 100644 index 000000000000..1dacb4ceb79c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/focus/synthetic-focus-event-crash.html @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/focus/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/focus/w3c-import.log index b30d6d0dfe47..016d3f1eb89c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/focus/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/focus/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/focus/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/focus/activeelement-after-calling-window-focus.sub.html /LayoutTests/imported/w3c/web-platform-tests/focus/activeelement-after-focusing-different-site-iframe-contentwindow.html /LayoutTests/imported/w3c/web-platform-tests/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html @@ -26,6 +27,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/focus/activeelement-after-immediately-focusing-same-site-iframe.html /LayoutTests/imported/w3c/web-platform-tests/focus/activeelement-after-nested-loses-focus.html /LayoutTests/imported/w3c/web-platform-tests/focus/ancestor-activeelement-after-child-lose-focus.html +/LayoutTests/imported/w3c/web-platform-tests/focus/anchor-remove-href.html /LayoutTests/imported/w3c/web-platform-tests/focus/cross-origin-ancestor-activeelement-after-child-lose-focus.sub.html /LayoutTests/imported/w3c/web-platform-tests/focus/focus-already-focused-iframe-deep-different-site.html /LayoutTests/imported/w3c/web-platform-tests/focus/focus-already-focused-iframe-deep-same-site.html @@ -59,3 +61,4 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/focus/iframe-focuses-parent-same-site.html /LayoutTests/imported/w3c/web-platform-tests/focus/nested-focus-within-iframe-focus-event.html /LayoutTests/imported/w3c/web-platform-tests/focus/scroll-matches-focus.html +/LayoutTests/imported/w3c/web-platform-tests/focus/synthetic-focus-event-crash.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any-expected.txt new file mode 100644 index 000000000000..f5c917f72588 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any-expected.txt @@ -0,0 +1,4 @@ + +PASS Reading request.result after the record is deleted still produces a usable handle. +PASS Reading request.result after the database is closed still produces a usable handle. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.html b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.js b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.js new file mode 100644 index 000000000000..938e990b0fe5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.js @@ -0,0 +1,59 @@ +// META: script=resources/test-helpers.js +// META: script=resources/sandboxed-fs-test-helpers.js +// META: script=resources/messaging-helpers.js +// META: script=/IndexedDB/resources/support-promises.js + +'use strict'; + +// Regression test: deserializing a FileSystemHandle out of an IndexedDB result must +// still work after the originating record has been deleted, since `request.result` +// is only materialized when JS first reads it. + +directory_test(async (t, root_dir) => { + const handle = await createFileWithContents('file', 'contents', root_dir); + + const db = await createDatabase(t, db => { + db.createObjectStore('store'); + }); + + let tx = db.transaction('store', 'readwrite'); + await promiseForRequest(t, tx.objectStore('store').put(handle, 'key')); + await promiseForTransaction(t, tx); + + tx = db.transaction('store', 'readwrite'); + const store = tx.objectStore('store'); + const getRequest = store.get('key'); + await requestWatcher(t, getRequest).wait_for('success'); + + await promiseForRequest(t, store.delete('key')); + await promiseForTransaction(t, tx); + + const retrieved = getRequest.result; + assert_true(await handle.isSameEntry(retrieved)); + const file = await retrieved.getFile(); + assert_equals(await file.text(), 'contents'); +}, 'Reading request.result after the record is deleted still produces a usable handle.'); + +directory_test(async (t, root_dir) => { + const handle = await createFileWithContents('file', 'contents', root_dir); + + const db = await createDatabase(t, db => { + db.createObjectStore('store'); + }); + + const tx = db.transaction('store', 'readwrite'); + await promiseForRequest(t, tx.objectStore('store').put(handle, 'key')); + await promiseForTransaction(t, tx); + + const readTx = db.transaction('store', 'readonly'); + const getRequest = readTx.objectStore('store').get('key'); + await requestWatcher(t, getRequest).wait_for('success'); + await promiseForTransaction(t, readTx); + + db.close(); + + const retrieved = getRequest.result; + assert_true(await handle.isSameEntry(retrieved)); + const file = await retrieved.getFile(); + assert_equals(await file.text(), 'contents'); +}, 'Reading request.result after the database is closed still produces a usable handle.'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker-expected.txt new file mode 100644 index 000000000000..f5c917f72588 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker-expected.txt @@ -0,0 +1,4 @@ + +PASS Reading request.result after the record is deleted still produces a usable handle. +PASS Reading request.result after the database is closed still produces a usable handle. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.worker.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any-expected.txt index 220411a4f8e8..bf3c7aa04103 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any-expected.txt @@ -1,8 +1,8 @@ -FAIL Store handle in IndexedDB and read from pending transaction. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB and read from new transaction. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handles and blobs in IndexedDB. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB and read using a cursor. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB using inline keys. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store and retrieve the root directory from IndexedDB. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." +PASS Store handle in IndexedDB and read from pending transaction. +PASS Store handle in IndexedDB and read from new transaction. +PASS Store handles and blobs in IndexedDB. +PASS Store handle in IndexedDB and read using a cursor. +PASS Store handle in IndexedDB using inline keys. +PASS Store and retrieve the root directory from IndexedDB. diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any.worker-expected.txt index 220411a4f8e8..bf3c7aa04103 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any.worker-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any.worker-expected.txt @@ -1,8 +1,8 @@ -FAIL Store handle in IndexedDB and read from pending transaction. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB and read from new transaction. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handles and blobs in IndexedDB. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB and read using a cursor. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store handle in IndexedDB using inline keys. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." -FAIL Store and retrieve the root directory from IndexedDB. promise_test: Unhandled rejection with value: object "DataCloneError: The object can not be cloned." +PASS Store handle in IndexedDB and read from pending transaction. +PASS Store handle in IndexedDB and read from new transaction. +PASS Store handles and blobs in IndexedDB. +PASS Store handle in IndexedDB and read using a cursor. +PASS Store handle in IndexedDB using inline keys. +PASS Store and retrieve the root directory from IndexedDB. diff --git a/LayoutTests/imported/w3c/web-platform-tests/fs/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/fs/w3c-import.log index 8deaac1be810..3c01208f49b5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/fs/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/fs/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB-deferred-deserialization.https.any.js /LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-IndexedDB.https.any.js /LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-buckets.https.any.js /LayoutTests/imported/w3c/web-platform-tests/fs/FileSystemBaseHandle-getUniqueId.https.any.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/gpc/sec-gpc.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/gpc/sec-gpc.https-expected.txt index 8431837dcf5d..854c9b14e099 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/gpc/sec-gpc.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/gpc/sec-gpc.https-expected.txt @@ -5,10 +5,16 @@ PASS Expected Sec-GPC value (true) is on the script fetch PASS Expected Sec-GPC value (true) is on the iframe fetch PASS Expected Sec-GPC value (true) is on the framed image fetch PASS Expected Sec-GPC value (true) is on the framed script fetch +PASS Expected Sec-GPC value (true) is on the worker fetch +PASS Expected Sec-GPC value (true) is on the sharedworker fetch +PASS Expected Sec-GPC value (true) is on the serviceworker fetch PASS Expected Sec-GPC value (false) is on the document fetch PASS Expected Sec-GPC value (false) is on the image fetch PASS Expected Sec-GPC value (false) is on the script fetch PASS Expected Sec-GPC value (false) is on the iframe fetch PASS Expected Sec-GPC value (false) is on the framed image fetch PASS Expected Sec-GPC value (false) is on the framed script fetch +PASS Expected Sec-GPC value (false) is on the worker fetch +PASS Expected Sec-GPC value (false) is on the sharedworker fetch +PASS Expected Sec-GPC value (false) is on the serviceworker fetch diff --git a/LayoutTests/imported/w3c/web-platform-tests/gpc/support/getGPC.py b/LayoutTests/imported/w3c/web-platform-tests/gpc/support/getGPC.py index 1d280a6cafce..06ddd90dfee3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/gpc/support/getGPC.py +++ b/LayoutTests/imported/w3c/web-platform-tests/gpc/support/getGPC.py @@ -28,6 +28,7 @@ def main(request, response):
    - """ if destination == "document" else "") + f""" - + """ if destination == "document" else "") + (f' \n' if destination != "document" else "") + """ """ diff --git a/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article-expected.txt new file mode 100644 index 000000000000..47f94ebabace --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article-expected.txt @@ -0,0 +1,4 @@ +x + +PASS el-aside-in-prefixed-article + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article.html b/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article.html new file mode 100644 index 000000000000..43378a5c9a27 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html-aam/aside-in-prefixed-article.html @@ -0,0 +1,33 @@ + + + +HTML-AAM: aside nested in a prefixed article ancestor + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.js new file mode 100644 index 000000000000..71d3d386857c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.js @@ -0,0 +1,26 @@ +// META: title=Ensure that open broadcastchannel does not block bfcache. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + // Open a window with noopener so that BFCache will work. + const rc1 = await rcHelper.addWindow( + /*extraConfig=*/ { + origin: 'HTTP_ORIGIN', + scripts: [], + headers: [], + }, + /*options=*/ {features: 'noopener'}); + await rc1.executeScript(() => { + window.foo = new BroadcastChannel('foo'); + }); + await assertBFCacheEligibility(rc1, /*shouldRestoreFromBfcache=*/ true); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.js new file mode 100644 index 000000000000..b7ebd480936a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.js @@ -0,0 +1,44 @@ +// META: title=BroadcastChannel messages dispatched to dedicated worker in bfcache should be queued. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js + +'use strict'; + +// Ensure that broadcast channel messages sent to a dedicated +// worker in bfcache are queued and dispatched upon restore. +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + // Open a window with noopener so that BFCache will work. + const rc1 = await rcHelper.addWindow( + /*extraConfig=*/ {}, /*options=*/ {features: 'noopener'}); + let workerVar; + const worker = await rc1.addWorker( + workerVar, + { + scripts: ['../resources/worker-with-broadcastchannel.js'], + }, + ); + await assertSimplestScriptRuns(worker); + + await prepareForBFCache(rc1); + const newRemoteContextHelper = await rc1.navigateToNew(); + await assertSimplestScriptRuns(newRemoteContextHelper); + + // Send a message to a dedicated worker in bfcache. + let channel = new BroadcastChannel('foo'); + channel.postMessage('bar'); + + await newRemoteContextHelper.historyBack(); + // Make sure that rc1 gets restored without getting evicted. Messages + // while in bfcache should be queued. + await assertImplementsBFCacheOptional(rc1); + + // A message should arrive upon bfcache restore. + await worker.executeScript(() => { + return waitForEventsPromise(1); + }); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window-expected.txt new file mode 100644 index 000000000000..da824b9d72f9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window-expected.txt @@ -0,0 +1,3 @@ + +PASS BroadcastChannel message while in bfcache should evict the entry. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.js new file mode 100644 index 000000000000..113485574c16 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.js @@ -0,0 +1,38 @@ +// META: title=BroadcastChannel message while in bfcache should evict the entry. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + // Open a window with noopener so that BFCache will work. + const rc1 = await rcHelper.addWindow( + /*extraConfig=*/ {}, /*options=*/ {features: 'noopener'}); + await rc1.executeScript(() => { + const channel = new BroadcastChannel('foo'); + channel.addEventListener('message', event => { + channel.postMessage('Message received: ' + event.data); + }); + }); + await prepareForBFCache(rc1); + const newRemoteContextHelper = await rc1.navigateToNew(); + await assertSimplestScriptRuns(newRemoteContextHelper); + + // Post a message to a channel in bfcache. This should trigger eviction. + const channel = new BroadcastChannel('foo'); // Access shared channel + channel.postMessage('Sending a message should evict a bfcache entry.'); + + await newRemoteContextHelper.historyBack(); + + // It's possible that the pages with open broadcastchannel are not allowed + // into bfcache. Set preconditionFailReasons to catch that case. Otherwise + // expect the eviction reason. + await assertNotRestoredFromBFCache( + rc1, ['broadcastchannel-message'], + /*preconditonFailReasons=*/['broadcastchannel']); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/w3c-import.log new file mode 100644 index 000000000000..d782176feb71 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/w3c-import.log @@ -0,0 +1,19 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/broadcastchannel.window.js +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/dedicatedworker.tentative.window.js +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/broadcastchannel/evict-on-message.tentative.window.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.js new file mode 100644 index 000000000000..6676d5c44fb2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.js @@ -0,0 +1,49 @@ +// META: title=BFCache is allowed for a page with SharedWorker if another client is active. +// META: script=/common/utils.js +// META: script=/common/dispatcher/dispatcher.js +// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js +// META: timeout=long + +'use strict'; + +// Check whether the page is BFCached when there is another active client for +// the shared worker. +runBfcacheTest( + { + funcBeforeNavigation: async () => { + globalThis.worker = new SharedWorker('../resources/echo-worker.js'); + await WorkerHelper.pingWorker(globalThis.worker); + + // Create another client in a new window. + const workerUrl = + new URL('../resources/echo-worker.js', window.location.href).href; + const helperPageContent = ` + + `; + const blob = new Blob([helperPageContent], {type: 'text/html'}); + window.open(URL.createObjectURL(blob), '_blank', 'noopener'); + await new Promise(resolve => { + const bc = new BroadcastChannel('worker_ready'); + bc.onmessage = e => { + if (e.data === 'ready') { + bc.close(); + resolve(); + } + }; + }); + }, + funcAfterAssertion: async (pageA) => { + // Confirm that the worker is still there. + assert_equals( + await pageA.execute_script( + () => WorkerHelper.pingWorker(globalThis.worker)), + 'PASS', + 'SharedWorker should still work after restored from BFCache'); + } + }, + 'Eligibility: shared workers with another active client in a separate window'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/w3c-import.log index 67140f311c0b..c0e654d4e953 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/w3c-import.log @@ -20,4 +20,5 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/inflight-fetch-2.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/inflight-fetch-cors.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/inflight-fetch-redirects.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker-active-client.window.js /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/eligibility/shared-worker.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window-expected.txt new file mode 100644 index 000000000000..2cb385425917 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window-expected.txt @@ -0,0 +1,3 @@ + +FAIL Assure microtasks posted by pagehide event handler are dispatched assert_true: expected true got false + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.js new file mode 100644 index 000000000000..3ffbead9b192 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.js @@ -0,0 +1,28 @@ +// META: title=Assure microtasks posted by pagehide event handler are dispatched as page is BFCached +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=./resources/test-helper.js + +'use strict'; + +promise_test(async t => { + const uuid = token(); + const url = remoteExecutorUrl(uuid, {protocol: 'http:'}); + const win = window.open(url, '_blank', 'noopener'); + const context = new RemoteContext(uuid); + + // Navigate within the same eval, as (1) we can't navigate externally + // because of potential race against the eval, and (2) we can't navigate + // as a separate eval step as it would block on this one returning, + // which would only happen upon `pagehide`. + const {persisted} = await context.execute_script( + () => new Promise(resolve => { + window.addEventListener('pagehide', async (event) => { + await Promise.resolve(); // ... so the rest will run as a microtask. + resolve({persisted: event.persisted}); + }, false); + location.href += '&navigated'; + })); + + assert_true(persisted); // Validate we're BFCached. +}, 'Assure microtasks posted by pagehide event handler are dispatched'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/disable_bfcache.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/disable_bfcache.js index dea70ef4bdf1..148d5c4420e8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/disable_bfcache.js +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/disable_bfcache.js @@ -1,15 +1,11 @@ -// Try to disable BFCache by acquiring and never releasing a Web Lock. -// This requires HTTPS. -// Note: This is a workaround depending on non-specified WebLock+BFCache -// behavior, and doesn't work on Safari. We might want to introduce a -// test-only BFCache-disabling API instead in the future. +// Try to disable BFCache by using the Keyboard Lock API. +// Note: This is a workaround, and we might want to introduce a test-only +// BFCache-disabling API instead in the future. // https://github.com/web-platform-tests/wpt/issues/16359#issuecomment-795004780 // https://crbug.com/1298336 window.disableBFCache = () => { return new Promise(resolve => { - navigator.locks.request("disablebfcache", () => { - resolve(); - return new Promise(() => {}); - }); + navigator.keyboard.lock(); + resolve(); }); }; diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js index a1d18d108e80..cd5b05a1d340 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js @@ -105,7 +105,7 @@ function runEventTest(params, description) { runBfcacheTest(params, description); } -async function navigateAndThenBack(pageA, pageB, urlB, +async function navigateAndThenBack(pageA, pageB, urlB, scripts = [], funcBeforeBackNavigation, argsBeforeBackNavigation) { await pageA.execute_script( @@ -118,6 +118,16 @@ async function navigateAndThenBack(pageA, pageB, urlB, ); await pageB.execute_script(waitForPageShow); + + for (const src of scripts) { + await pageB.execute_script((src) => { + const script = document.createElement("script"); + script.src = src; + document.head.append(script); + return new Promise(resolve => script.onload = resolve); + }, [src]); + } + if (funcBeforeBackNavigation) { await pageB.execute_script(funcBeforeBackNavigation, argsBeforeBackNavigation); @@ -172,7 +182,7 @@ function runBfcacheTest(params, description) { await pageA.execute_script(params.funcBeforeNavigation, params.argsBeforeNavigation); - await navigateAndThenBack(pageA, pageB, urlB, + await navigateAndThenBack(pageA, pageB, urlB, params.scripts, params.funcBeforeBackNavigation, params.argsBeforeBackNavigation); @@ -191,33 +201,33 @@ function runBfcacheTest(params, description) { // Call clients.claim() on the service worker async function claim(t, worker) { const channel = new MessageChannel(); - const saw_message = new Promise(function(resolve) { + const sawMessage = new Promise(function(resolve) { channel.port1.onmessage = t.step_func(function(e) { assert_equals(e.data, 'PASS', 'Worker call to claim() should fulfill.'); resolve(); }); }); worker.postMessage({type: "claim", port: channel.port2}, [channel.port2]); - await saw_message; + await sawMessage; } // Assigns the current client to a local variable on the service worker. async function storeClients(t, worker) { const channel = new MessageChannel(); - const saw_message = new Promise(function(resolve) { + const sawMessage = new Promise(function(resolve) { channel.port1.onmessage = t.step_func(function(e) { assert_equals(e.data, 'PASS', 'storeClients'); resolve(); }); }); worker.postMessage({type: "storeClients", port: channel.port2}, [channel.port2]); - await saw_message; + await sawMessage; } // Call storedClients.postMessage("") on the service worker async function postMessageToStoredClients(t, worker) { const channel = new MessageChannel(); - const saw_message = new Promise(function(resolve) { + const sawMessage = new Promise(function(resolve) { channel.port1.onmessage = t.step_func(function(e) { assert_equals(e.data, 'PASS', 'postMessageToStoredClients'); resolve(); @@ -225,5 +235,5 @@ async function postMessageToStoredClients(t, worker) { }); worker.postMessage({type: "postMessageToStoredClients", port: channel.port2}, [channel.port2]); - await saw_message; + await sawMessage; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js index ad2119b73856..1791ef0c1880 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js @@ -45,9 +45,9 @@ function sorted(s) { // as UAs might block bfcache for their specific reasons. function matchReasons(expectedNotRestoredReasonsSet, notRestoredReasonsSet) { const missing = setMinus( - expectedNotRestoredReasonsSet, notRestoredReasonsSet, 'Missing reasons'); + expectedNotRestoredReasonsSet, notRestoredReasonsSet); const extra = setMinus( - notRestoredReasonsSet, expectedNotRestoredReasonsSet, 'Extra reasons'); + notRestoredReasonsSet, expectedNotRestoredReasonsSet); assert_true(missing.size == 0, `Expected: ${sorted(expectedNotRestoredReasonsSet)}\n` + `Got: ${sorted(notRestoredReasonsSet)}\n` + `Missing: ${sorted(missing)}\n` + @@ -77,8 +77,11 @@ function extractReason(reasonSet) { // If the API is not available, the function will terminate instead of marking // the assertion failed. // Call `prepareForBFCache()` before navigating away to call this function. +// `preconditionFailReasons` is a set of reasons that could be reported but +// should PRECONDITION_FAIL if so. If `preconditionFailReasons` are reported, +// this function will not check if `notRestoredReasons` are reported. async function assertNotRestoredFromBFCache( - remoteContextHelper, notRestoredReasons) { + remoteContextHelper, notRestoredReasons, preconditionFailReasons = null) { var beforeBFCache = await getBeforeBFCache(remoteContextHelper); assert_equals(beforeBFCache, undefined, 'document unexpectedly BFCached'); @@ -107,14 +110,33 @@ async function assertNotRestoredFromBFCache( // Flatten the reasons from the main frame and all the child frames. const collectReason = (node) => { - for (let reason of node.reasons) { - notRestoredReasonsSet.add(reason.reason); + // Fenced frames do not have a 'reasons' or 'children' property. + if (node.reasons) { + for (let reason of node.reasons) { + notRestoredReasonsSet.add(reason.reason); + } } - for (let child of node.children) { - collectReason(child); + if (node.children) { + for (let child of node.children) { + collectReason(child); + } } }; collectReason(result); + + // Check for preconditionFailReasons if set. + if (preconditionFailReasons) { + let preconditionFailReasonsSet = new Set(preconditionFailReasons); + const missing = setMinus( + preconditionFailReasonsSet, notRestoredReasonsSet); + const extra = setMinus( + notRestoredReasonsSet, preconditionFailReasonsSet); + // preconditionFailReasons were reported. PRECONDION_FAIL here. + assert_implements_optional( + !(missing.size == 0 && extra.size == 0), + 'Precondition fail reasons are reported.'); + } + matchReasons(expectedNotRestoredReasonsSet, notRestoredReasonsSet); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/w3c-import.log index da8e8d07a99e..03289541de93 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/w3c-import.log @@ -26,3 +26,4 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/slow.py /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/worker-helper.js +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/worker-with-broadcastchannel.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/worker-with-broadcastchannel.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/worker-with-broadcastchannel.js new file mode 100644 index 000000000000..e4126b6ebdbd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/resources/worker-with-broadcastchannel.js @@ -0,0 +1,19 @@ +let messages = []; +const channel = new BroadcastChannel('foo'); // Access shared channel + +channel.addEventListener('message', event => { + messages.push(event.data); +}); + +function waitForEventsPromise(count) { + return new Promise(resolve => { + function checkMessages() { + if (messages.length >= count) { + channel.removeEventListener('message', checkMessages); // Cleanup + resolve(messages.length); + } + } + checkMessages(); + channel.addEventListener('message', checkMessages); + }); +} \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/w3c-import.log index 3d0d2bc7dc37..a60f9e4cb4be 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/w3c-import.log @@ -17,6 +17,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/README.md /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/events.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/focus.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pagehide-event-handler-microtasks.window.js /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/pushstate.https.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/service-worker-client-postmessage.https.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-claim.https.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/WEB_FEATURES.yml new file mode 100644 index 000000000000..3b9eb56c20ae --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/WEB_FEATURES.yml @@ -0,0 +1,9 @@ +features: +- name: history + files: + - "*" + # keep exclusions synced with mappings below + - "!hashchange_event.html" +- name: hashchange + files: + - hashchange_event.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html index 5cbab71a5eaa..ed50b9e82f7b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html @@ -8,18 +8,38 @@ log = function(t) {l.textContent += ("\n" + t)} var navigated = false; var steps = [ - () => f.src = "browsing_context_name-1.html", + () => { + opener.assert_equals(history.length, 1, "first history.length"); + f.src = "browsing_context_name-1.html"; + }, () => { navigated = true; opener.assert_equals(f.contentWindow.name, "test", "Initial load"); + opener.assert_equals(history.length, 1, "second history.length"); + setTimeout(next, 0); + }, + () => { + opener.assert_equals(f.contentWindow.name, "test", "Initial load"); + opener.assert_equals(history.length, 1, "third history.length"); f.src = "browsing_context_name-2.html" }, () => { opener.assert_equals(f.contentWindow.name, "test1"); - opener.assert_equals(history.length, 2); - history.back() + opener.assert_equals(history.length, 2, "fourth history.length"); + setTimeout(next, 0); + }, + () => { + opener.assert_equals(f.contentWindow.name, "test1"); + opener.assert_equals(history.length, 2, "fifth history.length"); + history.back(); + }, + () => { + opener.assert_equals(history.length, 2, "sixth history.length"); + opener.assert_equals(f.contentWindow.name, "test1", "After navigation"); + setTimeout(next, 0); }, () => { + opener.assert_equals(history.length, 2, "seventh history.length"); opener.assert_equals(f.contentWindow.name, "test1", "After navigation"); t.done(); } @@ -29,7 +49,10 @@ onload = () => { log("page load"); - f.onload = () => {log("iframe onload"); next()}; + f.onload = () => { + log("iframe onload"); + next(); + }; setTimeout(next, 0); }; diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-expected.txt index 86fffcacf3f7..e0eebf61cc41 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-expected.txt @@ -3,8 +3,13 @@ page load Step 1 iframe onload Step 2 -iframe onload Step 3 +iframe onload +Step 4 +Step 5 +iframe onload +Step 6 +Step 7 -FAIL Retaining window.name on history traversal assert_equals: expected 2 but got 1 +PASS Retaining window.name on history traversal diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https-expected.txt new file mode 100644 index 000000000000..944eb1c7ac04 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https-expected.txt @@ -0,0 +1,4 @@ + +FAIL A navigation's initiator origin and referrer are stored in the document state and used in the document repopulation case assert_equals: Same-origin forward history navigation to a document whose original initiator was cross-site, ends up with Sec-Fetch-Dest: cross-site header expected "cross-site" but got "none" +FAIL A navigation's initiator origin and referrer are stored in the document state and used on location.reload() assert_equals: Same-origin forward history navigation to a document whose original initiator was cross-site, ends up with Sec-Fetch-Dest: cross-site header expected "cross-site" but got "same-origin" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html new file mode 100644 index 000000000000..f03efc3b6583 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html @@ -0,0 +1,133 @@ + + +Test the properties of a session history entry's document state + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/WEB_FEATURES.yml new file mode 100644 index 000000000000..d99ac1ed9f0f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/WEB_FEATURES.yml @@ -0,0 +1,13 @@ +features: +- name: history + files: + - pushState-inside-popstate.html +- name: hashchange + files: + - after-load-hash* + - after-load-pushState.html + - after-load-replaceState.html + - before-load-hash* + - before-load-pushState.html + - before-load-replaceState.html + - same-document-traverse-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-expected.txt index b3aa9d7c4e38..08ca3efaa4c4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-expected.txt @@ -1,3 +1,3 @@ -FAIL when changing hash, before load assert_array_equals: lengths differ, expected array ["popstate", "hashchange", "load"] length 3, got ["popstate", "load"] length 2 +PASS when changing hash, before load diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice-expected.txt index f8c4a3fcd1c0..37903c1e3fbd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice-expected.txt @@ -1,3 +1,3 @@ -FAIL when changing hash twice, before load assert_array_equals: lengths differ, expected array ["popstate", "popstate", "hashchange", "hashchange", "load"] length 5, got ["popstate", "popstate", "load"] length 3 +PASS when changing hash twice, before load diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html index 7c8df118437d..7c3bc4870000 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html @@ -4,26 +4,35 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html index 97c4636fad7c..ccbb37e58c95 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html @@ -4,24 +4,33 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/w3c-import.log index 4fd450db1fab..597cf0b6d908 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/after-load-hash-twice.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/after-load-hash.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/event-order/after-load-pushState.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string-expected.txt new file mode 100644 index 000000000000..7408255908b9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string-expected.txt @@ -0,0 +1,5 @@ + +PASS URL has no hash +PASS changing the hash from an empty string to an empty string does not trigger a popstate event +PASS changing the hash from an empty string to an empty string does not trigger a hashchange event + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string.html new file mode 100644 index 000000000000..e17c77ef6fb4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string.html @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire-expected.txt new file mode 100644 index 000000000000..2a75ed597c1a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire-expected.txt @@ -0,0 +1,3 @@ + +PASS Setting the same location.hash twice must not fire hashchange the second time + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire.html new file mode 100644 index 000000000000..d9b80c618fd7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire.html @@ -0,0 +1,25 @@ + + +hashchange is not fired when setting the same fragment + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/WEB_FEATURES.yml new file mode 100644 index 000000000000..43a365976760 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: history + files: "**" \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore-iframe.html new file mode 100644 index 000000000000..f98cb61ad32b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore-iframe.html @@ -0,0 +1,52 @@ + +pagereveal event in iframe fires and in correct order on restoration from BFCache + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html new file mode 100644 index 000000000000..fae06df00f67 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html @@ -0,0 +1,70 @@ + +pagereveal event fires and in correct order on restoration from BFCache + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-expected.txt new file mode 100644 index 000000000000..0de8a317ec20 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-expected.txt @@ -0,0 +1,3 @@ + +PASS pagereveal event fires and in correct order on new-document navigation + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe-expected.txt new file mode 100644 index 000000000000..852e5445ead2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe-expected.txt @@ -0,0 +1,4 @@ + + +PASS pagereveal event fires and in correct order on new-document navigation in an iframe + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe.html new file mode 100644 index 000000000000..b982025bc78c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe.html @@ -0,0 +1,35 @@ + +pagereveal event fires and in correct order on new-document navigation in an iframe + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html new file mode 100644 index 000000000000..21df2d96f836 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html @@ -0,0 +1,17 @@ + +pagereveal event fires and in correct order on new-document navigation + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https-expected.txt new file mode 100644 index 000000000000..113d1734020c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https-expected.txt @@ -0,0 +1,3 @@ + +FAIL pagereveal event fires and in correct order on prerender activation promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: PrerenderChannel" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https.html new file mode 100644 index 000000000000..b281b2b08810 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https.html @@ -0,0 +1,40 @@ + +pagereveal event fires and in correct order on prerender activation + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/iframe.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/iframe.html new file mode 100644 index 000000000000..a1c1c6233282 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/iframe.html @@ -0,0 +1,48 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html new file mode 100644 index 000000000000..78989adc1729 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html @@ -0,0 +1,74 @@ + +pagereveal event fires and in correct order on prerender activation (popup) + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/w3c-import.log new file mode 100644 index 000000000000..f996edfd896a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/w3c-import.log @@ -0,0 +1,18 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/iframe.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/w3c-import.log new file mode 100644 index 000000000000..b1498105955a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/w3c-import.log @@ -0,0 +1,22 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/WEB_FEATURES.yml +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore-iframe.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation-iframe.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.https.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/WEB_FEATURES.yml new file mode 100644 index 000000000000..43a365976760 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: history + files: "**" \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/w3c-import.log index 7a7f9ec5ce97..752f56976c91 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/w3c-import.log @@ -14,6 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resume-timer-on-history-back.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-basic.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html index a41fabf9686c..05b1dbf4b712 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html @@ -21,6 +21,7 @@ assert_true(e instanceof PopStateEvent, "is PopStateEvent"); assert_false(e.bubbles, "bubbles"); assert_false(e.cancelable, "cancelable"); + assert_not_equals(e.hasUAVisualTransition, undefined); states.push(e.state); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url-expected.txt index fbd72690cd71..a7ed043699b3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url-expected.txt @@ -1,3 +1,3 @@ -FAIL Test same-URL navigation and its effects on history assert_equals: expected 1 but got 2 +PASS Test same-URL navigation and its effects on history diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html index d7037343d7da..ac0ef4d7aa0e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/same-url.html @@ -6,33 +6,46 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/WEB_FEATURES.yml new file mode 100644 index 000000000000..43a365976760 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: history + files: "**" \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/w3c-import.log index 043893cec44c..b7a103bff005 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/w3c-import.log @@ -14,5 +14,6 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/consecutive-srcdoc.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/srcdoc/srcdoc-history-entries.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/w3c-import.log index 7a749901867e..af01d58802ba 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/w3c-import.log @@ -18,6 +18,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/001-2.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/001.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/WEB_FEATURES.yml /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/api-availability.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name-1.html @@ -29,7 +30,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/events.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hash-empty-string.html +/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange-same-fragment-does-not-fire.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/hashchange_event.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/history-traversal-navigate-parent-while-child-loading.html /LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window-expected.txt new file mode 100644 index 000000000000..dfc98f05c8d8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window-expected.txt @@ -0,0 +1,3 @@ + +FAIL Child that immediately stops window during loading does not crash assert_equals: expected "http://web-platform.test:8800/html/browsers/browsing-the-web/navigating-across-documents/resources/child-immediately-stops-during-loading.html" but got "http://web-platform.test:8800/common/blank.html" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.js b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.js new file mode 100644 index 000000000000..e2dafe4a22a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/abort-document-window-stop.sub.window.js @@ -0,0 +1,17 @@ +// META: title=Child that immediately stops window during loading does not crash +// META: script=../resources/helpers.js + +// This test reproduces Servo issue https://github.com/servo/servo/issues/44720 + +async_test((test) => { + addIframe().then(iframe => { + iframe.contentWindow.addEventListener("unload", test.step_func_done(() => { + assert_equals( + iframe.contentWindow.location.href, + "http://{{hosts[][]}}:{{ports[http][0]}}/html/browsers/browsing-the-web/navigating-across-documents/resources/child-immediately-stops-during-loading.html" + ); + })); + + iframe.src = "./resources/child-immediately-stops-during-loading.html"; + }); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-cross-frame.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-cross-frame.html index d647e6ad0646..c8dcc143c215 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-cross-frame.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-cross-frame.html @@ -24,11 +24,12 @@ `; const frameStartingURL = codeInjectorURL(frameStartingCode); + const frameBeforeLoadedMessagePromise = waitForMessage(); const frame = insertIframe(t, frameStartingURL, "the-frame"); t.add_cleanup(() => frame.remove()); // helps avoid waiting for the slow load to finish the tests assert_equals(history.length, startingHistoryLength, "Inserting frame must not change history.length"); - const frameBeforeLoadedMessage = await waitForMessage(); + const frameBeforeLoadedMessage = await frameBeforeLoadedMessagePromise; assert_equals(frameBeforeLoadedMessage.historyLength, startingHistoryLength, "frame's starting history.length"); assert_equals(frameBeforeLoadedMessage.locationHref, frame.src, "frame's starting location.href"); assert_equals(frame.contentWindow.onloadFired, undefined, "frame's onload not fired yet"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/resources/child-immediately-stops-during-loading.html b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/resources/child-immediately-stops-during-loading.html new file mode 100644 index 000000000000..addc1659cb93 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/resources/child-immediately-stops-during-loading.html @@ -0,0 +1,3 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-ref.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-ref.html new file mode 100644 index 000000000000..9e5c3cf8032a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-ref.html @@ -0,0 +1,4 @@ + + +CSS test reference + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted.html new file mode 100644 index 000000000000..8bc50fda9373 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted.html @@ -0,0 +1,17 @@ + + +Select element rendering after adoption + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/w3c-import.log index 2ce8f84ba76d..4a1f60ca1298 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/w3c-import.log @@ -26,6 +26,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-line-height-expected.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-line-height-ref.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-1-line-height.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-expected.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted-ref.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-adopted.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-button-min-height-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-button-min-height-001-ref.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/replaced-elements/the-select-element/select-button-min-height-001.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/w3c-import.log index b8d6d3048ff6..df9301662dfc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/w3c-import.log @@ -14,6 +14,10 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/cdata-001-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/cdata-001.xhtml +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/cdata-002-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/cdata-002.xhtml /LayoutTests/imported/w3c/web-platform-tests/html/rendering/dimension-attributes.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/pixel-length-attributes.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/unmapped-attributes.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number-expected.txt index 88868e49b286..5fd65fc5a356 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number-expected.txt @@ -8,4 +8,5 @@ PASS number: Explicit height and auto width PASS number: Text caret is taller than the placeholder PASS number: Text caret is shorter than the placeholder PASS number: Update field-sizing property dynamically +PASS number: all content is visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number.html index 6056f9320a5e..6015a5b27162 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/field-sizing-input-number.html @@ -129,14 +129,20 @@ }, `${type}: Text caret is shorter than the placeholder`); test(() => { - const container = document.querySelector('#container'); - container.innerHTML = ``; - const element = container.firstChild; - const w = element.offsetWidth; - element.classList.add('disable-default'); - assert_less_than(element.offsetWidth, w); + const container = document.querySelector('#container'); + container.innerHTML = ``; + const element = container.firstChild; + const w = element.offsetWidth; + element.classList.add('disable-default'); + assert_less_than(element.offsetWidth, w); }, `${type}: Update field-sizing property dynamically`); + test(() => { + const container = document.querySelector('#container'); + container.innerHTML = ``; + const element = container.firstChild; + assert_equals(element.clientWidth, element.scrollWidth, "Shouldn't scroll"); + }, `${type}: all content is visible`); }); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom-expected.txt new file mode 100644 index 000000000000..eb44086163ee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom-expected.txt @@ -0,0 +1,12 @@ + + +FAIL has a shadow tree with no slots assert_equals: child should be outside the flat tree expected 0 but got 441 +FAIL has a shadow tree with no slots assert_equals: child should be outside the flat tree expected 0 but got 441 +FAIL has a shadow tree with no slots assert_equals: child should be outside the flat tree expected 0 but got 441 +FAIL has a shadow tree with no slots assert_equals: child should be outside the flat tree expected 0 but got 442 +PASS has a shadow tree with slot +PASS has a shadow tree with slot +PASS has a shadow tree with slot +PASS
    has a shadow tree with slot +PASS
    has a shadow tree with slot + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom.html new file mode 100644 index 000000000000..ce2650394a28 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom.html @@ -0,0 +1,53 @@ + +Internal shadow trees + + + + + + + + + + + +
    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-expected.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-expected.html new file mode 100644 index 000000000000..622909c0eef0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-expected.html @@ -0,0 +1,20 @@ + + +Select label, appearance modes + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-ref.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-ref.html new file mode 100644 index 000000000000..622909c0eef0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-ref.html @@ -0,0 +1,20 @@ + + +Select label, appearance modes + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance.html b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance.html new file mode 100644 index 000000000000..4bf83567505b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance.html @@ -0,0 +1,40 @@ + + + +Select label, appearance modes + + + + + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/w3c-import.log index 656fddac46dc..0240a88866e4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/w3c-import.log @@ -37,6 +37,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-invalidation-expected.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-invalidation-ref.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-invalidation.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-expected.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance-ref.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-label-appearance.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-size-001-expected.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-size-001.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/the-select-element/select-size-002-expected.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/w3c-import.log index bf3b1b5581dc..ce4e82ba5ebb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/w3c-import.log @@ -86,6 +86,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/input-time-content-size-ref.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/input-time-content-size.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/select-wrap-no-spill.optional.html +/LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/shadow-dom.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/text-control-client-width.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/text-control-flow-root-expected.html /LayoutTests/imported/w3c/web-platform-tests/html/rendering/widgets/text-control-flow-root-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange-expected.txt index e7e3195abd03..99e63355156f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange-expected.txt @@ -4,9 +4,15 @@ PASS setting audio.muted fires volumechange PASS setting audio.volume/muted to the same value does not fire volumechange PASS setting audio.volume/muted repeatedly fires volumechange repeatedly PASS setting audio.volume/muted before load will not fire volumechange +PASS adding/removing audio muted content attribute will not fire volumechange +PASS setting audio.muted to false when false by default will not fire volumechange +FAIL setting audio.muted to true when true by default will not fire volumechange assert_unreached: Reached unreachable code PASS setting video.volume fires volumechange PASS setting video.muted fires volumechange PASS setting video.volume/muted to the same value does not fire volumechange PASS setting video.volume/muted repeatedly fires volumechange repeatedly PASS setting video.volume/muted before load will not fire volumechange +PASS adding/removing video muted content attribute will not fire volumechange +PASS setting video.muted to false when false by default will not fire volumechange +FAIL setting video.muted to true when true by default will not fire volumechange assert_unreached: Reached unreachable code diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange.html b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange.html index cff6cd16602e..e2f6f4e2dfb3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/event_volumechange.html @@ -76,6 +76,47 @@ t.done(); }, 1000); }, "setting " + tagName + ".volume/muted before load will not fire volumechange"); + + async_test(function(t) { + var e = document.createElement(tagName); + e.onvolumechange = t.unreached_func(); + assert_false(e.muted); + e.setAttribute('muted', ''); + assert_true(e.muted); + e.removeAttribute('muted'); + assert_false(e.muted); + // Despite e.muted changing (twice), no volumechange event. + t.step_timeout(() => { + t.done(); + }, 1000); + }, "adding/removing " + tagName + " muted content attribute will not fire volumechange"); + + async_test(function(t) { + var e = document.createElement(tagName); + e.onvolumechange = t.unreached_func(); + // This changes the internal muted state from default to false, but the IDL + // attribute value doesn't change, so no volumechange event. + assert_false(e.muted); + e.muted = false; + assert_false(e.muted); + t.step_timeout(() => { + t.done(); + }, 1000); + }, "setting " + tagName + ".muted to false when false by default will not fire volumechange"); + + async_test(function(t) { + var e = document.createElement(tagName); + e.onvolumechange = t.unreached_func(); + e.setAttribute('muted', ''); + // This changes the internal muted state from default to true, but the IDL + // attribute value doesn't change, so no volumechange event. + assert_true(e.muted); + e.muted = true; + assert_true(e.muted); + t.step_timeout(() => { + t.done(); + }, 1000); + }, "setting " + tagName + ".muted to true when true by default will not fire volumechange"); } volumechange_test("audio"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-expected.html b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-expected.html index cbbb337a93fd..8354041eb2a0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-expected.html @@ -24,7 +24,7 @@ }
    -